官方的解决方案
您好,请按照以下几点排查:
1、使用签名检查工具:https://pay.weixin.qq.com/wiki/doc/api/micropay.php?chapter=20_1)校验签名算法是否有误
2、确认秘钥是否有误(服务商模式使用服务商商户号秘钥,秘钥是在商户平台配置,如果同一商户号调用其它接口成功可排除是秘钥问题)
3、确认接口实际的请求参数与生成签名原串的参数一致,不能增加或缺少参数(可通过打印签名原串进行排查)
4、确认参数的大小写,参数名与接口文档一致
5、签名原串的参数值使用原始值,不需要encode
6、接口需要使用UTF-8编码
如果上面的您都检查了,请按照以下几点排查:
7、打印出您请求出去最后的数据与您工具校验正确的数据做一下对比,看是否有大小写不同,或者多余的空格
8、拿现在的参数使用postman进行测试,排除法,避免应用层处理问题导致
9、重置秘钥(支付key)
我们来一一分析一下
一、日常签名错误
1、缺少数据
2、空格
3、大小写
为啥会有这样的问题,正常来说,如果有这些问题下单是不会报签名错误的,这个是因为本身签名是成功的,但是开发者最终请求出去的数据有变动或写死了一些数据导致,这里需要开发者将自己最终请求出去的数据打印出来使用工具验证一下
二、工具验证sign值一样,但是为何还是报错签名错误?
注意:工具只会校验数据签名后的sign是否对应,不会校验支付key是否正确,但是调用下单接口时微信支付官方后台会校验
解决方案:
1、找到正确的key,替换重试(如果还是报签名错误,请参考2)
支付key的位置【账户中心-API安全-API密钥-设置秘钥】
2、重置key(优先,但是注意重置key对其他线上使用到key的业务是有影响的,这里需要业务量小时再去重置,然后替换所有使用到key的地方),替换重试
三、支付结果通知验签失败
1、支付结果通知有些开发者测试验签时,将收到的数据通过微信发给其他同事测试,其中有个数据是这样的
<return_msg><![CDATA[OK]]></return_msg>
这个数据通过微信发送会变成这样:
然后别的开发者复制出来后就会变成这样:
<return_msg><![CDATA]></return_msg>
最后在去手动验签就会报错:“签名失败”
2、接收到支付结果通知后,将数据封装后在进行验签,这样也会报:"签名错误",所以一定要使用官方返回的原数据
四、确认秘钥(支付key)是否有误
1、服务商模式使用服务商商户号秘钥,秘钥是在商户平台配置【账户中心-API安全-API密钥-设置秘钥】,如果同一商户号调用其它接口成功可排除是秘钥问题
2、使用错误的秘钥,我们商户后台 除了API秘钥还有一个V3API秘钥设置,这里不要设置错误了和使用错误了,当然您可以将V2V3秘钥设置成一样的,我就是这样设置的,避免使用错误
3、设置的秘钥在A商户号下,但是下单使用的是B商户号,服务商这个问题比较多,设置在子商户上,但是使用的是服务商模式
今天是情人节如果我有罪请让狗粮砸死我,而不是微信红包不断告诉我签名错误签名错误
今天是七夕如果我有罪请让狗粮砸死我,而不是微信退款不断告诉我参数错误参数错误
我使用的是微信小程序v2版本的支付 就是使用官方的校验工具可以校验通过,但是调用统一下单支付就会出现签名错误,这个是v2密钥有问题吗 还是什么问题 ,研究好几天了
我现在看你们密钥界面 跟我看到的不一样。我看到的是这样的。所以到底是?
重置了4、5次key还是错误的签名,啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!