本文是【淺析微信支付】系列文章的第十篇,主要講解如何使用沙箱環境來測試微信支付。
淺析微信支付系列已經更新十篇了喲~,沒有看過的朋友們可以看一下。
在實際開發中,通常我們都是在開發環境中開發,本地環境也有很多限制,比如:微信支付無法調起、H5鏈接需要鑒權、支付結果通知需要外網等。
面對以上的問題,微信官方給出了解決的方法,就是咋們這篇文章的 沙箱環境
,也就是微信支付的官方測試環境,這個環境能做些什么呢?我覺得最重要的一點就是我們可以實時根據官方的例子調用對應的接口,並且接口會馬上返回結果,拿微信支付預支付單接口來說,調用以后會實時返回我們支付的相關信息,這樣就免於開發時不知道返回結果而苦惱。
仿真測試系統
為降低商戶測試門檻,微信支付團隊開發了一套獨立的仿真測試系統。該系統根據驗收用例金額的不同返回不同的響應報文,以滿足商戶正常功能測試、安全/異常測試及性能測試的需求。
圖1為微信支付仿真測試系統(后簡稱仿真系統)的簡化原理圖。仿真系統的API協議與正式API完全相同(API接口文檔)。商戶開發者只需將正式API的調用URL增加一層sandboxnew
路徑,即可對接到仿真系統。
例如,刷卡支付URL:https://api.mch.weixin.qq.com/pay/micropay
變更為:https://api.mch.weixin.qq.com/sandboxnew/pay/micropay。
仿真系統與生產環境完全獨立,包括存儲層。商戶在仿真系統所做的所有交易(如下單、支付、查詢)均為無資金流的假數據,即:用戶無需真實扣款,商戶也不會有資金入賬。代金券同理,沙箱環境中無需商戶真實制券與發券,亦不會出現真實扣券情況。驗收仿真測試系統的API驗簽密鑰需從API獲取:
源碼&交互過程
以下為微信官方的仿真測試系統
文檔:
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=23_1
上面說明具體的交互過程和相關的仿真測試系統的API驗證簽名,為什么需要這個簽名接口呢?這是因為使用 沙箱環境
時使用的是真實的商戶號
、小程序/公眾號APP_ID
,但是 API密鑰
這個參數必須使用 沙箱環境
的 sandbox_signkey
,此接口主要是取得這個參數。
注:仿真測試環境中的商戶號(父子商戶號)需使用真實商戶號。
下面為取得 sandbox_signkey
的示例:
/**
* 獲取沙盒 sandbox_signkey
*
* @author yclimb
* @date 2018/9/18
*/
private void doGetSandboxSignKey() throws Exception {
WXPayConfigImpl config = WXPayConfigImpl.getInstance();
HashMap<String, String> data = new HashMap<String, String>();
// 商戶號
data.put("mch_id", config.getMchID());
// 獲取隨機字符串
data.put("nonce_str", WXPayUtil.generateNonceStr());
// 生成簽名
String sign = WXPayUtil.generateSignature(data, config.getKey());
data.put("sign", sign);
// 得到 sandbox_signkey
WXPay wxPay = new WXPay(config);
String result = wxPay.requestWithoutCert("/sandboxnew/pay/getsignkey", data, 10000, 10000);
System.out.println(result);
}
小伙伴可以根據 result
來獲取具體的返回數據,解析之后獲取 sandbox_signkey
參數。
商戶接入仿真系統的交互流程示例:
- 商戶發起刷卡支付請求,使用POST方式調用 https://api.mch.weixin.qq.com/sandboxnew/pay/micropay
- 帶sandboxnew 的https請求會被nginx路由到仿真系統。仿真系統根據支付金額(total_fee字段)返回預期報文給商戶。同時,落地該筆請求數據;
- 商戶發起查單,調用 https://api.mch.weixin.qq.com/sandboxnew/pay/orderquery,帶上微信訂單號(transaction_id)或商戶內部單號(out_trade_no);
- 仿真系統收到查單請求后,根據單號及金額返回預期的查單結果給商戶;
- 商戶下載對賬單,調用 https://api.mch.weixin.qq.com/sandboxnew/pay/downloadbill ,仿真系統返回固定的賬單格式給商戶。注:賬單內容不一定與商戶在仿真系統產生的交易完全相同。
沙箱說明:sandbox/sandboxnew
微信支付沙箱環境,是提供給微信支付商戶的開發者,用於模擬支付及回調通知。以驗證商戶是否理解回調通知、賬單格式,以及是否對異常做了正確的處理。
◆ 如何對接沙箱環境?
1、修改商戶自有程序或配置中,微信支付api的鏈接,如:被掃支付官網的url為:https://api.mch.weixin.qq.com/pay/micropay 增加sandboxnew路徑,變更為https://api.mch.weixin.qq.com/sandboxnew/pay/micropay , 即可接入沙箱驗收環境,其它接口類似;
2、在微信支付開發調試站點(站點鏈接:http://mch.weixin.qq.com/wiki/doc/api/index.php ),按接口文檔填入正確的支付參數,發起微信支付請求,完成支付;
3、驗收完成后,修改程序或配置中的api鏈接(重要!),去掉sandboxnew路徑。對接現網環境。
說明地址:
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=23_1
https://pay.weixin.qq.com/wiki/doc/api/app/app.php?chapter=21_2
結語
其實 沙箱環境
主要是為了方便在開發時及時獲得接口返回值和進行 商戶支付驗收
使用,本文講了如何獲取 sandbox_signkey
參數,然后如何進行模擬對接,在實際接口URL后增加 sandboxnew
即可,接口會實時返回結果參數,此點於正式環境不同(正式環境支付后是異步調用,沙箱環境是實時返回)。
注意:有的接口沙箱環境的接口並不只是在鏈接中增加 sandboxnew
,整個鏈接都會改變,在實際操作中我們應該查看官方文檔一一對照,如支付退款接口,正式線接口為:/secapi/pay/refund
,而沙箱環境接口為:/sandboxnew/pay/refund
,在沙箱環境中去掉了 secapi
這一路徑,請小伙伴一定要注意。
預告:為了更好的驗證微信支付安全性,我們需要接入微信的 驗收測試
,下一篇文章 支付驗收示例和驗收指引
為大家講解,敬請期待!!!
如果想要提前一覽源碼的小伙伴,可以先看看我的 github,地址如下:
https://github.com/YClimb/wxpay-sdk/blob/master/README.md
加作者私人微信,作者微信號如下 yclimb
,標明 微信支付
可拉入微信支付討論群與小伙伴一起探討哦,一定要標明 微信支付
哦~
到此本文就結束了,關注公眾號查看更多推送!!!