小程序实现微信支付的方法:
前期准备:
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( #39;post.openid #39;); $body = I( #39;post.body #39;); $order_sn = I( #39;post.order_sn #39;); $total_fee = I( #39;post.total_fee #39;); //统一下单参数构造 $unifiedorder = array( #39;appid #39; = $config[ #39;appid #39;], #39;mch_id #39; = $config[ #39;pay_mchid #39;], #39;nonce_str #39; = self::getNonceStr(), #39;body #39; = $body, #39;out_trade_no #39; = $order_sn, #39;total_fee #39; = $total_fee * 100, #39;spbill_create_ip #39; = get_client_ip(), #39;notify_url #39; = #39;https:// #39;.$_SERVER[ #39;HTTP_HOST #39;]. #39;/Api/Wxpay/notify #39;, #39;trade_type #39; = #39;JSAPI #39;, #39;openid #39; = $openid $unifiedorder[ #39;sign #39;] = self::makeSign($unifiedorder); //请求数据 $xmldata = self::array2xml($unifiedorder); $url = #39;https://api.mch.weixin.qq.com/pay/unifiedorder #39;; $res = self::curl_post_ssl($url, $xmldata); if(!$res){ self::return_err( Can #39;t connect the server // 这句file_put_contents是用来查看服务器返回的结果 测试完可以删除了 //file_put_contents(APP_ROOT. #39;/Statics/log1.txt #39;,$res,FILE_APPEND); $content = self::xml2array($res); if(strval($content[ #39;result_code #39;]) == #39;FAIL #39;){ self::return_err(strval($content[ #39;err_code_des #39;])); if(strval($content[ #39;return_code #39;]) == #39;FAIL #39;){ self::return_err(strval($content[ #39;return_msg #39;])); self::return_data(array( #39;data #39;= $content)); //$this- ajaxReturn($content); }
3、调用商户服务器再次签名接口,返回支付数据
/** * 进行支付接口(POST) * @param string $prepay_id 预支付ID(调用prepay()方法之后的返回数据中获取) * @return json的数据 public function pay(){ $config = $this- config; $prepay_id = I( #39;post.prepay_id #39;); $data = array( #39;appId #39; = $config[ #39;appid #39;], #39;timeStamp #39; = time(), #39;nonceStr #39; = self::getNonceStr(), #39;package #39; = #39;prepay_id= #39;.$prepay_id, #39;signType #39; = #39;MD5 #39; $data[ #39;paySign #39;] = self::makeSign($data); $this- ajaxReturn($data); }
4、小程序内完成支付,商户服务器接收支付回调通知
小程序端代码:
wx.requestPayment({ #39;timeStamp #39;: #39; #39;, #39;nonceStr #39;: #39; #39;, #39;package #39;: #39; #39;, #39;signType #39;: #39;MD5 #39;, #39;paySign #39;: #39; #39;, #39;success #39;:function(res){ #39;fail #39;:function(res){ })
服务器回调通知:
//微信支付回调验证 public function notify(){ $xml = $GLOBALS[ #39;HTTP_RAW_POST_DATA #39;]; // 这句file_put_contents是用来查看服务器返回的XML数据 测试完可以删除了 //file_put_contents(APP_ROOT. #39;/Statics/log2.txt #39;,$res,FILE_APPEND); //将服务器返回的XML数据转化为数组 $data = self::xml2array($xml); // 保存微信服务器返回的签名sign $data_sign = $data[ #39;sign #39;]; // sign不参与签名算法 unset($data[ #39;sign #39;]); $sign = self::makeSign($data); // 判断签名是否正确 判断支付状态 if ( ($sign===$data_sign) ($data[ #39;return_code #39;]== #39;SUCCESS #39;) ($data[ #39;result_code #39;]== #39;SUCCESS #39;) ) { $result = $data; //获取服务器返回的数据 $order_sn = $data[ #39;out_trade_no #39;]; //订单单号 $openid = $data[ #39;openid #39;]; //付款人openID $total_fee = $data[ #39;total_fee #39;]; //付款金额 $transaction_id = $data[ #39;transaction_id #39;]; //微信支付流水号 //更新数据库 $this- updateDB($order_sn,$openid,$total_fee,$transaction_id); }else{ $result = false; // 返回状态给微信服务器 if ($result) { $str= #39; xml return_code ![CDATA[SUCCESS]] /return_code return_msg ![CDATA[OK]] /return_msg /xml #39;; }else{ $str= #39; xml return_code ![CDATA[FAIL]] /return_code return_msg ![CDATA[签名失败]] /return_msg /xml #39;; echo $str; return $result; }
小程序端完整代码如下:
/** * 支付函数 * @param {[type]} _payInfo [description] * @return {[type]} [description] pay:function(_payInfo,success,fail){ var payInfo = { body: #39; #39;, total_fee:0, order_sn: #39; #39; Object.assign(payInfo, _payInfo); if(payInfo.body.length==0){ wx.showToast({ title: #39;支付信息描述错误 #39; return false; if(payInfo.total_fee==0){ wx.showToast({ title: #39;支付金额不能0 #39; return false; if(payInfo.order_sn.length==0){ wx.showToast({ title: #39;订单号不能为空 #39; return false; var This = this; This.getOpenid(function(openid){ payInfo.openid=openid; This.request({ url: #39;api/pay/prepay #39;, data:payInfo, success:function(res){ var data = res.data; console.log(data); if(!data.status){ wx.showToast({ title:data[ #39;errmsg #39;] return false; This.request({ url: #39;api/pay/pay #39;, data:{prepay_id:data.data.data.prepay_id}, success:function(_payResult){ var payResult = _payResult.data; console.log(payResult); wx.requestPayment({ #39;timeStamp #39;: payResult.timeStamp.toString(), #39;nonceStr #39;: payResult.nonceStr, #39;package #39;: payResult.package, #39;signType #39;: payResult.signType, #39;paySign #39;: payResult.paySign, #39;success #39;: function (succ) { success success(succ); #39;fail #39;: function (err) { fail fail(err); #39;complete #39;: function (comp) { }
推荐:《小程序开发教程》
以上就是小程序怎么实现微信支付的详细内容,更多请关注php中文网其它相关文章!
微信app下载
微信是一款手机通信软件,支持通过手机网络发送语音短信、视频、图片和文字。微信可以单聊及群聊,还能根据地理位置找到附近的人,带给大家全新的移动沟通体验,有需要的小伙伴快来保存下载体验吧!