介绍
微信一些接口可以通过沙箱测试,需要获取沙箱验签秘钥,本文就来讲下如何获得沙箱验签秘钥key
获取沙箱验签秘钥接口
获取验签秘钥API:
请求Url | api.mch.weixin.qq.com/sandboxnew/… |
---|---|
是否需要证书 | 否 |
请求方式 | POST |
请求参数: |
字段名 | 字段 | 必填 | 示例值 | 类型 | 说明 |
---|---|---|---|---|---|
商户号 | mch_id | 是 | 1305638280 | String(32) | 微信支付分配的微信商户号 |
随机字符串 | nonce_str | 是 | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | String(32) | 随机字符串,不长于32位 |
签名 | sign | 是 | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | String(32) | 签名值 |
返回参数:
字段名 | 字段 | 必填 | 示例值 | 类型 | 说明 |
---|---|---|---|---|---|
返回状态码 | return_code | 是 | SUCCESS | String(16) | SUCCESS/FAIL 此字段是通信标识,非交易标识 |
返回信息 | return_msg | 否 | 签名失败 | String(128) | 返回信息,如非空,为错误原因 ,签名失败 ,参数格式校验错误 |
以下字段在return_code 为SUCCESS的时有返回。
字段名 | 字段 | 必填 | 示例值 | 类型 | 说明 |
---|---|---|---|---|---|
商户号 | mch_id | 是 | 1305638280 | String(32) | 微信支付分配的微信商户号 |
沙箱密钥 | sandbox_signkey | 否 | 013467007045764 | String(32) | 返回的沙箱密钥 |
商户号也可以是服务商号
构造请求参数
需要数据如下:
-
商户号(或者服务商号)
-
商户号(或服务商号)32位秘钥。当前微信商户或者服务商设置有apiV2密钥key还有apiV3密钥key分别对应不同版本的微信接口,目前来看v3版本接口是没有沙箱测试的
-
随机字符串
下面我们来使用微信支付接口签名校验工具获取沙箱秘钥接口所需请求参数,
其中sign是由连接秘钥key进行md5获得的32位大写加密结果。这个我们可以通过第2步连接秘钥key进行md5加密一下来验证下。可以使用如下MD5在线加密网址来验证下:
可以看出生成的签名是一致的:2265A098D9FB16035FA5F0858B20973B。微信支付接口签名校验工具生成的最终提交xml就是我们调用沙箱获取验签秘钥接口的参数。
调用接口获取验签秘钥key
下面我们用Postman来请求下获取沙箱验签密钥key接口:
在响应中返回了微信沙箱验签秘钥,后面在沙箱测试中使用该密钥key进行请求即可。微信官网其实对沙箱测试进行了相关的封装,可以下载java版的SDK和DEMO组装参数后直接调用。
沙箱测试简单使用
下载java版的SDK和DEMO里面有个封装的常量WXPayConstants:
import org.apache.http.client.HttpClient;
/**
* 常量
*/
public class WXPayConstants {
public enum SignType {
MD5, HMACSHA256
}
public static final String DOMAIN_API = "api.mch.weixin.qq.com";
public static final String DOMAIN_API2 = "api2.mch.weixin.qq.com";
public static final String DOMAIN_APIHK = "apihk.mch.weixin.qq.com";
public static final String DOMAIN_APIUS = "apius.mch.weixin.qq.com";
public static final String FAIL = "FAIL";
public static final String SUCCESS = "SUCCESS";
public static final String HMACSHA256 = "HMAC-SHA256";
public static final String MD5 = "MD5";
public static final String FIELD_SIGN = "sign";
public static final String FIELD_SIGN_TYPE = "sign_type";
public static final String WXPAYSDK_VERSION = "WXPaySDK/3.0.9";
public static final String USER_AGENT = WXPAYSDK_VERSION +
" (" + System.getProperty("os.arch") + " " + System.getProperty("os.name") + " " + System.getProperty("os.version") +
") Java/" + System.getProperty("java.version") + " HttpClient/" + HttpClient.class.getPackage().getImplementationVersion();
public static final String MICROPAY_URL_SUFFIX = "/pay/micropay";
public static final String UNIFIEDORDER_URL_SUFFIX = "/pay/unifiedorder";
public static final String ORDERQUERY_URL_SUFFIX = "/pay/orderquery";
public static final String REVERSE_URL_SUFFIX = "/secapi/pay/reverse";
public static final String CLOSEORDER_URL_SUFFIX = "/pay/closeorder";
public static final String REFUND_URL_SUFFIX = "/secapi/pay/refund";
public static final String REFUNDQUERY_URL_SUFFIX = "/pay/refundquery";
public static final String DOWNLOADBILL_URL_SUFFIX = "/pay/downloadbill";
public static final String REPORT_URL_SUFFIX = "/payitil/report";
public static final String SHORTURL_URL_SUFFIX = "/tools/shorturl";
public static final String AUTHCODETOOPENID_URL_SUFFIX = "/tools/authcodetoopenid";
// sandbox
public static final String SANDBOX_MICROPAY_URL_SUFFIX = "/sandboxnew/pay/micropay";
public static final String SANDBOX_UNIFIEDORDER_URL_SUFFIX = "/sandboxnew/pay/unifiedorder";
public static final String SANDBOX_ORDERQUERY_URL_SUFFIX = "/sandboxnew/pay/orderquery";
public static final String SANDBOX_REVERSE_URL_SUFFIX = "/sandboxnew/secapi/pay/reverse";
public static final String SANDBOX_CLOSEORDER_URL_SUFFIX = "/sandboxnew/pay/closeorder";
public static final String SANDBOX_REFUND_URL_SUFFIX = "/sandboxnew/secapi/pay/refund";
public static final String SANDBOX_REFUNDQUERY_URL_SUFFIX = "/sandboxnew/pay/refundquery";
public static final String SANDBOX_DOWNLOADBILL_URL_SUFFIX = "/sandboxnew/pay/downloadbill";
public static final String SANDBOX_REPORT_URL_SUFFIX = "/sandboxnew/payitil/report";
public static final String SANDBOX_SHORTURL_URL_SUFFIX = "/sandboxnew/tools/shorturl";
public static final String SANDBOX_AUTHCODETOOPENID_URL_SUFFIX = "/sandboxnew/tools/authcodetoopenid";
}
复制代码
我们会看到sandbox分别对应上面的相关微信正式地址。
SDK其实已经帮助我们封装好了各接口请求,我们只需封装好参数填充相关私钥,商户号,密钥,商户平台证书号,公众号APPID(或小微信程序APPID)即可,这些参数需要注册微信商户(或者服务商)以及公众号、微信小程序进行配置。
我们以v2版本付款码支付接口为例来进行沙箱测试。如下所示:
public static void main(String[] args) throws Exception {
//服务商号
String mchId = "1621111111";
//商户平台序列号
String cerSerialNo = "";
//密钥key(使用沙箱密钥获取接口获取的密钥)
String apiKey = "0facf5f174e01e02dabd5bf4769feabe";
//私钥
String privateKey = "";
//公众号APPID
String appId = "";
Map<String, String> params = new HashMap<>(16);
//微信支付分配的子商户号,开发者模式下必填
params.put("sub_mch_id", "1622222222");
params.put("body", "支付测试");
params.put("out_trade_no", "2022051100000100099");
//单位为分
params.put("total_fee", "501");
params.put("spbill_create_ip", "127.0.0.1");
//付款码
params.put("auth_code", "131111111111111111");
//SDK中封装的WxPayTransConfig
WxPayTransConfig transConfig = new WxPayTransConfig();
transConfig.setAppId(appId);
transConfig.setKey(apiKey);
//商户号(或微信服务商号)
transConfig.setMchId(mchId);
//第三个参数为是否使用沙箱测试,true为使用(如果想调试正式地址,填false即可)
////SDK中封装的WXPay
WXPay wxpay = new WXPay(transConfig, true, true);
//调用微信的扫码支付接口
Map<String, String> resp = wxpay.microPay(params);
System.out.println("微信扫码支付接口调用返回:" + JSON.toJSONString(resp));
}
复制代码
其中apiKey为我们沙箱密钥接口获取的key(正式环境请使用微信商户或者微信服务商设置的密钥key)。我们将上面测试中apiKey,appId,mchId配置填充下,然后组装参数中的字商户ID参数sub_mch_id设置下发起请求,会收到如下类似响应:
{
"nonce_str":"4NDY8QUkmFyP7AGgcDgpRMrmKY6v10yU",
"coupon_count":"1",
"sign":"C9B2CD33DFF908C29F88C82A3A79AFA4",
"coupon_fee_0":"1",
"err_code":"SUCCESS",
"err_code_des":"ok",
"return_msg":"OK",
"fee_type":"CNY",
"mch_id":"1621111111",
"coupon_id_0":"10000",
"cash_fee":"500",
"cash_fee_type":"CNY",
"total_fee":"501",
"time_end":"20220616235052",
"attach":"sandbox_attach",
"transaction_id":"4940641735820220616235052845518",
"coupon_type_0":"CASH",
"bank_type":"CMC",
"openid":"085e9858e9914da9a0da5522a",
"coupon_batch_id_0":"12345",
"device_info":"sandbox",
"out_trade_no":"2022051100000100099",
"coupon_fee":"1",
"appid":"",
"settlement_total_fee":"500",
"trade_type":"MICROPAY",
"result_code":"SUCCESS",
"is_subscribe":"Y",
"return_code":"SUCCESS"
}
复制代码
有兴趣可以下载相关微信SDK和DEMO查看其它接口请求,在此就不赘述了。
总结
本文主要介绍了微信沙箱密钥key获取步骤,还有就是举例介绍了v2版本付款码支付沙箱测试。后面有时间会对v2版本和v3版本微信支付正式接口调用进行详细阐述。