收藏
回答

微信支付v3 jsapi调起支付时,签名验证错误

需求:

希望让使用者透过微信浏览器开启web,并进行支付。

但JSAPI调起支付时,出现验证签名失败的问题。


操作路径:

  1. 前端透过https://open.weixin.qq.com/connect/oauth2/authorize成功取得code
  2. 用code向后端发出请求,成功取得openId(后端透过https://api.weixin.qq.com/sns/oauth2/access_token取得)
  3. 用openId向后端发出请求,后端透过https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi成功下单
  4. 并取得JSAPI调起支付所需appId、timeStamp、nonceStr、package、signType、paySign回传给前端
  5. 前端用上述资讯(确定有值)调用JSAPI支付,但跳出「付款验证签名失败」的提示


疑问:

  1. 微信支付接口签名校验工具https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1 是否不适用api v3的签名?
  2. 若已不适用,那api v3的开发者该如何排除签名错误呢?


补充:

签名的计算,参考此页面https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_4.shtml#menu1

采用和API header的Authorization一样的签名计算方式,将appId、timeStamp、nonceStr、package放入计算签名。

下单可以成功,代表Authorization的签名是无误的。而JSAPI调起支付的签名却出现错误。

最后一次编辑于  02-18
回答关注问题邀请回答
收藏

12 个回答

  • 跨商通
    跨商通
    02-19

    从你的表述里看出,已经到了第5步?

    那么可以定位是二次签名的原因。重点排查它吧。

    印象里,V3的二次签名与下单的区别可能是有一个空串+‘\n’,仅供参考。

    02-19
    有用 2
    回复
  • Memory
    Memory
    02-18

    工具可以验证成功,那么说明说明数据证书都是没有问题的,剩下的都是应用层处理数据问题,这里需要开发者自己打印出来对比一下

    注意

    1、换行

    2、参数的顺序


    其余的可以参考:


    A7:可参考以下指引:https://wechatpay-api.gitbook.io/wechatpay-api-v3/chang-jian-wen-ti/qian-ming-xiang-guan



    商户侧验证微信返回签名的验签示例(PHP):


    链接:https://pan.baidu.com/s/1ojWl4o3btpxymQmvRjeKBg


    提取码:yx8o


    验证签名工具:


    链接:https://pan.baidu.com/s/1ixOAnYyZVW13dFr0jWVpvw


    提取码:wujv

    02-18
    有用 2
    回复 4
  • Bohr
    Bohr
    03-16

    注意换行(PHP别用单引号,否则不会换行):

    

    Tip:注意和命令行的区别,拼接字符串里面有\n。而通过代码构造签名串没有\n而是换行。

    echo -n -e \
    "wx8888888888888888\n1414561699\n5K8264ILTKCH16CQ2502SI8ZNMTM67VS\nprepay_id=wx201410272009395522657a690389285100\n" \
      | openssl dgst -sha256 -sign apiclient_key.pem \
      | openssl base64 -A
    

    代码构造签名串:

    wx8888888888888888
    1414561699
    5K8264ILTKCH16CQ2502SI8ZNMTM67VS
    prepay_id=wx201410272009395522657a690389285100 
    
    03-16
    有用 3
    回复 1
  • 机器翻译官
    机器翻译官
    11-02

    果然是前端报验签失 可以检测前端调用的接口名称

    wx.chooseWXPay 和 WeixinJSBridge传的参数个数和大小写不一样 
    


    wx.chooseWXPay 没有appId ,timestamp是小写
    


    11-02
    有用
    回复
  • So  what
    So what
    08-14

    楼主是不是已经解决了,现在我也遇到的一样的问题

    08-14
    有用
    回复
  • Swan
    Swan
    07-06

    我也是支付签名验证失败,无语啊,卡在这儿了,你们怎么处理的?

    07-06
    有用
    回复
  • Haiger
    Haiger
    05-03

    老哥,我在统一下单的时候出现了签名问题。可以分享一下你怎么解决的吗?我这个项目没用java,用的node.js所以没有sdk可用手动拼接的。我想知道别人成功签名的到底和我的差异在哪里。

    05-03
    有用
    回复 1
    • Graves
      Graves
      09-28
      解决了吗  我也是node.js
      09-28
      1
      回复
  • 不知勿言
    不知勿言
    04-14

    请注意 如果是 .net 写的话 注意需要签名的字符串 @不要加,加了@的 \n 就不是换行符了

    04-14
    有用
    回复 3
    • 不知勿言
      不知勿言
      04-14
      没注意这个细节,被折腾的死了
      04-14
      回复
    • 特级调酒师
      特级调酒师
      06-22
      那.net要这么加换行符?我用\r\n
      06-22
      回复
    • 特级调酒师
      特级调酒师
      06-23回复特级调酒师
      直接用\n就行,但是不用linq的累加器,我用了之后签名就失败了,直接手打字符串,使用$”“语法
      06-23
      回复
  • 路人a
    路人a
    04-02

    每行都得有个回车,包括最后一行。

    04-02
    有用
    回复
  • O_O
    O_O
    03-30

    我也遇到了这样的问题

    03-30
    有用
    回复

正在加载...

登录 后发表内容
问题标签