欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2019年07月16日 09:32:07   作者:MClink  
這篇文章主要介紹了詳解微信小程序支付流程與梳理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

花了幾天把小程序的支付模塊接口寫了一下,可能有著公眾號(hào)開發(fā)的一點(diǎn)經(jīng)驗(yàn),沒有入太多的坑,在此我想記錄一下整個(gè)流程。

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


相信會(huì)來查百度的同學(xué)們基本都是對(duì)文檔的說明不是很理解。我下面大概總結(jié)一下整個(gè)業(yè)務(wù)邏輯的過程。

微信小程序的商戶系統(tǒng)一般是以接口的形式開發(fā)的,小程序通過調(diào)用與后端約定好的接口進(jìn)行參數(shù)的傳遞以及數(shù)據(jù)的接收。在小程序支付這塊,還需要跟微信服務(wù)器進(jìn)行交互。過程大致是這樣的:

一.小程序調(diào)用登錄接口獲取code,傳遞給商戶服務(wù)器用來獲取用戶的openID

我們知道在微信平臺(tái)中,同一個(gè)公眾號(hào)的openID都是不同的,它是用戶身份識(shí)別的id,也就是說,我們通過openID來區(qū)分不同的用戶,這個(gè)有微信開發(fā)基礎(chǔ)的應(yīng)該都很熟悉。為了知道誰在支付,我們需要先獲取當(dāng)前用戶的openid,那么openID應(yīng)該怎么獲取呢?看下圖:


  1. 小程序調(diào)用wx.login() 獲取 臨時(shí)登錄憑證code ,并回傳到開發(fā)者服務(wù)器。
  2. 開發(fā)者服務(wù)器以code換取 用戶唯一標(biāo)識(shí)openid 和 會(huì)話密鑰session_key。

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

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

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

調(diào)用這幾行代碼就可以向跟微信服務(wù)器要code,并且將code傳到商戶服務(wù)器中,記住這里最好使用post發(fā)送請(qǐng)求,安全性的東西我應(yīng)該不用講了,因?yàn)楸苊馄渌藶E用接口,于是我們使用token來進(jìn)行驗(yàn)證。并將商戶服務(wù)器返回的token存在小程序緩存中。

那么服務(wù)器端應(yīng)該怎么做呢?

我門通過小程序提交的code,和小程序的APPID以及APPSECRET和拼接下列的url,并用curl進(jìn)行g(shù)et請(qǐng)求。

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

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

二.token的生成以及緩存

我們根據(jù)一個(gè)用戶表將id和openid聯(lián)系起來,對(duì)應(yīng)openID的id則是用戶的uid,我們可以這么封裝

//要緩存的數(shù)據(jù)數(shù)組
$cacheValue = $result; //包含openID和session_key
$cacheValue['uid'] =$uid; //用戶id
 
$cacheValue['scope'] =ScopeEnum::User; //用戶權(quán)限級(jí)別

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

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

這種算法基本保障了token的唯一性。因?yàn)橹凳俏覀儷@取到的openID和session_key所在的數(shù)組,所以需要將數(shù)組轉(zhuǎn)成json才能存進(jìn)去。以后的代碼當(dāng)我們需要openID或者uid等時(shí)可以直接通過取緩存的方式來取。

三,調(diào)用統(tǒng)一下單接口,獲取prepay_id,再次簽名

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

1.下載微信JS-SDK:

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

解壓打開進(jìn)入lib文件夾中:


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


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


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

2.調(diào)用統(tǒng)一下單api

這里要啰嗦的是,如何你寫的是有關(guān)商品買賣的小程序,那么需要在支付前再次檢測(cè)一下庫存量,因?yàn)橛脩粝峦暧唵魏蟛灰欢R上就會(huì)付款,如果在付款的期間庫存量沒了便會(huì)出現(xiàn)問題。業(yè)務(wù)邏輯我就不說太多了,這取決于你寫代碼的嚴(yán)謹(jǐn)性。

在我們引入了上面那個(gè)文件后,先實(shí)例化這個(gè)類WxPayUnifiedOrder,把需要的參數(shù)通過調(diào)用對(duì)應(yīng)的方法傳入。

偽代碼如下:

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

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

參數(shù)設(shè)置好了之后,就直接調(diào)用SDK的方法了

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

如果參數(shù)沒有錯(cuò)誤的話,返回的數(shù)據(jù)中會(huì)含有prepay_id,這個(gè)是我們需要的參數(shù)。

3.再次簽名

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

再次簽名完成后,就把五個(gè)參數(shù)返回給小程序。

四,小程序獲取五個(gè)參數(shù)后,鑒權(quán)調(diào)起支付

偽代碼(小程序端)

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

如果一切正常的話,在微信開發(fā)者工具就會(huì)顯示這個(gè)二維碼,


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

五,支付回調(diào)

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

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

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

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 老生常談JS中的繼承及實(shí)現(xiàn)代碼

    老生常談JS中的繼承及實(shí)現(xiàn)代碼

    這篇文章主要介紹了js中的繼承及實(shí)現(xiàn)代碼,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-07-07
  • JS中reduce和map的優(yōu)雅寫法分享

    JS中reduce和map的優(yōu)雅寫法分享

    這篇文章主要為大家詳細(xì)介紹了JavaScript中一些reduce和map的優(yōu)雅寫法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-03-03
  • JavaScript實(shí)現(xiàn)彈性導(dǎo)航效果

    JavaScript實(shí)現(xiàn)彈性導(dǎo)航效果

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)彈性導(dǎo)航效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • js+html5實(shí)現(xiàn)頁面可刷新的倒計(jì)時(shí)效果

    js+html5實(shí)現(xiàn)頁面可刷新的倒計(jì)時(shí)效果

    這篇文章主要為大家詳細(xì)介紹了js+html5實(shí)現(xiàn)頁面可刷新的倒計(jì)時(shí)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • JavaScript實(shí)現(xiàn)頁面高亮操作提示和蒙板

    JavaScript實(shí)現(xiàn)頁面高亮操作提示和蒙板

    這篇文章主要介紹了JavaScript實(shí)現(xiàn)頁面高亮操作提示和蒙板,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • JS交互點(diǎn)擊WKWebView中的圖片實(shí)現(xiàn)預(yù)覽效果

    JS交互點(diǎn)擊WKWebView中的圖片實(shí)現(xiàn)預(yù)覽效果

    這篇文章主要介紹了JS交互點(diǎn)擊WKWebView中的圖片實(shí)現(xiàn)預(yù)覽效果,需要的朋友可以參考下
    2018-01-01
  • JavaScript箭頭函數(shù)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    JavaScript箭頭函數(shù)_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理

    這篇文章主要為大家詳細(xì)介紹了JavaScript箭頭函數(shù)的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • js 圖片轉(zhuǎn)base64的方式(兩種)

    js 圖片轉(zhuǎn)base64的方式(兩種)

    這篇文章主要介紹了js 圖片轉(zhuǎn)base64的方式(兩種),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-04-04
  • 最新評(píng)論