前言:签名错误!估计很多朋友看到这个报错的时候就比较头大了,不知道如何下手,对什么是签名等都不是特别了解,所以很难处理好这类问题,下面是我总结的目前一些签名错误的排查指引。阅读本文章前,建议提前看一下文章右侧的目录,帮助你更好的阅读此文章。
确定自己使用的什么版本接口(通过这两个就可以直接判断使用的是什么版本):
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接口签名生成工具
下面介绍一下签名错误的几种情况以及对应的检查方法
服务端接口签名错误(比如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则会报签名错误)
注意:
1、使用签名工具生成签名postman测试代码使用的参数是没有问题
2、使用验签工具验签能通过只代表生成 签名的方式是没有问题,但不代表 参数是否正确,因为验签工具不交易参数的正确性
客户端签名错误(比如JSAPI调起支付、APP调起支付等,这类属于特殊签名方式,在对应的文档会有详细的说明情况,比如JSAPI调起支付就有介绍如何生成签名)
1.首先确定 服务端和客户端的签名类型是否一致,v2接口只能是MD5或者是HMAC-SHA256签名方式,二者的签名长度一样,如果不一样则会报签名错误
2.生成签名时使用的 APIv2密钥需要跟下单时使用的必须一致
3.使用签名工具进行验签(建议同时对下单的签名进行验签,这样就能直观的看到自己两次使用的APIv2密钥是否一样)
上述生成签名跟自己的不一样,则说明自己生成的签名有问题, 可以把生成签名写死在前端试一下
4.调起支付的前端方法尽量使用微信支付官方文档提供的方法, 注意参数不要有空格等问题
5.如果上面检查都没有问题,可能自己的代码有问题, 前后端传输问题,比如 时间戳timeStamp后端没有成功传递给接口,导致最终传递给微信接是空的也会报错, 这种情况建议先把参数提前生成好,然后写死在前端,建议直接重新写个简单的测试页面(可以避免缓存的影响)
我想问一下v2回调接口的时候 为什么所有参数返回null?列如:WxPayException(customErrorMsg=发生异常!, returnCode=null, returnMsg=null, resultCode=null, errCode=null, errCodeDes=null, xmlString=null)
服务商待特约商户发起的支付使用的是APIv2秘钥,进件用的是APIv3秘钥
看看这里的文档跟你写的参数一样吗?是更新了?那为什么我这个单品优惠券无法使用?