沙箱环境下调取支付相关接口不再需要真正的商户key,而是需要沙箱密钥
所以首先需要获取沙箱密钥:
官方文档:沙箱文档
这里的sign是真正的商户key,请求接口成功后会得到沙箱密钥,即sandbox_signkey,之后再用这个沙箱密钥代替真正的商户key来调用预支付等接口
private Map<String,String> fillRequestDataSandBox(Map<String,String> reqData) throws Exception{
int readTimeoutMs = 5000;
int connectTimeoutMs = 5000;
String urlSuffix = "/sandboxnew/pay/getsignkey";
String string = this.requestWithoutCert(urlSuffix, this.fillRequestData(reqData), connectTimeoutMs,
readTimeoutMs);
Map<String, String> map = WXPayUtil.xmlToMap(string);
String signKey = map.get("sandbox_signkey");
config.setKey(signKey);
reqData.remove("sign");
reqData.put("sign",WXPayUtil.generateSignature(reqData, signKey, MD5));
return reqData;
}
这里会有一个问题:
项目中配置的商户key是真正的商户key,而预支付返回结果的时候对结果做了签名校验,这里结果中的sign其实是沙箱环境下的参数签名,和沙箱密钥有关,校验中需要注意替换,不然会出现sign不一致