浅析微信支付:如何使用沙箱环境测试

本文是【浅析微信支付】系列文章的第十篇,主要讲解如何使用沙箱环境来测试微信支付。php


浅析微信支付系列已经更新十篇了哟~,没有看过的朋友们能够看一下。nginx

浅析微信支付:下载对帐单和资金帐单git

浅析微信支付:申请退款、退款回调接口、查询退款github

浅析微信支付:查询订单和关闭订单小程序

浅析微信支付:支付结果通知api

在实际开发中,一般咱们都是在开发环境中开发,本地环境也有不少限制,好比:微信支付没法调起、H5连接须要鉴权、支付结果通知须要外网等。安全

面对以上的问题,微信官方给出了解决的方法,就是咋们这篇文章的 沙箱环境,也就是微信支付的官方测试环境,这个环境能作些什么呢?我以为最重要的一点就是咱们能够实时根据官方的例子调用对应的接口,而且接口会立刻返回结果,拿微信支付预支付单接口来讲,调用之后会实时返回咱们支付的相关信息,这样就免于开发时不知道返回结果而苦恼。bash

仿真测试系统

为下降商户测试门槛,微信支付团队开发了一套独立的仿真测试系统。该系统根据验收用例金额的不一样返回不一样的响应报文,以知足商户正常功能测试、安全/异常测试及性能测试的需求。微信

微信支付仿真测试系统1

图1为微信支付仿真测试系统(后简称仿真系统)的简化原理图。仿真系统的API协议与正式API彻底相同(API接口文档)。商户开发者只需将正式API的调用URL增长一层sandboxnew路径,便可对接到仿真系统。app

例如,刷卡支付URL:api.mch.weixin.qq.com/pay/micropa…
变动为:api.mch.weixin.qq.com/sandboxnew/…

仿真系统与生产环境彻底独立,包括存储层。商户在仿真系统所作的全部交易(以下单、支付、查询)均为无资金流的假数据,即:用户无需真实扣款,商户也不会有资金入帐。代金券同理,沙箱环境中无需商户真实制券与发券,亦不会出现真实扣券状况。验收仿真测试系统的API验签密钥需从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参数。

商户接入仿真系统的交互流程示例:

  1. 商户发起刷卡支付请求,使用POST方式调用 api.mch.weixin.qq.com/sandboxnew/…
  2. 带sandboxnew 的https请求会被nginx路由到仿真系统。仿真系统根据支付金额(total_fee字段)返回预期报文给商户。同时,落地该笔请求数据;
  3. 商户发起查单,调用 api.mch.weixin.qq.com/sandboxnew/…
  4. 仿真系统收到查单请求后,根据单号及金额返回预期的查单结果给商户;
  5. 商户下载对帐单,调用 api.mch.weixin.qq.com/sandboxnew/… ,仿真系统返回固定的帐单格式给商户。注:帐单内容不必定与商户在仿真系统产生的交易彻底相同。

沙箱说明:sandbox/sandboxnew
微信支付沙箱环境,是提供给微信支付商户的开发者,用于模拟支付及回调通知。以验证商户是否理解回调通知、帐单格式,以及是否对异常作了正确的处理。
◆ 如何对接沙箱环境?
一、修改商户自有程序或配置中,微信支付api的连接,如:被扫支付官网的url为:api.mch.weixin.qq.com/pay/micropa… 增长sandboxnew路径,变动为https://api.mch.weixin.qq.com/sandboxnew/pay/micropay , 便可接入沙箱验收环境,其它接口相似;
二、在微信支付开发调试站点(站点连接:mch.weixin.qq.com/wiki/doc/ap… ),按接口文档填入正确的支付参数,发起微信支付请求,完成支付;
三、验收完成后,修改程序或配置中的api连接(重要!),去掉sandboxnew路径。对接现网环境。

说明地址: pay.weixin.qq.com/wiki/doc/ap… pay.weixin.qq.com/wiki/doc/ap…

结语

其实 沙箱环境主要是为了方便在开发时及时得到接口返回值和进行 商户支付验收使用,本文讲了如何获取 sandbox_signkey参数,而后如何进行模拟对接,在实际接口URL后增长 sandboxnew 便可,接口会实时返回结果参数,此点于正式环境不一样(正式环境支付后是异步调用,沙箱环境是实时返回)。

注意:有的接口沙箱环境的接口并不仅是在连接中增长 sandboxnew,整个连接都会改变,在实际操做中咱们应该查看官方文档一一对照,如支付退款接口,正式线接口为:/secapi/pay/refund,而沙箱环境接口为:/sandboxnew/pay/refund,在沙箱环境中去掉了 secapi 这一路径,请小伙伴必定要注意。

预告:为了更好的验证微信支付安全性,咱们须要接入微信的 验收测试,下一篇文章 支付验收示例和验收指引 为你们讲解,敬请期待!!!

​若是想要提早一览源码的小伙伴,能够先看看个人 github,地址以下: ​ ​​https://github.com/YClimb/wxpay-sdk/blob/master/README.md ​

加做者私人微信,做者微信号以下 yclimb,标明 微信支付 可拉入微信支付讨论群与小伙伴一块儿探讨哦,必定要标明 微信支付 哦~

到此本文就结束了,关注公众号查看更多推送!!!


关注个人公众号
相关文章
相关标签/搜索