账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Java后台-微信支付-刷卡支付-沙箱验证签名失败,请确认沙箱签名key是否正确(通过getsignkey调用生成)
    34
    0

    在做刷卡支付的时候,正式的环境可以正常返回(敏感信息已经修改):

    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应该怎么使用,自己在往上查的; 各位大佬,帮忙看一下这个问题, 万分感谢

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 情殤念斷 普通会员 1楼
      502 Bad Gateway

      502 Bad Gateway


      nginx
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部