本文是【浅析微信支付】系列文章的第十篇,主要讲解如何使用沙箱环境来测试微信支付。
浅析微信支付系列已经更新十篇了哟~,没有看过的朋友们可以看一下。
在实际开发中,通常我们都是在开发环境中开发,本地环境也有很多限制,比如:微信支付无法调起、H5链接需要鉴权、支付结果通知需要外网等。
面对以上的问题,微信官方给出了解决的方法,就是咋们这篇文章的 沙箱环境
,也就是微信支付的官方测试环境,这个环境能做些什么呢?我觉得最重要的一点就是我们可以实时根据官方的例子调用对应的接口,并且接口会马上返回结果,拿微信支付预支付单接口来说,调用以后会实时返回我们支付的相关信息,这样就免于开发时不知道返回结果而苦恼。
仿真测试系统
为降低商户测试门槛,微信支付团队开发了一套独立的仿真测试系统。该系统根据验收用例金额的不同返回不同的响应报文,以满足商户正常功能测试、安全/异常测试及性能测试的需求。
图1为微信支付仿真测试系统(后简称仿真系统)的简化原理图。仿真系统的API协议与正式API完全相同(API接口文档)。商户开发者只需将正式API的调用URL增加一层sandboxnew
路径,即可对接到仿真系统。
例如,刷卡支付URL:api.mch.weixin.qq.com/pay/micropa…
变更为:api.mch.weixin.qq.com/sandboxnew/…
仿真系统与生产环境完全独立,包括存储层。商户在仿真系统所做的所有交易(如下单、支付、查询)均为无资金流的假数据,即:用户无需真实扣款,商户也不会有资金入账。代金券同理,沙箱环境中无需商户真实制券与发券,亦不会出现真实扣券情况。验收仿真测试系统的API验签密钥需从API获取:
源码&交互过程
以下为微信官方的仿真测试系统
文档:
https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=23_1
复制代码
- 1
- 2
上面说明具体的交互过程和相关的仿真测试系统的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(<span class="hljs-string">"/sandboxnew/pay/getsignkey"</span>, data, 10000, 10000);
System.out.println(result);
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17