收藏
回答

微信小程序统一下单接口返回正常,小程序调用requestPayment方法时返回签名错误,什么原因?

签名已经仔细的检查过了,不存在什么命名错误。与开发工具里面也对过了。

 payMethod:function(){
     wx.request({
      url`${basePath}/pay?`,
      method:'POST',
      data:{openId:`${app.globalData.openid}`},
      successfunction (re{
        let res = re.data
        let paySign = md5.hexMD5('appId=' +  wx.getAccountInfoSync().miniProgram.appId + '&nonceStr=' + res.nonceStr + '&package=' + res.package + '&signType=MD5&timeStamp=' + res.timeStamp + "&key=我的密钥").toUpperCase()

        console.log(paySign,res.paySign)   前端签名与服务端返回的签名与官方提供的测试工具中的签名一致。
        wx.requestPayment(
          {
          "timeStamp":res.timeStamp,
          "nonceStr": res.nonceStr,
          "package": res.package,
          "signType": res.signType,
          "paySign": paySign,
          "success":function(res){
            console.log(res)
          },
          "fail":function(res){},
          "complete":function(res){}
          })
         
      }
    })
  },
q请问这能是什么原因?Map<String, String> rMap = wxpay.unifiedOrder(data);

 贴一下后端代码 。 

System.out.println("统一下单接口返回: " + rMap);
String return_code = (String) rMap.get("return_code");
String result_code = (String) rMap.get("result_code");
String nonceStr = WXPayUtil.generateNonceStr();
resultMap.put("nonceStr", nonceStr);
String timeStamp = String.valueOf(System.currentTimeMillis() / 1000);
if ("SUCCESS".equals(return_code) && return_code.equals(result_code)) {
    String prepayid = rMap.get("prepay_id");
    resultMap.put("package","prepay_id="+prepayid);
    resultMap.put("signType","MD5");
    //这边要将返回的时间戳转化成字符串,不然小程序端调用wx.requestPayment方法会报签名错误
    resultMap.put("timeStamp", timeStamp);
    //再次签名,这个签名用于小程序端调用wx.requesetPayment方法
    resultMap.put("appId","我的appID");
    System.out.println(resultMap);
    String sign = WXPayUtil.generateSignature(resultMap,"我的支付密钥");
    resultMap.put("paySign",sign);
    System.out.println("生成的签名paySign : "+ sign);   前后端生成的一致,用的官方提供的方法

最后一次编辑于  2021-06-30
回答关注问题邀请回答
收藏

1 个回答

  • 北望沣渭
    北望沣渭
    发表于移动端
    2021-06-29
    官方一再强调,一再强调,一再强调“不要把数据签名放到前台”来,幸好你这支付唤醒不成功,没有酿出大问题,不然哪天被咔嚓了都不知道自己错在哪里
    2021-06-29
    有用
    回复 10
    • 142857
      142857
      2021-06-30
      测试代码,只是测试一下签名是否一致,是否能调起来。线上代码肯定是在后台的。
      2021-06-30
      回复
    • 北望沣渭
      北望沣渭
      2021-06-30回复142857
      把你后端回送的`res`打印出来看看
      2021-06-30
      回复
    • 142857
      142857
      2021-06-30回复北望沣渭
      都是我写的。服务端返回的密钥和小程序上加密生成的密钥一致。
      2021-06-30
      回复
    • 142857
      142857
      2021-06-30回复北望沣渭
      看上面代码
      2021-06-30
      回复
    • 北望沣渭
      北望沣渭
      2021-06-30回复142857
      把java中的log `timeStamp` 打印出来看看
      2021-06-30
      回复
    查看更多(5)
登录 后发表内容