收藏
回答

支付验证签名失败

问题描述:

统一下单可以正常得到prepay_id,调用wx:requestPayment 提示支付验证签名失败。

小程序端代码:

  wx.requestPayment({
    timeStamp: pay_p['timeStamp'],
    nonceStr: pay_p['nonceStr'],
    package: pay_p['package'],
    signType: pay_p['signType'],
    paySign: pay_p['paySign'],
    success (res) {
       console.log(res)
       },
    fail (res) {
       console.log(res) 
       }
  })

pay_p是后端Java生成的,java代码:

@RequestMapping("/payBefore")
public Map<String,String> payBefore (@RequestBody Map<String,String> requestData)  throws Exception
{
    logger.info("WxController payBefore requestData={}",gson.toJson(requestData));
    Map<String,String> result = new HashMap<>();
    Integer time = MyUtil.getCurrentTimestamp();
    result.put("timeStamp",time.toString());
    result.put("nonceStr",WXPayUtil.generateNonceStr());
    result.put("package",requestData.get("package"));
    result.put("signType",WXPayConstants.SignType.MD5.toString());
    result.put("appId",DefaultConsts.WX_APPID);
    WxConfig config = new WxConfig();
    String sign = WXPayUtil.generateSignature(result, config.getKey(), WXPayConstants.SignType.MD5);
    result.put("paySign",sign);
    logger.info("WxController payBefore result={}",gson.toJson(result));
    return result;
}


WXPayUtil、WXPayConstantssh jdk中代码


已经换过key了,还是没通过。

回答关注问题邀请回答
收藏

2 个回答

  • 吃饭不用筷子
    吃饭不用筷子
    2021-05-06

    可以解决吗哥,我遇到和你同样的问题

    2021-05-06
    有用
    回复
  • 微信支付技术助手8
    微信支付技术助手8
    2020-08-27

    请按照以下几点进行排查:

    1、使用签名检查工具(https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=20_1)校验签名算法是否有误

    2、确认秘钥是否有误(服务商模式使用服务商商户号秘钥,秘钥是在商户平台配置,如果同一商户号调用其它接口成功可排除是秘钥问题)

    3、确认接口实际的请求参数与生成签名原串的参数一致,不能增加或缺少参数(可通过打印签名原串进行排查)

    4、确认参数的大小写,参数名与接口文档一致

    5、签名原串的参数值使用原始值,不需要encode

    6、接口需要使用UTF-8编码

    7、调用“小程序支付API”中appid没有按照文档要求的格式

    8、调用“小程序支付API”中signType类型与“统一下单接口”不一致

    2020-08-27
    有用
    回复 5
    • 张磊
      张磊
      2020-08-27
      1.经过签名检查,验证一致;
      2.密钥正确,调用统一下单可以成功;
      3.请求参数与生成参数一致;
      4.大小写、名称一致;
      5.签名用的sdk的方法,没有对原始数据做处理
      6.ide是utf-8,用的sdk
      7.appId在后端参与了生成签名,中间“I”大写
      8.不明白,后端我用的sighType,统一下单用的sign_type,需要都用sign_type吗?
      2020-08-27
      回复
    • 微信支付技术助手8
      微信支付技术助手8
      2020-08-28回复张磊
      是的,必须一致。sign_type。如果你这边检查过参数无误,建议重置一下KEY
      2020-08-28
      回复
    • 张磊
      张磊
      2020-08-28回复微信支付技术助手8
      我有些蒙了。
      文档:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_sl_api.php?chapter=7_7&index=5
      要求:签名方式为signType,值为MD5。


      统一接口文档要求:签名方式为sign_type,值为MD5。


      你意思是变量名也保持一致吗?


      我开发的流程是这个样子的:


      1.调用统一支付,成功之后,将:


      timeStamp、//重新生成
      nonceStr、//重新生成
      package、//取统一支付的prepay_id,组装
      signType、//都为MD5
      appId、
      paySign


      2.小程序收到响应之后,将1返回的参数传给requestPayment,拉起支付


      3.微信扫码,支付验证失败。


      请问:我上述步骤有问题吗?


      ps:key重置了。
      2020-08-28
      回复
    • 张磊
      张磊
      2020-08-29
      请帮忙看下,是哪里的问题吧。。
      2020-08-29
      回复
    • 哈撒给😏
      哈撒给😏
      2021-03-31
      解决了嘛
      2021-03-31
      回复
登录 后发表内容
问题标签