收藏
回答

微信支付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调起支付的签名却出现错误。

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

12 个回答

  • 跨商通
    跨商通
    2021-02-19

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

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

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

    2021-02-19
    有用 2
    回复
  • Bohr
    Bohr
    2021-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 
    
    2021-03-16
    有用 3
    回复 2
    • A北
      A北
      2021-07-27
      感谢,就是引号问题,我差点我都砸电脑了都研究好几天了
      2021-07-27
      回复
    • jh
      jh
      2022-03-21
      +1,我R,
      2022-03-21
      回复
  • 机器翻译官
    机器翻译官
    2021-11-02

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

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


    wx.chooseWXPay 没有appId ,timestamp是小写
    


    2021-11-02
    有用 1
    回复 1
    • 丶笔调cium
      丶笔调cium
      2022-12-14
      无语了,这各种大小写防不胜防,从v2改到v3,看到这里才发现问题!!!!
      2022-12-14
      回复
  • 嘿!哥们
    嘿!哥们
    04-16

    我用的uni app 调用的jsapi v3,下面是小程序代码,参数都是从后台取值的

    微信扫描之后就报 支付验证签名失败,小程序的failFunction 方法也不走

    预下单返回的如下

    JsapiResult(appId=wx52ecee145ab5a1eb, timeStamp=1713229734, nonceStr=iVEsKIoLIPqTbYjawIVd9DG7htGVeLGX, packageValue=prepay_id=wx16090853233460b5a9f9ef0f688df70001, signType=RSA, paySign=Mk/jixX8ou40w5SPjLzR6qn6LHljHPy+IuEeTzbhDMbHZvI/b3CZNdz2jwnFrAM5hcXSbtCm77TO1hbL9kaNuiMxEjbq8BCQBA+MFafP3HKe5mGPlnfR3hiUuxGBq2npOOMxQD3QOkxoqme6SLaPnH/R7qJElDVxJNB2c0fOBhtFoZOdu2yDdVIAmXQQPD5m33cwGjTFUPrWUIWVA206zvVOBYwpGQWA+U8rqp9+bRftjOZLrerQHotMfPbIbdU/KzdNMqVUY/z0FIsCibJIf0sm1Zu1sq1HjUUO3Q+HJB1ZUIuGK7Thf2VFq3R8x2TJ8SybJO1tsP9fLhQFOZyPNg==)

    大佬们谁能帮忙看下,什么问题呢

    04-16
    有用
    回复
  • So  what
    So what
    2021-08-14

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

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

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

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

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

    2021-05-03
    有用
    回复 1
    • Graves
      Graves
      2021-09-28
      解决了吗  我也是node.js
      2021-09-28
      1
      回复
  • 夷延卫
    夷延卫
    2021-04-14

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

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

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

    2021-04-02
    有用
    回复
  • O_o
    O_o
    2021-03-30

    我也遇到了这样的问题

    2021-03-30
    有用
    回复

正在加载...

登录 后发表内容
问题标签