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