微信小程序 openid及支付的若干問題解決方案

 

微信小程序API幫助文檔中介紹php

wx.login(OBJECT)

調用接口獲取登陸憑證(code)進而換取用戶登陸態信息,包括用戶的惟一標識(openid) 及本次登陸的 會話密鑰(session_key)等。用戶數據的加解密通信須要依賴會話密鑰完成。css

登陸時序圖json

(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。微信小程序

 

 

2、微信小程序支付api

經過返回的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

相關文章
相關標籤/搜索