亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 課堂 > 小程序 > 正文

詳解微信小程序支付流程與梳理

2020-03-21 15:51:40
字體:
來源:轉載
供稿:網友

花了幾天把小程序的支付模塊接口寫了一下,可能有著公眾號開發的一點經驗,沒有入太多的坑,在此我想記錄一下整個流程。

首先先把小程序微信支付的圖搬過來:

微信小程序,支付流程

相信會來查百度的同學們基本都是對文檔的說明不是很理解。我下面大概總結一下整個業務邏輯的過程。

微信小程序的商戶系統一般是以接口的形式開發的,小程序通過調用與后端約定好的接口進行參數的傳遞以及數據的接收。在小程序支付這塊,還需要跟微信服務器進行交互。過程大致是這樣的:

一.小程序調用登錄接口獲取code,傳遞給商戶服務器用來獲取用戶的openID

我們知道在微信平臺中,同一個公眾號的openID都是不同的,它是用戶身份識別的id,也就是說,我們通過openID來區分不同的用戶,這個有微信開發基礎的應該都很熟悉。為了知道誰在支付,我們需要先獲取當前用戶的openid,那么openID應該怎么獲取呢?看下圖:

微信小程序,支付流程

  1. 小程序調用wx.login() 獲取 臨時登錄憑證code ,并回傳到開發者服務器。
  2. 開發者服務器以code換取 用戶唯一標識openid 和 會話密鑰session_key。

看不懂嗎?不急,聽我慢慢解釋,這個業務流程大致就是首先你得先在小程序的代碼中調用wx.login()來向微信獲取到code,拿到了之后把code通過request傳給商戶服務器,再由商戶服務器通過騷操作來跟微信服務器要session_key和openID。

偽代碼如下(小程序端):

getToken: function () { //調用登錄接口 wx.login({  success: function (res) {  var code = res.code;  wx.request({   url: 商戶服務器接口地址,    data: {   code: code   },   method: 'POST',    success: function (res) {    wx.setStorageSync('token', res.data.token); //存在小程序緩存中   },   fail: function (res) {   console.log(res.data);   }  })  } }) }

調用這幾行代碼就可以向跟微信服務器要code,并且將code傳到商戶服務器中,記住這里最好使用post發送請求,安全性的東西我應該不用講了,因為避免其他人濫用接口,于是我們使用token來進行驗證。并將商戶服務器返回的token存在小程序緩存中。

那么服務器端應該怎么做呢?

我門通過小程序提交的code,和小程序的APPID以及APPSECRET和拼接下列的url,并用curl進行get請求。

https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

返回的數據是一個json對象,我門通過使用json_decode(JSON,true)解析為數組,數據包括用戶的openID以及session_key,獲取到了后我們應該將openID存入數據庫中,它代表著用戶的身份,那么令牌應該怎么生成呢。

二.token的生成以及緩存

我們根據一個用戶表將id和openid聯系起來,對應openID的id則是用戶的uid,我們可以這么封裝

//要緩存的數據數組$cacheValue = $result; //包含openID和session_key$cacheValue['uid'] =$uid; //用戶id $cacheValue['scope'] =ScopeEnum::User; //用戶權限級別

緩存的方式我們可以選擇redis,memcache, 文件緩存等等,采用鍵值對(key-value)的方式進行存儲,記得設置好過期時間。這里的key我們用token來賦值,token可以通過這樣的方式進行生成:

//獲取32位隨機字符串$str = getRandChar(32); //自定義方法生成32位隨機串//三組字符串進行md5加密$timeStamp =$_SERVER['REQUEST_TIME_FLOAT'];//salt$salt = config('secure.token_salt'); //隨機字符串//返回token return md5($str.$timeStamp.$salt);

這種算法基本保障了token的唯一性。因為值是我們獲取到的openID和session_key所在的數組,所以需要將數組轉成json才能存進去。以后的代碼當我們需要openID或者uid等時可以直接通過取緩存的方式來取。

三,調用統一下單接口,獲取prepay_id,再次簽名

在你寫完了訂單操作后,如何讓用戶支付訂單費用呢?這里就是重點了,我一步一步來說:

1.下載微信JS-SDK:

(https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1)

解壓打開進入lib文件夾中:

微信小程序,支付流程

我們需要將lib中的文件放到我們的框架中,例如我使用的是tp5,就放到extend下,最好是在extend下建個子文件夾。其中WxPay.Api.php是入口,WxPay.Config.php是配置文件。下好后需要改動一些地方。在WxPay.Config.php中修改下列的東西改成你的。

微信小程序,支付流程

然后在WxPay.Api.php中require一下WxPay.Notify.php,如圖:

微信小程序,支付流程

在某個控制器或者服務層的代碼先是用Loader::import()引入WxPay.Api.php,相當于五個都引入了。

2.調用統一下單api

這里要啰嗦的是,如何你寫的是有關商品買賣的小程序,那么需要在支付前再次檢測一下庫存量,因為用戶下完訂單后不一定馬上就會付款,如果在付款的期間庫存量沒了便會出現問題。業務邏輯我就不說太多了,這取決于你寫代碼的嚴謹性。

在我們引入了上面那個文件后,先實例化這個類WxPayUnifiedOrder,把需要的參數通過調用對應的方法傳入。

偽代碼如下:

//調用微信支付統一下單接口  $wxOrderData = new /WxPayUnifiedOrder();  //設置相關參數  $wxOrderData->SetOut_trade_no($this->orderNO);  $wxOrderData->SetTrade_type('JSAPI');  $wxOrderData->SetTotal_fee($totalPrice * 100); //這里的價格單位是分  $wxOrderData->SetBody('Mc');  $wxOrderData->SetOpenid($openid);  $wxOrderData->SetNotify_url(config('secure.pay_back_url'));//支付回調

其中第一個是你的訂單號,訂單號的生成方法可以自定義,第二個是死參數,第三個是總訂單價格,第四個是名稱如果是中文的話要轉碼,第四個是openID,這個這時候就可以從緩存中取了。最后一個是支付回調,就是支付成功后微信要訪問的地址。必須是公網能訪問的,或者你使用ngrok來進行反向代理轉發本地的服務器。

參數設置好了之后,就直接調用SDK的方法了

 $wxOrder = /WxPayApi::unifiedOrder($wxOrderData);

如果參數沒有錯誤的話,返回的數據中會含有prepay_id,這個是我們需要的參數。

3.再次簽名

// 提交JSAPI輸入對象  $jsApiPayData = new /WxPayJsApiPay();  //設置appid  $jsApiPayData->SetAppid(config('wx.app_id'));  //timeStamp  $jsApiPayData->SetTimeStamp((string)time());  //隨機串  $randStr = md5(time().mt_rand(0,1000));  $jsApiPayData->SetNonceStr($randStr);  //數據報  $jsApiPayData->SetPackage('prepay_id='.$wxOrder['prepay_id']);  //類型  $jsApiPayData->SetSignType('MD5');  //生成簽名  $sign = $jsApiPayData->MakeSign();  //獲得簽名數組  $signData = $jsApiPayData->GetValues();  //增加字段paySign  $signData['paySign']=$sign;  //刪除signData中的app_Id字段  unset($signData['appId']);  return $signData;

再次簽名完成后,就把五個參數返回給小程序。

四,小程序獲取五個參數后,鑒權調起支付

偽代碼(小程序端)

// 提交JSAPI輸入對象  $jsApiPayData = new /WxPayJsApiPay();  //設置appid  $jsApiPayData->SetAppid(config('wx.app_id'));  //timeStamp  $jsApiPayData->SetTimeStamp((string)time());  //隨機串  $randStr = md5(time().mt_rand(0,1000));  $jsApiPayData->SetNonceStr($randStr);  //數據報  $jsApiPayData->SetPackage('prepay_id='.$wxOrder['prepay_id']);  //類型  $jsApiPayData->SetSignType('MD5');  //生成簽名  $sign = $jsApiPayData->MakeSign();  //獲得簽名數組  $signData = $jsApiPayData->GetValues();  //增加字段paySign  $signData['paySign']=$sign;  //刪除signData中的app_Id字段  unset($signData['appId']);  return $signData;

如果一切正常的話,在微信開發者工具就會顯示這個二維碼,

微信小程序,支付流程

如果在真機上測試的話,就會直接彈出支付頁面。小程序會直接顯示支付成功或者失敗的頁面,然后微信服務器就會開始訪問我們之前設置的支付回調地址來推送支付結果,根據結果可以來更新訂單的狀態。這里我就不寫業務邏輯了,大概講一下就好。

五,支付回調

實際上我們需要重寫WxPayNotify類的NotifyProcess方法,這里記得Loader::impor()引入那個入口類。

/**	 * 	 * 回調方法入口,子類可重寫該方法	 * 注意:	 * 1、微信回調超時時間為2s,建議用戶使用異步處理流程,確認成功之后立刻回復微信服務器	 * 2、微信服務器在調用失敗或者接到回包為非確認包的時候,會發起重試,需確保你的回調是可以重入	 * @param array $data 回調解釋出的參數	 * @param string $msg 如果回調處理失敗,可以將錯誤信息輸出到該方法	 * @return true 回調出來完成不需要繼續回調,false回調處理未完成需要繼續回調	 */	public function NotifyProcess($data, &$msg)	{		//TODO 用戶基礎該類之后需要重寫該方法,成功的時候返回true,失敗返回false		return true;	}

也就是說你需要寫個新類繼承WxPayNotify,再重寫NotifyProcess方法,根據檢查$data['result_code']是否為SUCCESS可以判斷成功與否,成功的話你可以根據業務需求寫業務邏輯,最后return true 即可。這時候會想,我重寫了這個方法后微信怎么調用呢,其實這里微信不是要直接調用這個方法,你應該在微信支付回調的方法中實例化這個新類,然后根據獲得的對象去調用Handle()方法。$obj = new 新類(),$obj->Handle()。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久久久久久久久免费| 成人高清视频观看www| 欧美综合在线第二页| 最近2019中文字幕一页二页| 久久久国产一区二区三区| 亚洲无限乱码一二三四麻| 久久久久久com| 国产精品狼人色视频一区| 久久精品视频va| 欧美视频在线免费看| 国产精品自拍小视频| 国产精品久久网| 欧美国产第二页| 亚洲精品国产综合久久| 午夜精品久久久久久久99黑人| 国产精品美女免费看| 国产噜噜噜噜久久久久久久久| 日韩国产高清视频在线| 久久999免费视频| 欧美三级xxx| 欧洲精品在线视频| 日本亚洲欧洲色| 亚洲国内精品视频| 中文字幕久久精品| 国产精品第1页| 久久久亚洲影院| 久久亚洲私人国产精品va| 欧美激情精品久久久久久免费印度| 欧美亚洲视频在线观看| 欧美高清视频一区二区| 成人免费在线网址| 精品国产成人在线| 97免费在线视频| 亚洲图片欧美日产| 亚洲欧美日韩成人| 中文字幕亚洲色图| 91老司机精品视频| 日韩视频免费大全中文字幕| 色婷婷综合成人av| 久久偷看各类女兵18女厕嘘嘘| 国产日韩精品综合网站| 国产主播欧美精品| 国内偷自视频区视频综合| 国产色视频一区| 九九九久久国产免费| 欧美激情视频在线免费观看 欧美视频免费一| 欧美精品激情blacked18| 中文欧美日本在线资源| 亚洲国产另类久久精品| 日韩精品黄色网| 久久久精品国产亚洲| 久久国产一区二区三区| 上原亚衣av一区二区三区| 精品视频在线观看日韩| 国产精品99久久久久久久久久久久| 国产主播喷水一区二区| 国产成人精品电影久久久| 国产精品情侣自拍| 欧美日韩在线视频首页| 久久综合电影一区| 日韩av在线看| 日韩精品免费一线在线观看| 日韩美女av在线免费观看| 国产亚洲欧美视频| 国产精品三级久久久久久电影| 日韩欧美中文字幕在线观看| 在线成人激情黄色| 欧美在线精品免播放器视频| 久久精品99久久久久久久久| 欧美激情亚洲国产| 日本在线精品视频| 国产极品jizzhd欧美| 欧美日韩激情小视频| 欧美成人精品激情在线观看| 日本a级片电影一区二区| 亚洲高清av在线| 国产高清在线不卡| 国产婷婷97碰碰久久人人蜜臀| 97超碰国产精品女人人人爽| 精品视频—区二区三区免费| 性欧美在线看片a免费观看| 欧美最猛性xxxxx(亚洲精品)| 成人免费在线视频网址| 亚洲跨种族黑人xxx| 在线中文字幕日韩| 国产中文日韩欧美| 国产亚洲精品激情久久| 日韩美女毛茸茸| 亚洲国产日韩欧美在线图片| 国产精品青青在线观看爽香蕉| 亚洲精品视频网上网址在线观看| 久久精品视频一| 欧美老少配视频| 日韩欧美亚洲综合| 欧美贵妇videos办公室| 最新国产精品亚洲| 亚洲毛片一区二区| 成人免费黄色网| 日韩国产欧美区| 欧美一区二区大胆人体摄影专业网站| 亚洲高清久久久久久| 亚洲欧美日韩一区在线| 欧美激情精品久久久久久久变态| 欧美性猛交xxxx乱大交3| 欧美日韩亚洲天堂| 成人美女av在线直播| 久久69精品久久久久久国产越南| 欧美激情久久久| 日本精品一区二区三区在线播放视频| 欧美成人一二三| 亚洲奶大毛多的老太婆| 欧美日韩aaaa| 亚洲xxxx18| 国内精品一区二区三区四区| 欧美性高潮床叫视频| 国产午夜一区二区| 国产精品视频在线播放| 欧美亚洲另类制服自拍| 少妇高潮久久久久久潘金莲| 成人av电影天堂| 国产97色在线|日韩| 高清欧美性猛交xxxx黑人猛交| 亚洲乱码国产乱码精品精| 中文字幕v亚洲ⅴv天堂| 国产日韩欧美中文在线播放| 亚洲男女自偷自拍图片另类| 国产91精品久久久久久| 国产精品成熟老女人| 秋霞成人午夜鲁丝一区二区三区| 亚洲aaa激情| 日本精品一区二区三区在线| 亚洲综合社区网| 亚洲成人精品在线| 国产精品极品美女在线观看免费| 91精品国产91久久久久福利| 久久人人爽人人爽人人片av高请| 欧洲亚洲女同hd| 久久精品人人做人人爽| 最近2019中文免费高清视频观看www99| 久久精视频免费在线久久完整在线看| 欧美xxxx做受欧美.88| 91精品国产综合久久男男| 欧美孕妇孕交黑巨大网站| 国产欧美日韩亚洲精品| 久久精品91久久久久久再现| 精品动漫一区二区| 亚洲女人天堂成人av在线| 久久国产精品99国产精| 韩国v欧美v日本v亚洲| 欧美国产日韩一区二区| 欧美在线视频在线播放完整版免费观看| 欧美日韩精品在线观看| 91久久久久久久久| 久久99热精品这里久久精品| 亚洲另类欧美自拍| 在线电影中文日韩| 精品高清一区二区三区| 欧美日韩激情视频8区| 黑人欧美xxxx| 国产丝袜一区二区三区免费视频| **欧美日韩vr在线| 日韩福利伦理影院免费| 北条麻妃99精品青青久久| 亚洲一区二区在线|