在做刷卡支付的时候,正式的环境可以正常返回(敏感信息已经修改):
Pay Result:{nonce_str=IcVsdgs22Fsz46s, appid=wx53c4sd87dcdc, sign=9B7AE9DD7sdfs126FC3CC095, err_code=USERPAYING, return_msg=OK, result_code=FAIL, err_code_des=需要用户输入支付密码, mch_id=1485757572, return_code=SUCCESS}
但是沙箱环境一直报错,返回结果如下:
Pay Result:{return_msg=沙箱验证签名失败,请确认沙箱签名key是否正确(通过getsignkey调用生成), return_code=FAIL}
说一下我做的这个流程吧
-
判断当前是否是沙箱环境; 如果是正式环境,那么就直接使用在商户平台上的设置的
Key
来生成支付请求需要的sign
; 如果是沙箱环境, 则先到https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey
去请求sandbox_signkey
, 使用请求到的sandbox_signkey
来替代在商户平台上的设置的Key
来生成请求需要的sign
,主要代码如下(其中的方法调用retrieveSandboxSignKey代码也贴在后面了):WXPayConfigImpl config = WXPayConfigImpl.getInstance(); Boolean useSandbox = Boolean.valueOf(WxPropertiesUtil.getProperty("use_sandbox")); String key; if (useSandbox) { String sandboxSignkey = config.retrieveSandboxSignKey(config, wxPay); if (StringUtils.isBlank(sandboxSignkey)) { return ResponseObject.createErrorWithMessage("请求沙箱sandbox_signkey失败"); } key = sandboxSignkey; } else { key = config.getKey(); } String sign = WXPayUtil.generateSignature(reqData, key, SignType.MD5); reqData.put("sign", sign); //... Map<String, String> result = wxPay.microPay(reqData); log.info("Pay Result:" + result.toString());
-
获取沙箱密钥的代码如下
public String retrieveSandboxSignKey(WXPayConfig config, WXPay wxPay) { try { Map<String, String> params = new HashMap<String, String>(); params.put("mch_id", config.getMchID()); params.put("nonce_str", WXPayUtil.generateNonceStr()); params.put("sign", WXPayUtil.generateSignature(params, config.getKey())); String strXML = wxPay.requestWithoutCert("https://api.mch.weixin.qq.com/sandboxnew/pay/getsignkey", params, config.getHttpConnectTimeoutMs(), config.getHttpReadTimeoutMs()); if (StringUtils.isBlank(strXML)) { return null; } Map<String, String> result = WXPayUtil.xmlToMap(strXML); log.info("retrieveSandboxSignKey:" + result); if ("SUCCESS".equals(result.get("return_code"))) { return result.get("sandbox_signkey"); } return null; } catch (Exception e) { log.error("获取sandbox_signkey异常", e); return null; } }
我不知道这个逻辑有没有问题,官方的文档中没有说明这个沙箱key应该怎么使用,自己在往上查的; 各位大佬,帮忙看一下这个问题, 万分感谢
不要用
microPay()
这个API,用requestWithoutCert()
微信JDK里方法都是错的,亮瞎了我的眼。