前言:签名错误!估计很多朋友看到这个报错的时候就比较头大了,不知道如何下手,对什么是签名等都不是特别了解,所以很难处理好这类问题,下面是我总结的目前一些签名错误的排查指引。阅读本文章前,建议提前看一下文章右侧的目录,帮助你更好的阅读此文章。
确定自己使用的什么版本接口(通过这两个就可以直接判断使用的是什么版本):
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后端没有成功传递给接口,导致最终传递给微信接是空的也会报错, 这种情况建议先把参数提前生成好,然后写死在前端,建议直接重新写个简单的测试页面(可以避免缓存的影响)
原生android调用微信支付是正常的,但是用同样的接口,签名也正确,用在小程序多端,打包了android却不行,用wx.miniapp.requestPayment 不能调用支付,显示报错信息
Object {errMsg: "sendOpenReq:fail:internal ...errMsg: "sendOpenReq:fail:internal error get appPay params error
请问这是什么原因?应该如何解决?
楼主,我遇到问题是,小程序appId绑定了新的商户号,在更换了小程序appId的wx_mchid、wx_key、证书后,小程序JSAPI支付二维码显示正常,但是扫码支付提示“支付验证签名失败”。切换回原商户号配置后能正常支付,请问是什么原因呢。用的V2版本
后端同一个接口,IOS可以调起微信支付,安卓不可以,提示签名错误,是什么原因
多端应用,工具验证sign是OK的,服务端返回给多端安卓包的时候,安卓端唤起支付时提示支付验证签名失败 vconsole报错-2sendOpenReq:fail,这个问题如何排除呢
服务商模式下 签名有误 可以帮我看看吗?
您好,我按照文档设置,一直报支付签名验证失败,找不到原因
咨询一下,我们这边有个问题:之前用一个自己注册的商户号完成了V2签名微信支付对接,现在换了一个商户号后,服务端接口下单正常,小程序端拉起微信支付直接报“支付验证签名失败”。
服务端下单使用的接口是:https://api.mch.weixin.qq.com/pay/unifiedorder
小程序拉起支付使用的组件是:wx.requestPayment(Object object)
一直怀疑是否是商户号的问题,因为原来的商户号是自己注册的直连商户,目前新的商户号是通过微信支付服务商注册的。只是咨询对方后,对方表示这个也是直连商户,他们生成的商户号都是用直连商户的对接方式完成对接的。检查两个商户号的类型,都显示为特约商户
生成的签名和微信支付接口签名校验工具生成的一致,但是小程序端调用还是报支付验证签名失败,有办法验证签名参数正确性么?
https://api.mch.weixin.qq.com/v3/apply4sub/sub_merchants/{sub_mchid}/modify-settlement
我们就某个商户,请求这个的时候,一直报系统繁忙,请稍后尝试.
咨询一下,如果相同的APPID下绑定多个商务号,但是只有一个商务号下载对账单好使,换一个商务号就报sign error 20001错误!知道什么原因吗?