詳解微信小程式支付流程

2022-07-27 00:57:14 字數 3997 閱讀 6625

一.小程式呼叫登入介面獲取code,傳遞給商戶伺服器用來獲取使用者的openid

小程式呼叫wx.login() 獲取 臨時登入憑證code ,並回傳到開發者伺服器。

開發者伺服器以code換取 使用者唯一標識openid 和 會話金鑰session_key。

偽**如下(小程式端):

gettoken: function () ,

method: 'post',

success: function (res) ,

fail: function (res) })}

})}那麼伺服器端應該怎麼做呢?

返回的資料是乙個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,再次簽名

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

(解壓開啟進入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'));//支付**

引數設定好了之後,就直接呼叫sdk的方法了

$wxorder = \wxpayapi::unifiedorder($wxorderdata);
如果引數沒有錯誤的話,返回的資料中會含有prepay_id,這個是我們需要的引數。

3.再次簽名

// 提交jsapi輸入物件

$jsapipaydata = new \wxpayjsapipay();

//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;

return $signdata;

再次簽名完成後,就把五個引數返回給小程式。

四,小程式獲取五個引數後,鑑權調起支付

偽**(小程式端)

五,支付**

實際上我們需要重寫wxpaynotify類的notifyprocess方法,這裡記得loader::impor()引入那個入口類。

/***

* **方法入口,子類可重寫該方法

* 注意:

* @param array $data **解發布的引數

* @param string $msg 如果**處理失敗,可以將錯誤資訊輸出到該方法

* @return true **出來完成不需要繼續**,false**處理未完成需要繼續**

*/public function notifyprocess($data, &$msg)

微信小程式微信支付流程

1.小程式呼叫wx.login獲取登入憑證code wx.login 無請求引數 返回code 有效期5分鐘 wx.login 2.小程式通過code獲取openid 向介面位址 請求引數 返回引數 openid 使用者唯一標識 session key 回話金鑰 3.小程式向服務端傳送openid,...

微信小程式支付及退款流程詳解

支付主要分為幾個步驟 前端攜帶支付需要的資料 商品id,購買數量等 發起支付請求 前端進行支付動作 下面就詳細的說明一下各個步驟的具體實現。1.前端請求支付 後端接收到前端傳送的支付請求後,可以進行一下相關驗證,例如判斷一下使用者有沒有問題,支付金額對不對等等。使用者標識 openid。也就是使用者...

微信小程式支付及退款流程詳解

一.支付 支付主要分為幾個步驟 前端攜帶支付需要的資料 商品id,購買數量等 發起支付請求 前端進行支付動作 1.前端請求支付 後端接收到前端傳送的支付請求後,可以進行一下相關驗證,例如判斷一下使用者有沒有問題,支付金額對不對等等。使用者標識 openid。也就是使用者的小程式標識,在我上篇部落格中...