微信小程序API幫助文檔中介紹php
調用接口獲取登陸憑證(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