APP微信支付php后端处理

来源:互联网 发布:js实现旋转 编辑:程序博客网 时间:2024/04/30 19:41
<?phpheader("Content-type: text/html; charset=utf-8");class WxPayHelper{    /*    配置参数    */    var $config = array(        'appid'      => "",            'mch_id'     => "",           'api_key'    => "",            'notify_url' => 'http://XXXXXX/Wxpays/notify_url.php'    );    public function  __construct($appid, $mch_id, $api_key) {$this->config['appid']   = $appid;$this->config['mch_id']  = $mch_id;$this->config['api_key'] = $api_key;            }        public function getPrePayOrder($body, $out_trade_no, $total_fee){        $url = "https://api.mch.weixin.qq.com/pay/unifiedorder";        $notify_url = $this->config["notify_url"];        $onoce_str = $this->getRandChar(32);        $data["appid"]            = $this->config["appid"];        $data["body"]             = $body;        $data["mch_id"]           = $this->config['mch_id'];        $data["nonce_str"]        = $onoce_str;        $data["notify_url"]       = $notify_url;        $data["out_trade_no"]     = $out_trade_no;        $data["spbill_create_ip"] = $this->get_client_ip();        $data["total_fee"]        = $total_fee;        $data["trade_type"]       = "APP";        $s = $this->getSign($data, false);        $data["sign"] = $s;        $xml = $this->arrayToXml($data);        $response = $this->postXmlCurl($xml, $url);        return $this->xmlstr_to_array($response);    }    public function getOrder($prepayId){        $data["appid"]     = $this->config["appid"];        $data["noncestr"]  = $this->getRandChar(32);        $data["package"]   = "Sign=WXPay";        $data["partnerid"] = $this->config['mch_id'];        $data["prepayid"]  = $prepayId;        $data["timestamp"] = time();        $s = $this->getSign($data, false);        $data["sign"] = $s;        return $data;    }    function getSign($Obj)    {        foreach ($Obj as $k => $v)        {            $Parameters[strtolower($k)] = $v;        }         ksort($Parameters);        $String = $this->formatBizQueryParaMap($Parameters, false);        $String = $String."&key=".$this->config['api_key'];        $result_ = strtoupper(md5($String));        return $result_;    }    function getRandChar($length){       $str = null;       $strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";       $max = strlen($strPol)-1;       for($i=0;$i<$length;$i++){        $str.=$strPol[rand(0,$max)];       }       return $str;    }    function arrayToXml($arr)    {        $xml = "<xml>";        foreach ($arr as $key=>$val)        {             if (is_numeric($val))             {                $xml.="<".$key.">".$val."</".$key.">";              }             else                $xml.="<".$key."><![CDATA[".$val."]]></".$key.">";          }        $xml.="</xml>";        return $xml;     }    function postXmlCurl($xml,$url,$second=30)    {               //初始化curl                $ch = curl_init();        //超时时间        curl_setopt($ch,CURLOPT_TIMEOUT,$second);        //这里设置代理,如果有的话        //curl_setopt($ch,CURLOPT_PROXY, '8.8.8.8');        //curl_setopt($ch,CURLOPT_PROXYPORT, 8080);        curl_setopt($ch,CURLOPT_URL, $url);        curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,FALSE);        curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE);curl_setopt($ch,CURLOPT_VERBOSE, TRUE);        //设置header        curl_setopt($ch, CURLOPT_HEADER, FALSE);        //要求结果为字符串且输出到屏幕上        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);        //post提交方式        curl_setopt($ch, CURLOPT_POST, TRUE);        curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);        //运行curl        $data = curl_exec($ch);        //返回结果        if($data)        {            curl_close($ch);            return $data;        }        else         {             $error = curl_errno($ch);            echo "curl出错,错误码:$error"."<br>";            echo "<a href='http://curl.haxx.se/libcurl/c/libcurl-errors.html'>错误原因查询</a></br>";            curl_close($ch);            return false;        }    }        function get_client_ip()    {        if ($_SERVER['REMOTE_ADDR']) {        $cip = $_SERVER['REMOTE_ADDR'];        } elseif (getenv("REMOTE_ADDR")) {        $cip = getenv("REMOTE_ADDR");        } elseif (getenv("HTTP_CLIENT_IP")) {        $cip = getenv("HTTP_CLIENT_IP");        } else {        $cip = "unknown";        }        return $cip;    }    function formatBizQueryParaMap($paraMap, $urlencode)    {        $buff = "";        ksort($paraMap);        foreach ($paraMap as $k => $v)        {            if($urlencode)            {               $v = urlencode($v);            }            $buff .= strtolower($k) . "=" . $v . "&";        }        $reqPar;        if (strlen($buff) > 0)         {            $reqPar = substr($buff, 0, strlen($buff)-1);        }        return $reqPar;    }        function xmlstr_to_array($xmlstr) {      $doc = new DOMDocument();      $doc->loadXML($xmlstr);      return $this->domnode_to_array($doc->documentElement);    }    function domnode_to_array($node) {      $output = array();      switch ($node->nodeType) {       case XML_CDATA_SECTION_NODE:       case XML_TEXT_NODE:        $output = trim($node->textContent);       break;       case XML_ELEMENT_NODE:        for ($i=0, $m=$node->childNodes->length; $i<$m; $i++) {         $child = $node->childNodes->item($i);         $v = $this->domnode_to_array($child);         if(isset($child->tagName)) {           $t = $child->tagName;           if(!isset($output[$t])) {            $output[$t] = array();           }           $output[$t][] = $v;         }         elseif($v) {          $output = (string) $v;         }        }        if(is_array($output)) {         if($node->attributes->length) {          $a = array();          foreach($node->attributes as $attrName => $attrNode) {           $a[$attrName] = (string) $attrNode->value;          }          $output['@attributes'] = $a;         }         foreach ($output as $t => $v) {          if(is_array($v) && count($v)==1 && $t!='@attributes') {           $output[$t] = $v[0];          }         }        }       break;      }      return $output;    }}?>

0 0
原创粉丝点击