评论

全网最全v2接口签名报错排查指引!!!!

签名报错排查

前言:签名错误!估计很多朋友看到这个报错的时候就比较头大了,不知道如何下手,对什么是签名等都不是特别了解,所以很难处理好这类问题,下面是我总结的目前一些签名错误的排查指引。阅读本文章前,建议提前看一下文章右侧的目录,帮助你更好的阅读此文章。

确定自己使用的什么版本接口(通过这两个就可以直接判断使用的是什么版本):

v3接口特征:

1、参数是JSON格式

2、签名类型为非对称密钥SHA256-RSA,参考的是:如何生成签名

v2接口特征:

1、参数是XML格式

2、签名类型为MD5/HMAC-SHA256,参考的是:签名算法

----------

v3签名错误排查指引文档:点击

----------

什么是签名:

1、这里解释的稍微通俗一点,就是把要传递给接口的参数,进行加密,加密的这个动作就是签名,作用就是保障这条请求是你的请求

2、v2接口使用的是APIv2密钥进行签名的(注意是APIv2密钥,跟APIv3密钥没有关系,二者互不影响)

先确定自己是服务商还是直连商户:

需要提前准备的工具:

1、postman

2、v2接口签名校验工具

v2接口签名生成工具

下面介绍一下签名错误的几种情况以及对应的检查方法

v3接口小程序发券插件签名报错


只需要这些参数参与签名,且注意这里的下标需要按照文档提示带上下标0(如果是多张就是1、2等),不需要{}

服务端接口签名错误(比如JSAPI下单、APP下单等接口,除调起支付和回调接口基本可以认为是服务端接口)

签名错误经典报错

<xml><return_code><![CDATA[FAIL]]></return_code>

<return_msg><![CDATA[签名错误,请检查后再试]]></return_msg>

先检查参与签名的参数是否有问题,按照下面的方式生成签名(参数名称一定要去文档当中复制,避免手动输入出现空格大小写等错误,测试时,建议就填写必填字段,除了商户号APPID和APIv2密钥(有些接口需要openid,openid需要使用真实可用的,且是通过当前APPID获取的),其他的都是使用官方的示例值进行测试)

然后直接使用postman进行请求测试,不需要什么配置,只要参数跟请求的url

如果按照上面操作提示了签名错误原因可能有:

1、未根据自己商户号的属性使用正确的文档
显示 直连商户:应该使用 直连商户文档以及商户自身的APIv2密钥文档
显示 服务商:应该使用 服务商的文档以及服务商的APIv2密钥文档
显示 特约商户:应该使用 服务商的文档以及服务商的APIv2密钥文档
2、文档使用正确的且参数确保没有问题的情况,使用postman测试还是报错则说明APIv2密钥错误, 目前APIv2密钥无法查看,只能重新设置,使用相同的APIv2密钥重新设置则可以判断APIv2密钥是否正确注意重新设置时,一定要确保登录商户平台的商户号是下单的商户号,如果是服务商模式就一定必须是服务商去商户平台重置,如果直连模式,则是下单时传递的商户号到商户平台重置,一定要主要检查是不是对应的商户号
3、若使用postman测试没有问题,则说明APIv2密钥是正确的,第一步先确定在代码里面 使用的API密钥是否正确,注意是否会有 大小写空格问题,或者被代码转义了,导致出现大写等问题,若确保这些没有问题,把代码生成的签名使用验签工具进行验签来确认签名方式的问题

4、注意签名方式,v2只支持HMAC-SHA256和MD5,没有传递签名类型,一般默认就是MD5,注意查看是不是 传递了MD5却使用的HMAC-SHA256签名方式或者是反过来的 (注意,要是接口没有说明是签名类型,则默认就是MD5,使用HMAC-SHA256则会报签名错误)
5、商户号不正确也会导致签名错误

注意:

1、使用签名工具生成签名postman测试代码使用的参数是没有问题
2、使用验签工具验签能通过只代表生成 签名的方式是没有问题,但不代表 参数是否正确,因为验签工具不交易参数的正确性

客户端签名错误(比如JSAPI调起支付、APP调起支付等,这类属于特殊签名方式,在对应的文档会有详细的说明情况,比如JSAPI调起支付就有介绍如何生成签名)

1.首先确定 服务端和客户端的签名类型是否一致v2接口只能是MD5或者是HMAC-SHA256签名方式,二者的签名长度一样,如果不一样则会报签名错误
2.生成签名时使用的 APIv2密钥需要跟下单时使用的必须一致
3.使用签名工具进行验签(建议同时对下单的签名进行验签,这样就能直观的看到自己两次使用的APIv2密钥是否一样)

上述生成签名跟自己的不一样,则说明自己生成的签名有问题, 可以把生成签名写死在前端试一下
4.调起支付的前端方法尽量使用微信支付官方文档提供的方法, 注意参数不要有空格等问题

5.如果上面检查都没有问题,可能自己的代码有问题, 前后端传输问题,比如 时间戳timeStamp后端没有成功传递给接口,导致最终传递给微信接是空的也会报错, 这种情况建议先把参数提前生成好,然后写死在前端,建议直接重新写个简单的测试页面(可以避免缓存的影响)

如果有什么疑问,欢迎在评论区里留言

最后一次编辑于  2022-06-30  
点赞 1
收藏
评论

10 个评论

  • 若是归来去
    若是归来去
    2023-09-25

    原生android调用微信支付是正常的,但是用同样的接口,签名也正确,用在小程序多端,打包了android却不行,用wx.miniapp.requestPayment 不能调用支付,显示报错信息

    Object {errMsg: "sendOpenReq:fail:internal ...errMsg: "sendOpenReq:fail:internal error get appPay params error

    请问这是什么原因?应该如何解决?

    2023-09-25
    赞同
    回复
  • aSU
    aSU
    2023-07-26

    楼主,我遇到问题是,小程序appId绑定了新的商户号,在更换了小程序appId的wx_mchid、wx_key、证书后,小程序JSAPI支付二维码显示正常,但是扫码支付提示“支付验证签名失败”。切换回原商户号配置后能正常支付,请问是什么原因呢。用的V2版本

    2023-07-26
    赞同
    回复
  • 小鲍
    小鲍
    2023-04-19

    后端同一个接口,IOS可以调起微信支付,安卓不可以,提示签名错误,是什么原因

    2023-04-19
    赞同
    回复
  • 蜂鸟
    蜂鸟
    2023-04-15

    多端应用,工具验证sign是OK的,服务端返回给多端安卓包的时候,安卓端唤起支付时提示支付验证签名失败 vconsole报错-2sendOpenReq:fail,这个问题如何排除呢

    2023-04-15
    赞同
    回复 1
    • 鲜明
      鲜明
      2023-10-19
      兄弟,你这个解决了吗
      2023-10-19
      回复
  • 信徒
    信徒
    2023-04-09

    服务商模式下 签名有误 可以帮我看看吗?

    2023-04-09
    赞同
    回复
  • 再回首
    再回首
    2023-01-24

    您好,我按照文档设置,一直报支付签名验证失败,找不到原因

    2023-01-24
    赞同
    回复 1
    • HOPE
      HOPE
      2023-02-06
      验签步骤发一下看看
      2023-02-06
      回复
  • 立鹰
    立鹰
    2022-11-28

    咨询一下,我们这边有个问题:之前用一个自己注册的商户号完成了V2签名微信支付对接,现在换了一个商户号后,服务端接口下单正常,小程序端拉起微信支付直接报“支付验证签名失败”。

    服务端下单使用的接口是:https://api.mch.weixin.qq.com/pay/unifiedorder

    小程序拉起支付使用的组件是:wx.requestPayment(Object object)

    一直怀疑是否是商户号的问题,因为原来的商户号是自己注册的直连商户,目前新的商户号是通过微信支付服务商注册的。只是咨询对方后,对方表示这个也是直连商户,他们生成的商户号都是用直连商户的对接方式完成对接的。检查两个商户号的类型,都显示为特约商户


    2022-11-28
    赞同
    回复 2
    • HOPE
      HOPE
      2022-11-28
      v2的签名错误只跟api密钥很参数有关,根据你的描述,可能是服务商的子商户走了直连模式,或者子商户用的是服务商的api密钥,你要确定的是使用的是谁的api密钥,当前调起的小程序绑定的到底是谁的appid,正确的应该是子商户自己使用自己的商户号登录商户平台,设置对应的api密钥,和绑定对应的appid,然后参与签名
      2022-11-28
      回复
    • 立鹰
      立鹰
      2022-11-28回复HOPE
      谢谢老师,找到问题了。确实是密钥问题,切换的时候,生成前端签名的地方在后台操作的时候,误用了老的密钥
      2022-11-28
      回复
  • 张良
    张良
    2022-09-25

    生成的签名和微信支付接口签名校验工具生成的一致,但是小程序端调用还是报支付验证签名失败,有办法验证签名参数正确性么?

    2022-09-25
    赞同
    回复 1
    • HOPE
      HOPE
      2022-09-26
      文章已经描述了全部可能,要是按照还没有排查出来,你可以私信发我,我帮你看看
      2022-09-26
      回复
  • 辉
    2022-06-10

     https://api.mch.weixin.qq.com/v3/apply4sub/sub_merchants/{sub_mchid}/modify-settlement

    我们就某个商户,请求这个的时候,一直报系统繁忙,请稍后尝试.

    2022-06-10
    赞同
    回复 3
    • HOPE
      HOPE
      2022-06-21
      解决了吗?是下单报的错还是调起支付报的,没有解决可以私信发参数给我,帮你看看
      2022-06-21
      回复
    • 就会多一片光明#
      就会多一片光明#
      2022-08-29回复HOPE
      我问一下,签名的值是每一次都会变的是吧,根据参数的不同 再根据签名类型 每一次都不一样?在代码里有固定的生成写法吗
      2022-08-29
      回复
    • HOPE
      HOPE
      2022-08-29
      只要是参数保持一致,签名值也是一样的,官方提供了三中开发语言的SDK,是有固定写法的,而且签名算法也是固定(基本是主流的开发语言都是有对应的签名方法),所以也可以自己根据规则写固定的代码,每次替换签名的参数就可以
      2022-08-29
      回复
  • Es el amor.
    Es el amor.
    2022-05-17

    咨询一下,如果相同的APPID下绑定多个商务号,但是只有一个商务号下载对账单好使,换一个商务号就报sign error 20001错误!知道什么原因吗?

    2022-05-17
    赞同
    回复 1
    • HOPE
      HOPE
      2022-05-18
      先确定一下你是使用的服务商还是直连商户,然后在确定你调用的是服务商的接口还是直连商户的接口,如果是服务商调用服务商接口下载某一个子商户的账单,构建签名的商户号是不需要改变的,都是使用服务商的,而是请求参数变了(要是下载服务商下全量的账单,就不需要改变参数,如果是某一个特定子商户的,只需要请求参数sub_mchid换成子商户的即可)
      2022-05-18
      回复
登录 后发表内容