### [小程序怎么实现微信支付](https://www.prosaas.cn/article/16759) **Published:** 2020-03-30T03:24:04 **Author:** 5201314 **Excerpt:** 小程序实现微信支付的方法:前期准备:1.开通了微信支付,并且小程序绑定了微信支付;2.准备好小程序的appid… ![](https://img.php.cn/upload/article/000/000/039/5e8164265a3e4980.jpg) 小程序实现微信支付的方法: 前期准备: 1.开通了微信支付,并且小程序绑定了微信支付; 2.准备好小程序的appid,微信支付的商户号,支付秘钥。 商户系统和微信支付系统主要交互: 1、小程序内调用登录接口,获取到用户的openid 2、调用商户服务器支付统一下单接口,进行预支付 /\*\* \* 预支付请求接口(POST) \* @param string $openid openid \* @param string $body 商品简单描述 \* @param string $order\_sn 订单编号 \* @param string $total\_fee 金额 \* @return json的数据 \*/ public function prepay(){ $config = $this->config; $openid = I('post.openid'); $body = I('post.body'); $order\_sn = I('post.order\_sn'); $total\_fee = I('post.total\_fee'); //统一下单参数构造 $unifiedorder = array( 'appid' => $config\['appid'\], 'mch\_id' => $config\['pay\_mchid'\], 'nonce\_str' => self::getNonceStr(), 'body' => $body, 'out\_trade\_no' => $order\_sn, 'total\_fee' => $total\_fee \* 100, 'spbill\_create\_ip' => get\_client\_ip(), 'notify\_url' => 'https://'.$\_SERVER\['HTTP\_HOST'\].'/Api/Wxpay/notify', 'trade\_type' => 'JSAPI', 'openid' => $openid ); $unifiedorder\['sign'\] = self::makeSign($unifiedorder); //请求数据 $xmldata = self::array2xml($unifiedorder); $url = 'https://api.mch.weixin.qq.com/pay/unifiedorder'; $res = self::curl\_post\_ssl($url, $xmldata); if(!$res){ self::return\_err("Can't connect the server"); } // 这句file\_put\_contents是用来查看服务器返回的结果 测试完可以删除了 //file\_put\_contents(APP\_ROOT.'/Statics/log1.txt',$res,FILE\_APPEND); $content = self::xml2array($res); if(strval($content\['result\_code'\]) == 'FAIL'){ self::return\_err(strval($content\['err\_code\_des'\])); } if(strval($content\['return\_code'\]) == 'FAIL'){ self::return\_err(strval($content\['return\_msg'\])); } self::return\_data(array('data'=>$content)); //$this->ajaxReturn($content); } 3、调用商户服务器再次签名接口,返回支付数据 /\*\* \* 进行支付接口(POST) \* @param string $prepay\_id 预支付ID(调用prepay()方法之后的返回数据中获取) \* @return json的数据 \*/ public function pay(){ $config = $this->config; $prepay\_id = I('post.prepay\_id'); $data = array( 'appId' => $config\['appid'\], 'timeStamp' => time(), 'nonceStr' => self::getNonceStr(), 'package' => 'prepay\_id='.$prepay\_id, 'signType' => 'MD5' ); $data\['paySign'\] = self::makeSign($data); $this->ajaxReturn($data); } 4、小程序内完成支付,商户服务器接收支付回调通知 小程序端代码: wx.requestPayment({ 'timeStamp': '', 'nonceStr': '', 'package': '', 'signType': 'MD5', 'paySign': '', 'success':function(res){ }, 'fail':function(res){ } }) 服务器回调通知: //微信支付回调验证 public function notify(){ $xml = $GLOBALS\['HTTP\_RAW\_POST\_DATA'\]; // 这句file\_put\_contents是用来查看服务器返回的XML数据 测试完可以删除了 //file\_put\_contents(APP\_ROOT.'/Statics/log2.txt',$res,FILE\_APPEND); //将服务器返回的XML数据转化为数组 $data = self::xml2array($xml); // 保存微信服务器返回的签名sign $data\_sign = $data\['sign'\]; // sign不参与签名算法 unset($data\['sign'\]); $sign = self::makeSign($data); // 判断签名是否正确 判断支付状态 if ( ($sign===$data\_sign) && ($data\['return\_code'\]=='SUCCESS') && ($data\['result\_code'\]=='SUCCESS') ) { $result = $data; //获取服务器返回的数据 $order\_sn = $data\['out\_trade\_no'\]; //订单单号 $openid = $data\['openid'\]; //付款人openID $total\_fee = $data\['total\_fee'\]; //付款金额 $transaction\_id = $data\['transaction\_id'\]; //微信支付流水号 //更新数据库 $this->updateDB($order\_sn,$openid,$total\_fee,$transaction\_id); }else{ $result = false; } // 返回状态给微信服务器 if ($result) { $str=''; }else{ $str=''; } echo $str; return $result; } 小程序端完整代码如下: /\*\* \* 支付函数 \* @param {\[type\]} \_payInfo \[description\] \* @return {\[type\]} \[description\] \*/ pay:function(\_payInfo,success,fail){ var payInfo = { body:'', total\_fee:0, order\_sn:'' } Object.assign(payInfo, \_payInfo); if(payInfo.body.length==0){ wx.showToast({ title:'支付信息描述错误' }) return false; } if(payInfo.total\_fee==0){ wx.showToast({ title:'支付金额不能0' }) return false; } if(payInfo.order\_sn.length==0){ wx.showToast({ title:'订单号不能为空' }) return false; } var This = this; This.getOpenid(function(openid){ payInfo.openid=openid; This.request({ url:'api/pay/prepay', data:payInfo, success:function(res){ var data = res.data; console.log(data); if(!data.status){ wx.showToast({ title:data\['errmsg'\] }) return false; } This.request({ url:'api/pay/pay', data:{prepay\_id:data.data.data.prepay\_id}, success:function(\_payResult){ var payResult = \_payResult.data; console.log(payResult); wx.requestPayment({ 'timeStamp': payResult.timeStamp.toString(), 'nonceStr': payResult.nonceStr, 'package': payResult.package, 'signType': payResult.signType, 'paySign': payResult.paySign, 'success': function (succ) { success&&success(succ); }, 'fail': function (err) { fail&&fail(err); }, 'complete': function (comp) { } }) } }) } }) }) } 推荐:《小程序开发教程》 以上就是小程序怎么实现微信支付的详细内容,更多请关注知企PROSAAS其它相关文章! **Categories:** 后端开发 ---