微信小程序 openid及支付的若干问题解决方案

 

微信小程序API帮助文档中介绍

wx.login(OBJECT)

调用接口获取登录凭证(code)进而换取用户登录态信息,包括用户的唯一标识(openid) 及本次登录的 会话密钥(session_key)等。用户数据的加解密通讯需要依赖会话密钥完成。

登录时序图

(1)通过调用login方法可以从微信服务器获取code

 1  wx.login({
 2       success: function(res) {
 3         if (res.code) {
 4           //发起网络请求
 5           wx.request({
 6             url: 'https://test.com/onLogin',
 7             data: {
 8               code: res.code
 9             }
10           })
11         } else {
12           console.log('获取用户登录态失败!' + res.errMsg)
13         }
14       }
15     });
 1  wx.request({
 2                                         url: 'https://×××××',
 3                                         data: {
 4                                                 js_code: jscode
 5                                         },
 6                                         method: 'POST',
 7                                         header: { 'content-type': 'application/x-www-form-urlencoded' }, // 设置请求的 header
 8                                         success: function (res) {
 9                                                 app.globalData.openid = res.data['openid'];
10                                                 console.log("res.data.openid=" + res.data['openid']);
11                                                 console.log("app.globalData.openid =" + app.globalData.openid );
12                                                 }
13                                 });

 

(2)把code提交到自己的服务器,并通过微信服务器对code进行验证

https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
服务器端接收验证代码
 1 function getOpenidAction() {
 2         
 3             $js_code= $_POST['js_code'];
 4             //echo 'js_code=' .$js_code;
 5             $appid = '小程序ID';
 6             $appsecret = '小程序的密钥';
 7             $access_url = "https://api.weixin.qq.com/sns/jscode2session?appid=".$appid."&secret=".$appsecret."&js_code=".$js_code."&grant_type=authorization_code";
 8             $str = $this->https_request($access_url);
 9             print_r($str);
10         }
11 
12 
13         //发起https请求
14         function https_request($url)
15             {
16                 $curl = curl_init();
17                 curl_setopt($curl, CURLOPT_URL, $url);
18                 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
19                 curl_setopt($curl,  CURLOPT_SSL_VERIFYHOST, FALSE);
20                 curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
21                 curl_setopt($curl, CURLOPT_TIMEOUT, 500);  
22                 $data = curl_exec($curl);
23                 if (curl_errno($curl)){
24                     return 'ERROR';
25                 }
26                 curl_close($curl);
27                 return $data;
28             }    

最后开发者服务器使用登录凭证 code 获取 session_key 和 openid。

 

 

二、微信小程序支付

通过返回的openid,对requestpayment方法进行组装

 1                 wx.request({
 2                         url: 'https://你的域名/wp-wxpay/pay/app.php',
 3                         data: {
 4 //全局变量
 5                                 openid: app.globalData.openid,
 6 //定义支付金额
 7                                 total_fee: total_fee
 8                         },
 9                         header: { 'content-type': 'application/x-www-form-urlencoded' }, // 设置请求的 header
10                         method: 'POST',
11                         success: function (res) {
12                                 var temp = res.data;
13                                 console.log("timestamp = " + temp);
14 //调用支付方法,整合参数后,提交到服务器验证审核
15                                 wx.requestPayment({
16                                         'timeStamp': res.data.timeStamp,
17                                         'nonceStr': res.data.nonceStr,
18                                         'package': res.data.package,
19                                         'signType': 'MD5',
20                                         'paySign': res.data.paySign,
21                                         'success': function (res) {
22                                         },
23                                         'fail': function (res) {
24                                                 wx.showToast({
25                                                         title: '报名失败!',
26                                                         icon: 'success'
27                                                 });
28                                         },
29                                         complete: function (res) {
30                                                 if (res.errMsg == 'requestPayment:fail cancel') {
31                                                         wx.showToast({
32                                                                 title: '取消报名',
33                                                                 icon: 'success'
34                                                         });
35                                                 }
36 
37                                         }
38                                 });
39                         },
40 
41                 });    
后端代码:

1. pay.php //小程序请求的后端地址


 1 <?php  
 2 /** 
 3  * Created by PhpStorm. 
 4  * User: UFO 
 5  * Date: 17/7/18 
 6  * Time: 下午5:31 
 7  */  
 8 require_once  ('WxPay.Api.php');  
 9   
10 class WXPay  {  
11     function index() {  
12         //         初始化值对象  
13         $input = new WxPayUnifiedOrder();  
14         //         文档提及的参数规范:商家名称-销售商品类目  
15         $input->SetBody("testceshi");  
16         //         订单号应该是由小程序端传给服务端的,在用户下单时即生成,demo中取值是一个生成的时间戳  
17         $input->SetOut_trade_no(time().'');  
18         //         费用应该是由小程序端传给服务端的,在用户下单时告知服务端应付金额,demo中取值是1,即1分钱  
19         $input->SetTotal_fee("1");  
20         $input->SetNotify_url("https://...com/notify.php");//需要自己写的notify.php  
21         $input->SetTrade_type("JSAPI");  
22         //         由小程序端传给后端或者后端自己获取,写自己获取到的,  
23         $input->SetOpenid('UdhncondJcnkJnjknkcssdcAbckn');  
24         //$input->SetOpenid($this->getSession()->openid);  
25         //         向微信统一下单,并返回order,它是一个array数组  
26         $order = WxPayApi::unifiedOrder($input);  
27         //         json化返回给小程序端  
28         header("Content-Type: application/json");  
29         echo $this->getJsApiParameters($order);  
30     }  
31   
32     private function getJsApiParameters($UnifiedOrderResult)  
33     {    //判断是否统一下单返回了prepay_id  
34         if(!array_key_exists("appid", $UnifiedOrderResult)  
35             || !array_key_exists("prepay_id", $UnifiedOrderResult)  
36             || $UnifiedOrderResult['prepay_id'] == "")  
37         {  
38             throw new WxPayException("参数错误");  
39         }  
40         $jsapi = new WxPayJsApiPay();  
41         $jsapi->SetAppid($UnifiedOrderResult["appid"]);  
42         $timeStamp = time();  
43         $jsapi->SetTimeStamp("$timeStamp");  
44         $jsapi->SetNonceStr(WxPayApi::getNonceStr());  
45         $jsapi->SetPackage("prepay_id=" . $UnifiedOrderResult['prepay_id']);  
46         $jsapi->SetSignType("MD5");  
47         $jsapi->SetPaySign($jsapi->MakeSign());  
48         $parameters = json_encode($jsapi->GetValues());  
49         return $parameters;  
50     }  
51 //这里是服务器端获取openid的函数  
52 //    private function getSession() {  
53 //        $code = $this->input->post('code');  
54 //        $url = 'https://api.weixin.qq.com/sns/jscode2session?appid='.WxPayConfig::APPID.'&secret='.WxPayConfig::APPSECRET.'&js_code='.$code.'&grant_type=authorization_code';  
55 //        $response = json_decode(file_get_contents($url));  
56 //        return $response;  
57 //    }  
58 }  
59 $WxPay = new WXPay();  
60 $WxPay->index();  

具体微信的支付SDK接口开发,可以参照微信官方的SDK开发包。

微信SDK 下载链接:https://pay.weixin.qq.com/wiki/doc/api/download/WxpayAPI_php_v3.zip


posted @ 2017-11-17 09:39  楼品玮  阅读(10659)  评论(0编辑  收藏  举报