微信支付统一下单,用PHP怎么实现?(代码全)

互联网 18-7-26
H5支付时出现“签名错误”怎么办?注意调用微信“统一下单”接口后返回pre_pay_id后,需要用户再次进行签名返回给HTML; “支付目录没有授权”,进入微信商家管理后台设置即可。

一、Model层,Wxpay.php

<?php namespace app\common\model; class Wxpay {     private $appid = 'wxe8*****d4';                            //微信公众号appid     private $secret = '37c4*******5f0';                        //微信公众号appsecret                    private $mchid = '13******02';                             //商家号     private $key = '5363e******49e8';                          //支付密钥     private $sslcert_path = 'apiclient_cert.pem';              //证书所在绝对路径     private $sslkey_path = 'apiclient_key.pem';                //证书所在绝对路径          public function __construct($appid = '', $secret = '', $mchid = '', $key = '')     {         if(!empty($appid))     $this->appid = $appid;         if(!empty($secret))    $this->secret = $secret;         if(!empty($mchid))     $this->mchid  = $mchid;         if(!empty($key))       $this->key= $key;     }     /*      * 微信内H5调起支付      * @params string $openid : 微信用户openid      * @params string $out_trade_no : 商家生成的订单号(唯一性)      * @params int $total_fee : 支付金额,单位分      * return array $ret : 返回支付时所需要的数据      * */     public function payForWeixin($openid,$out_trade_no,$total_fee,$attach='微信支付',$body='微信支付')     {         //支付数据         $data['openid'] = $openid;         $data['out_trade_no'] = $out_trade_no;         $data['total_fee'] = $total_fee*100;         $data['spbill_create_ip'] = $_SERVER["REMOTE_ADDR"];         $data['attach'] = $attach;         $data['body'] = $body;         $data['appid'] = $this->appid;         $data['mch_id'] = $this->mchid;         $data['nonce_str'] = random(12);         $data['trade_type'] = "JSAPI";         $data['notify_url'] = "http://****.com/home/wxpaynofiy/notify.html";          $sign = $this->getParam($data);         $dataXML = "<xml>            <appid>".$data['appid']."</appid>            <attach>".$data['attach']."</attach>            <body>".$data['body']."</body>            <mch_id>".$data['mch_id']."</mch_id>            <nonce_str>".$data['nonce_str']."</nonce_str>            <notify_url>".$data['notify_url']."</notify_url>            <openid>".$data['openid']."</openid>            <out_trade_no>".$data['out_trade_no']."</out_trade_no>            <spbill_create_ip>".$data['spbill_create_ip']."</spbill_create_ip>            <total_fee>".$data['total_fee']."</total_fee>            <trade_type>".$data['trade_type']."</trade_type>            <sign>".$sign."</sign>         </xml>";         $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';         $result =  $this->https_post($url,$dataXML);         $ret = $this->xmlToArray($result);                  if($ret['return_code'] == 'SUCCESS' && $ret['return_msg'] == 'OK') {             return array(                 'appId'     => $this->appid,                 'timeStamp' => time(),                 'nonceStr'  => $data['nonce_str'],                 'package'   => 'prepay_id='.$ret['prepay_id'],                 'signType'  => 'MD5',                 'paySign'   => $sign             );         } else {             $this->errorLog("微信支付失败,",$ret);             return null;         }     }      /*      *   微信二维码支付      *   @params string $openid : 用户的openid      *   @params string $out_trade_no : 商户订单号      *   @params number $total_fee : 订单金额,单位分      *   return string $code_url : 二维码URL链接      */     public function payForQrcode($out_trade_no,$total_fee,$body="魔盒CMS",$attach="微信支付")     {         //支付数据         $data['out_trade_no'] = $out_trade_no;         $data['total_fee'] = $total_fee*100;         $data['spbill_create_ip'] = $_SERVER["REMOTE_ADDR"];         $data['attach'] = $attach;         $data['body'] = $body;         $data['appid'] = $this->appid;         $data['mch_id'] = $this->mchid;         $data['nonce_str'] = random(12);         $data['trade_type'] = "NATIVE";         $data['notify_url'] = "http://****.com/home/wxpaynofiy/notify.html";          $sign = $this->getParam($data);         $dataXML = "<xml>            <appid>".$data['appid']."</appid>            <attach>".$data['attach']."</attach>            <body>".$data['body']."</body>            <mch_id>".$data['mch_id']."</mch_id>            <nonce_str>".$data['nonce_str']."</nonce_str>            <notify_url>".$data['notify_url']."</notify_url>            <out_trade_no>".$data['out_trade_no']."</out_trade_no>            <spbill_create_ip>".$data['spbill_create_ip']."</spbill_create_ip>            <total_fee>".$data['total_fee']."</total_fee>            <trade_type>".$data['trade_type']."</trade_type>            <sign>".$sign."</sign>         </xml>";         $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder';         $result =  $this->https_post($url,$dataXML);         $ret = $this->xmlToArray($result);         if($ret['return_code'] == 'SUCCESS' && $ret['return_msg'] == 'OK') {             return $ret['code_url'];         } else {             $this->errorLog("获取微信支付二维码失败,",$ret);             return null;         }     }      /*      * 订单查询      * @params string $transaction_id : 微信订单号      * @params string $out_trade_no : 商家订单号(与微信订单号二选一)      * */     public function findOrder($out_trade_no)     {         $data['appid'] = $this->appid;         $data['mch_id'] = $this->mchid;         $data['nonce_str'] = random(12);         $data['out_trade_no'] = $out_trade_no;         $sign = $this->getParam($data);         $dataXML = "<xml>             <appid>".$data['appid']."</appid>             <mch_id>".$data['mch_id']."</mch_id>             <nonce_str>".$data['nonce_str']."</nonce_str>             <out_trade_no>".$data['out_trade_no']."</out_trade_no>             <sign>".$sign."</sign>          </xml>";         $url = 'https://api.mch.weixin.qq.com/pay/orderquery';         $result =  $this->https_post($url,$dataXML);         $ret = $this->xmlToArray($result);         if($ret['return_code'] == 'SUCCESS' && $ret['return_msg'] == 'OK') {             return $ret;         } else {             $this->errorLog("查询微信支付订单失败,",$ret);             return null;         }     }     /*     * 退款订单查询     * @params string $transaction_id : 微信订单号     * @params string $out_trade_no : 商家订单号(与微信订单号二选一)     * */     public function findRefundOrder($out_trade_no)     {         $data['appid'] = $this->appid;         $data['mch_id'] = $this->mchid;         $data['nonce_str'] = random(12);         $data['out_trade_no'] = $out_trade_no;         $sign = $this->getParam($data);         $dataXML = "<xml>             <appid>".$data['appid']."</appid>             <mch_id>".$data['mch_id']."</mch_id>             <nonce_str>".$data['nonce_str']."</nonce_str>             <out_trade_no>".$data['out_trade_no']."</out_trade_no>             <sign>".$sign."</sign>          </xml>";         $url = 'https://api.mch.weixin.qq.com/pay/refundquery';         $result =  $this->https_post($url,$dataXML);         $ret = $this->xmlToArray($result);         if($ret['return_code'] == 'SUCCESS' && $ret['return_msg'] == 'OK') {             return $ret;         } else {             $this->errorLog("查询微信支付退款订单失败,",$ret);             return $ret['err_code_des'];         }     }     /*      * 申请退款      * @params string $out_trade_no : 商户订单号      * @params string $out_refund_no : 商户退款单号      * @params int $total_fee : 订单金额      * @params int $refund_fee : 退款金额      * @params string $refund_desc : 退款原因      * */     public function refund($out_trade_no,$out_refund_no,$total_fee,$refund_fee,$refund_desc='退款')     {         $data['appid']  = $this->appid;         $data['mch_id'] = $this->mchid;         $data['nonce_str'] = random(12);         $data['out_trade_no'] = $out_trade_no;         $data['out_refund_no'] = $out_refund_no;         $data['total_fee'] = $total_fee*100;         $data['refund_fee'] = $refund_fee*100;         $data['refund_desc'] = $refund_desc;         $data['notify_url'] = "http://*****.com/home/wxpaynofiy/refund.html";         $sign = $this->getParam($data);         $dataXML = "<xml>            <appid>".$data['appid']."</appid>            <mch_id>".$data['mch_id']."</mch_id>            <nonce_str>".$data['nonce_str']."</nonce_str>            <out_trade_no>".$data['out_trade_no']."</out_trade_no>            <out_refund_no>".$data['out_refund_no']."</out_refund_no>            <total_fee>".$data['total_fee']."</total_fee>            <refund_fee>".$data['refund_fee']."</refund_fee>            <refund_desc>".$data['refund_desc']."</refund_desc>            <notify_url>".$data['notify_url']."</notify_url>            <sign>".$sign."</sign>         </xml>";         $url = 'https://api.mch.weixin.qq.com/secapi/pay/refund';         $result =  $this->https_post($url,$dataXML,true);         $ret = $this->xmlToArray($result);         if($ret['return_code'] == 'SUCCESS' && $ret['return_msg'] == 'OK') {             return $ret;         } else {             $this->errorLog("微信退款失败,",$ret);             return null;         }     }     /*      * 企业付款至用户零钱      * @params string $openid : 用户openid      * @params int $total_fee : 付款金额,单位分      * @params string $out_trade_no : 商家订单号      * @params string $username : 微信用户名称(注意微信昵称若为空时支付会出错)      * @params string $desc : 付款描述      * @params string $check_name : 是否检测用户名      * */     public function payForUser($openid,$total_fee,$out_trade_no,$username='魔盒CMS',$desc='魔盒CMS付款给用户',$check_name='NO_CHECK')     {         $data['amount'] = $total_fee*100;         $data['check_name'] = $check_name;         $data['desc'] = $desc;         $data['mch_appid'] = $this->appid;         $data['mchid'] = $this->mchid;         $data['nonce_str'] = random(12);         $data['openid'] = $openid;         $data['partner_trade_no'] = $out_trade_no;         $data['re_user_name'] = $username;         $data['spbill_create_ip'] = $_SERVER["REMOTE_ADDR"];         $sign = $this->getParam($data);          $dataXML="<xml>         <mch_appid>".$data['mch_appid']."</mch_appid>         <mchid>".$data['mchid']."</mchid>         <nonce_str>".$data['nonce_str']."</nonce_str>         <partner_trade_no>".$data['partner_trade_no']."</partner_trade_no>         <openid>".$data['openid']."</openid>         <check_name>".$data['check_name']."</check_name>         <re_user_name>".$data['re_user_name']."</re_user_name>         <amount>".$data['amount']."</amount>         <desc>".$data['desc']."</desc>         <spbill_create_ip>".$data['spbill_create_ip']."</spbill_create_ip>         <sign>".$sign."</sign>         </xml>";          $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers';         $result =  $this->https_post($url,$dataXML,true);         $ret = $this->xmlToArray($result);         if($ret['return_code']=='SUCCESS' && $ret['result_code'] == 'SUCCESS')         {             //支付成功返回商户订单号、微信订单号、微信支付成功时间             $result['partner_trade_no'] = $ret['partner_trade_no'];             $result['payment_no'] = $ret['payment_no'];             $result['payment_time'] = $ret['payment_time'];             return $ret;         } else {            $this->errorLog('付款给用户失败',$ret);            return null;         }     }      /*      * 普通红包      * @params string $out_trade_no : 商家订单号      * @params string $openid : 接收红包用户的openid      * @params int $total_fee : 红包金额,单位分      * @params int $total_num : 红包发放总人数      * @params string $wishing : 红包祝福语      * @params string $act_name : 活动名称      * @params string $remark : 备注      * @params string $scene_id :场景值ID。发放红包使用场景,红包金额大于200或者小于1元时必传。PRODUCT_1:商品促销、PRODUCT_2:抽奖、PRODUCT_3:虚拟物品兑奖 、PRODUCT_4:企业内部福利、PRODUCT_5:渠道分润、PRODUCT_6:保险回馈、PRODUCT_7:彩票派奖、PRODUCT_8:税务刮奖      * */     public function redPack($openid,$total_fee,$out_trade_no,$total_num = 1,$wishing = '感谢您光临***平台进行购物',$act_name='***购物发红包',$remark = '购物领红包')     {         $data['mch_billno']     = $out_trade_no;         $data['mch_id']         = $this->mchid;         $data['wxappid']        = $this->appid;         $data['send_name']      = '发送红包者的名称';         $data['re_openid']      = $openid;         $data['total_amount']   = $total_fee;         $data['total_num']      = $total_num;         $data['wishing']        = $wishing;         $data['client_ip']      = $_SERVER["REMOTE_ADDR"];         $data['act_name']       = $act_name;         $data['remark']         = $remark;         $data['nonce_str']      = random(12);         $sign = $this->getParam($data);          $dataXML="<xml>         <sign>".$sign."</sign>         <mch_billno>".$data['mch_billno']."</mch_billno>         <mch_id>".$data['mch_id']."</mch_id>         <wxappid>".$data['wxappid']."</wxappid>         <send_name>".$data['send_name']."</send_name>         <re_openid>".$data['re_openid']."</re_openid>         <total_amount>".$data['total_amount']."</total_amount>         <total_num>".$data['total_num']."</total_num>         <wishing>".$data['wishing']."</wishing>         <client_ip>".$data['client_ip']."</client_ip>         <act_name>".$data['act_name']."</act_name>         <remark>".$data['remark']."</remark>         <nonce_str>".$data['nonce_str']."</nonce_str>         </xml>";          $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack';         $result =  $this->https_post($url,$dataXML,true);         $ret = $this->xmlToArray($result);         if($ret['return_code']=='SUCCESS' && $ret['result_code'] == 'SUCCESS')         {             return $ret;         } else {             $this->errorLog('发放普通红包失败',$ret);             return $ret['err_code_des'];         }      }      /*     * 裂变红包:一次可以发放一组红包。首先领取的用户为种子用户,种子用户领取一组红包当中的一个,并可以通过社交分享将剩下的红包给其他用户。      * 裂变红包充分利用了人际传播的优势。     * @params string $out_trade_no : 商家订单号     * @params string $openid : 接收红包用户的openid     * @params int $total_fee : 红包金额,单位分     * @params int $total_num : 红包发放总人数     * @params string $wishing : 红包祝福语     * @params string $act_name : 活动名称     * @params string $remark : 备注     * @params string $scene_id :场景值ID。发放红包使用场景,红包金额大于200或者小于1元时必传。PRODUCT_1:商品促销、PRODUCT_2:抽奖、PRODUCT_3:虚拟物品兑奖 、PRODUCT_4:企业内部福利、PRODUCT_5:渠道分润、PRODUCT_6:保险回馈、PRODUCT_7:彩票派奖、PRODUCT_8:税务刮奖     * */     public function redPackGroup($openid,$total_fee,$out_trade_no,$total_num,$wishing = '感谢您光临***进行购物',$act_name='**购物发红包',$remark = '购物领红包')     {         $data['mch_billno']     = $out_trade_no;         $data['mch_id']         = $this->mchid;         $data['wxappid']        = $this->appid;         $data['send_name']      = '发送红包者的名称';         $data['re_openid']      = $openid;         $data['total_amount']   = $total_fee;         $data['amt_type']       = 'ALL_RAND';   //ALL_RAND—全部随机,商户指定总金额和红包发放总人数,由微信支付随机计算出各红包金额         $data['total_num']      = $total_num;         $data['wishing']        = $wishing;         $data['client_ip']      = $_SERVER["REMOTE_ADDR"];         $data['act_name']       = $act_name;         $data['remark']         = $remark;         $data['nonce_str']      = random(12);         $sign = $this->getParam($data);          $dataXML="<xml>         <sign>".$sign."</sign>         <mch_billno>".$data['mch_billno']."</mch_billno>         <mch_id>".$data['mch_id']."</mch_id>         <wxappid>".$data['wxappid']."</wxappid>         <send_name>".$data['send_name']."</send_name>         <re_openid>".$data['re_openid']."</re_openid>         <total_amount>".$data['total_amount']."</total_amount>         <amt_type>".$data['amt_type']."</amt_type>          <total_num>".$data['total_num']."</total_num>         <wishing>".$data['wishing']."</wishing>         <client_ip>".$data['client_ip']."</client_ip>         <act_name>".$data['act_name']."</act_name>         <remark>".$data['remark']."</remark>         <nonce_str>".$data['nonce_str']."</nonce_str>         </xml>";          $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/sendgroupredpack';         $result =  $this->https_post($url,$dataXML,true);         $ret = $this->xmlToArray($result);         if($ret['return_code']=='SUCCESS' && $ret['result_code'] == 'SUCCESS')         {             return $ret;         } else {             $this->errorLog('发放裂变红包失败',$ret);             return $ret['err_code_des'];         }      }     /*      * 查询红包记录      * @params string $out_trade_no : 商家订单号      * */     public function findRedPack($out_trade_no)     {         $data['mch_billno']     = $out_trade_no;         $data['mch_id']         = $this->mchid;         $data['appid']          = $this->appid;         $data['bill_type']      = 'MCHT';           //MCHT:通过商户订单号获取红包信息。         $data['nonce_str']      = random(12);         $sign = $this->getParam($data);          $dataXML="<xml>         <sign>".$sign."</sign>         <mch_billno>".$data['mch_billno']."</mch_billno>         <mch_id>".$data['mch_id']."</mch_id>         <appid>".$data['appid']."</appid>         <bill_type>".$data['bill_type']."</bill_type>          <nonce_str>".$data['nonce_str']."</nonce_str>         </xml>";          $url = 'https://api.mch.weixin.qq.com/mmpaymkttransfers/gethbinfo';         $result =  $this->https_post($url,$dataXML,true);         $ret = $this->xmlToArray($result);         if($ret['return_code']=='SUCCESS' && $ret['result_code'] == 'SUCCESS')         {             return $ret;         } else {             $this->errorLog('查询红包记录失败',$ret);             return $ret['err_code_des'];         }     }     /*      * 获取用户微信的OPENID      * */     public function openid($c=false)     {         if($_GET['state']!="zgm"){             $t = $c ? "snsapi_userinfo" : "snsapi_base";             $url=urlencode(get_url());             $url="https://open.weixin.qq.com/connect/oauth2/authorize?appid=".$this->appid."&redirect_uri=".$url."&response_type=code&scope=".$t."&state=zgm#wechat_redirect";             echo "<html><script>window.location.href='$url';</script></html>";             exit;         }         if($_GET['code']){             $url="https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$this->appid."&secret=".$this->secret."&code=".$_GET['code']."&grant_type=authorization_code";             $wx_db=json_decode($this->https_get($url));             if($c){                 $url_2="https://api.weixin.qq.com/sns/userinfo?access_token=".$wx_db->access_token."&openid=".$wx_db->openid."&lang=zh_CN";                 $db=json_decode($this->https_get($url_2));                 return $db;             }else{                 return $wx_db->openid;             }         }     }     /*     * 发起网络GET请求     * @params string $url : URL链接     */     private function https_get($url)     {         $curl = curl_init();         curl_setopt($curl, CURLOPT_URL, $url);         curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);          curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);          curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);          curl_setopt($curl, CURLOPT_HEADER, FALSE) ;          curl_setopt($curl, CURLOPT_TIMEOUT,60);            if (curl_errno($curl)) {             return 'Errno'.curl_error($curl);         }         else{$result=curl_exec($curl);}         curl_close($curl);         return $result;     }     //对参数排序,生成MD5加密签名     private function getParam($paramArray, $isencode=false)     {         $paramStr = '';         ksort($paramArray);         $i = 0;         foreach ($paramArray as $key => $value)         {             if ($key == 'Signature'){                 continue;             }             if ($i == 0){                 $paramStr .= '';             }else{                 $paramStr .= '&';             }             $paramStr .= $key . '=' . ($isencode?urlencode($value):$value);             ++$i;         }         $stringSignTemp=$paramStr."&key=".$this->key;         $sign=strtoupper(md5($stringSignTemp));         return $sign;     }     //POST提交数据     private function https_post($url,$data,$ssl = false)     {         $ch = curl_init ();         curl_setopt ( $ch, CURLOPT_URL, $url );         curl_setopt ( $ch, CURLOPT_CUSTOMREQUEST, "POST" );         curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, FALSE );         curl_setopt ( $ch, CURLOPT_SSL_VERIFYHOST, FALSE );         if($ssl) {             curl_setopt ( $ch,CURLOPT_SSLCERT,$this->sslcert_path);             curl_setopt ( $ch,CURLOPT_SSLKEY,$this->sslkey_path);         }         curl_setopt ( $ch, CURLOPT_FOLLOWLOCATION, 1 );         curl_setopt ( $ch, CURLOPT_AUTOREFERER, 1 );         curl_setopt ( $ch, CURLOPT_POSTFIELDS, $data );         curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );         $result = curl_exec($ch);         if (curl_errno($ch)) {             return 'Errno: '.curl_error($ch);         }         curl_close($ch);         return $result;     }     /*     * XML转array     * @params xml $xml : xml 数据     * return array $data : 转义后的array数组     */     private function xmlToArray($xml)     {         libxml_disable_entity_loader(true);         $xmlstring = simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA);         $val = json_decode(json_encode($xmlstring),true);         return $val;     }     /*     * 记录日志     * @params string $msg : 提示语句     * @params array $ret : 错误结果     */     private function errorLog($msg,$ret)     {         file_put_contents(ROOT_PATH . 'runtime/error/wxpay.log', "[" . date('Y-m-d H:i:s') . "] ".$msg."," .json_encode($ret).PHP_EOL, FILE_APPEND);     } }

二、Controller层,Test.php

<?php namespace app\goods\controller; use app\common\model\Wxpay; class Test {     /*     * 调用微信支付     * 一、获取微信用户的openid;      * 二、调用微信支付接口     * 三、生成H5中使用的签名内容     */     public function wx()     {         $wxpay = new Wxpay();         $openid = $wxpay->openid();         $pay = $wxpay->payForWeixin($openid,date('YmdHis').rand(1,5),'0.1');         $paySign =strtoupper(MD5('appId='.$pay['appId'].'&nonceStr='.$pay['nonceStr'].'&package='.$pay['package'].'&signType=MD5&timeStamp='.$pay['timeStamp'].'&key=536*****9e8'));          $h5 = array(             'appId'     => $pay['appId'],             'timeStamp' => $pay['timeStamp'],             'nonceStr'  => $pay['nonceStr'],             'package'   => $pay['package'],             'signType'  => $pay['signType'],             'paySign'   => $paySign         );         $this->assign('wxpay',$h5);         return view();     } }

三、HTML中调用微信支付,wx.html

<!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8">     <title>订单示例</title> </head> <body>  <script type="text/javascript">     function onBridgeReady(){         WeixinJSBridge.invoke(             'getBrandWCPayRequest', {                 "appId":"{$wxpay['appId']}",                 "timeStamp":"{$wxpay['timeStamp']}",                 "nonceStr":"{$wxpay['nonceStr']}",                 "package":"{$wxpay['package']}",                 "signType":"MD5",                 "paySign":"{$wxpay['paySign']}"             },             function(res){                 if(res.err_msg == "get_brand_wcpay_request:ok" ){                     // 使用以上方式判断前端返回,微信团队郑重提示:                     //res.err_msg将在用户支付成功后返回ok,但并不保证它绝对可靠。                 }             });     }     if (typeof WeixinJSBridge == "undefined"){         if( document.addEventListener ){             document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);         }else if (document.attachEvent){             document.attachEvent('WeixinJSBridgeReady', onBridgeReady);             document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);         }     }else{         onBridgeReady();     } </script> </body> </html>

四、接收微信支付返回结果,支付时设置的notify_url值,确保此链接外网能访问。wxpaynofiy.php

<?php namespace app\home\controller; class Wxpaynofiy {      public function notify()     {         $xml = isset($GLOBALS["HTTP_RAW_POST_DATA"]) ? $GLOBALS['HTTP_RAW_POST_DATA'] : file_get_contents("php://input");         $data = xmlToArray($xml);         if($data['return_code'] == 'SUCCESS' && $data['result_code'] == 'SUCCESS'){             if($this->checkSign($data)) {                 $transaction_id = $data['transaction_id'];      //微信支付订单号                 $out_trade_no   = $data['out_trade_no'];        //商家订单号                 $this->errorLog('微信支付返回结果,微信支付订单号:'.$transaction_id.',商家订单号:'.$out_trade_no,[]);              } else {                 $this->errorLog('微信支付返回结果签名验证失败',$data);             }         } else {             $this->errorLog('微信支付返回结果',$data);         }         echo '<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';     }      /*      * 验证签名      * @params array $result : 微信支付成功返回的结果数组      * return bool $ret : 成功true,失败false      * */     private function checkSign(array $data)     {         $str = '';         ksort($data);         foreach ($data as $k => $v) {             if($k != 'sign') $str .= $k.'='.$v.'&';         }         $temp = $str . 'key=5363******49e8';     //key:商户支付密钥         $sign = strtoupper(md5($temp));         return $sign == $data['sign'] ? true : false;     }      private function errorLog($msg,$ret)     {         file_put_contents(ROOT_PATH . 'runtime/error/wxpaynofiy.log', "[" . date('Y-m-d H:i:s') . "] ".$msg."," .json_encode($ret).PHP_EOL, FILE_APPEND);     } }

微信支付与支付宝支付整合 PHP实现

PHP如何实现微信支付

视频教程 :php微信接口开发实战项目聊天机器人+微信支付

以上就是微信支付统一下单,用PHP怎么实现?(代码全)的详细内容,更多内容请关注技术你好其它相关文章!

来源链接:
免责声明:
1.资讯内容不构成投资建议,投资者应独立决策并自行承担风险
2.本文版权归属原作所有,仅代表作者本人观点,不代表本站的观点或立场
标签: 微信支付
上一篇:php获取远程图片并下载保存到本地的方法分析 下一篇:还是代码好用,几步就能判断用户是否已关注公众号

相关资讯