### [关于微信支付小程序v3【附PHP完整后端代码】](https://www.prosaas.cn/article/16394) **Published:** 2021-07-15T05:44:39 **Author:** 5201314 **Excerpt:** 微信支付 小程序 (v3)- PHP 完整后端代码踩坑太多,不多说,直接上完整后端代码 查询订单是否支付完成 … 微信支付 小程序 (v3)- PHP 完整后端代码 # **踩坑太多,不多说,直接上完整后端代码** $appid,'timestamp'=>$timeStamp,'package'=>'prepay\_id='.$ret,'paySign'=>$str); exit(json\_encode($arr)); } $set\_body = '支付测试';//支付显示内容 $price = '1';//支付金额 $out\_trade\_no = $data\_s\['out\_trade\_no'\];//订单号 $timeStamp = $data\_s\['timeStamp'\];//时间戳 $openid = $data\_s\['openid'\]; $noncestr = $data\_s\['nonceStr'\]; wechartAddOrder($set\_body,$out\_trade\_no,$price,$openid,$timeStamp,$noncestr); //微信支付签名 function getSign($data=array(),$url,$randstr,$time){ $str = "POST"."\\n".$url."\\n".$time."\\n".$randstr."\\n".$data."\\n"; $key = file\_get\_contents('apiclient\_key.pem');//在商户平台下载的秘钥 $str = getSha256WithRSA($str,$key); return $str; } //调起支付的签名 function getWechartSign($appid,$timeStamp,$noncestr,$prepay\_id){ $str = $appid."\\n".$timeStamp."\\n".$noncestr."\\n".$prepay\_id."\\n"; $key = file\_get\_contents('apiclient\_key.pem'); $str = getSha256WithRSA($str,$key); return $str; } function getSha256WithRSA($content, $privateKey){ $binary\_signature = ""; $algo = "SHA256"; openssl\_sign($content, $binary\_signature, $privateKey, $algo); $sign = base64\_encode($binary\_signature); return $sign; } /\* PHP CURL HTTPS POST \*/ function curl\_post\_https($url,$data,$header){ // 模拟提交数据函数 $curl = curl\_init(); // 启动一个CURL会话 curl\_setopt($curl, CURLOPT\_URL, $url); // 要访问的地址 curl\_setopt($curl, CURLOPT\_SSL\_VERIFYPEER, 0); // 对认证证书来源的检查 curl\_setopt($curl, CURLOPT\_SSL\_VERIFYHOST, 1); // 从证书中检查SSL加密算法是否存在 curl\_setopt($curl, CURLOPT\_USERAGENT, $\_SERVER\['HTTP\_USER\_AGENT'\]); // 模拟用户使用的浏览器 curl\_setopt($curl, CURLOPT\_FOLLOWLOCATION, 1); // 使用自动跳转 curl\_setopt($curl, CURLOPT\_AUTOREFERER, 1); // 自动设置Referer curl\_setopt($curl, CURLOPT\_POST, 1); // 发送一个常规的Post请求 curl\_setopt($curl, CURLOPT\_POSTFIELDS, $data); // Post提交的数据包 curl\_setopt($curl, CURLOPT\_TIMEOUT, 30); // 设置超时限制防止死循环 curl\_setopt($curl, CURLOPT\_HEADER, 0); // 显示返回的Header区域内容 curl\_setopt($curl, CURLOPT\_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回 curl\_setopt($curl, CURLOPT\_HTTPHEADER, $header); $tmpInfo = curl\_exec($curl); // 执行操作 if (curl\_errno($curl)) { echo 'Errno'.curl\_error($curl);//捕抓异常 } curl\_close($curl); // 关闭CURL会话 return $tmpInfo; // 返回数据,json格式 } # 查询订单是否支付完成 header('Content-type:text/html; Charset=utf-8'); ini\_set('date.timezone','Asia/Shanghai'); $data\_s = file\_get\_contents('php://input'); $data\_s = json\_decode($data\_s,true); if(empty($data\_s\['out\_trade\_no'\])){ exit; } $out\_trade\_no = $data\_s\['out\_trade\_no'\];//订单号 $merchant\_id = '商户ID';//商户ID $mch\_private\_key = file\_get\_contents('apiclient\_key.pem');//在商户平台下载的秘钥 $xlid = '微信支付公钥序列号';//秘钥序列号 可在这个网址中查询 https://myssl.com/cert\_decode.html $url = 'https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/'.$out\_trade\_no.'?mchid='.$merchant\_id; $url\_parts = parse\_url($url); $http\_method = 'GET'; $timestamp = time(); $nonce = md5(time().$out\_trade\_no); $body = ''; $canonical\_url = ($url\_parts\['path'\] . (!empty($url\_parts\['query'\]) ? "?${url\_parts\['query'\]}" : "")); $message = $http\_method."\\n". $canonical\_url."\\n". $timestamp."\\n". $nonce."\\n". $body."\\n"; openssl\_sign($message, $raw\_sign, $mch\_private\_key, 'sha256WithRSAEncryption'); $sign = base64\_encode($raw\_sign); $schema = 'WECHATPAY2-SHA256-RSA2048'; $token = sprintf('mchid="%s",nonce\_str="%s",timestamp="%d",serial\_no="%s",signature="%s"',$merchant\_id, $nonce, $timestamp, $xlid, $sign); $header = array( 'Content-Type:'.'application/json; charset=UTF-8', 'Accept:application/json', 'User-Agent:\*/\*', 'Authorization: WECHATPAY2-SHA256-RSA2048 '.$token ); $ret = curl\_get\_https($url,$data,$header); $return\_out\_trade\_no = get\_between($ret,'"out\_trade\_no":"','","payer"'); $return\_trade\_state = get\_between($ret,'trade\_state":"','","trade\_state\_desc"'); $arr = array('type'=>'success','trade\_state'=>$return\_trade\_state,'out\_trade\_no'=>$return\_out\_trade\_no); exit(json\_encode($arr)); /\* \* php截取指定两个字符之间字符串 \* \*/ function get\_between($input, $start, $end) { $substr = substr($input, strlen($start)+strpos($input, $start),(strlen($input) - strpos($input, $end))\*(-1)); return $substr; } /\* PHP CURL HTTPS GET \*/ function curl\_get\_https($url,$data,$header){ // 模拟提交数据函数 $curl = curl\_init(); // 启动一个CURL会话 curl\_setopt($curl, CURLOPT\_URL, $url); // 要访问的地址 curl\_setopt($curl, CURLOPT\_USERAGENT, $\_SERVER\['HTTP\_USER\_AGENT'\]); // 模拟用户使用的浏览器 curl\_setopt($curl, CURLOPT\_FOLLOWLOCATION, 1); // 使用自动跳转 curl\_setopt($curl, CURLOPT\_AUTOREFERER, 1); // 自动设置Referer curl\_setopt($curl, CURLOPT\_TIMEOUT, 30); // 设置超时限制防止死循环 curl\_setopt($curl, CURLOPT\_HEADER, 0); // 显示返回的Header区域内容 curl\_setopt($curl, CURLOPT\_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回 curl\_setopt($curl, CURLOPT\_HTTPHEADER, $header);// 头部信息 $tmpInfo = curl\_exec($curl); // 执行操作 if (curl\_errno($curl)) { echo 'Errno'.curl\_error($curl);//捕抓异常 } curl\_close($curl); // 关闭CURL会话 return $tmpInfo; // 返回数据,json格式 } 以上就是关于微信支付小程序v3【附PHP完整后端代码】的详细内容,更多请关注知企PROSAAS其它相关文章! **Categories:** 后端开发 ---