一.小程式呼叫登入介面獲取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。也就是使用者的小程式標識,在我上篇部落格中...