目前微信支付API v2 版本的SDK已停止维护,为了在保证支付安全的前提下,带给商户简单、一致且易用的开发体验,微信支付官方推出了全新的微信支付API v3。并且提供了Java、php、go语言的相关业务SDK,该SDK已支持签名验签的功能,若你有SDK需求,建议使用API v3版本,根据自己的需要选择对应的SDK使用,具体可参考:微信支付APIv3 SDK 介绍
本文章主要协助开发者定位直连商户V2接口签名报错的问题,大家可根据以下步骤逐步排查。
步骤一、核实商户号和APIv2密钥是否有误
1.1.检查接口传入的商户号(mch_id)是否正确,可用接口传入的商户号登录微信支付商户平台看看能否登录成功
1.2.检查商户号(服务商)与APIv2密钥是否匹配,如怀疑密钥错误,又担心影响其他接口,有以下两种方式可以处理
- 结合postman工具和微信官方提供的v2签名工具进行验证,验证时建议只填接口必填参数和直接复制文档上的参数名称,避免手动填写错误,且一定要按照文档要求填入对应的参数值,可参考下面截图中的步骤生成签名和生成最终提交的XML数据
将对应接口的url和签名工具中生成的最终的提交XML数据直接复制到postman工具中发送请求,如返回签名错误,则说明是APIv2密钥错误
- 可以尝试设置新的密钥(注意:新设置的密钥需与旧秘钥不一样),重置密钥之前建议严格按照APIv2密钥更换指引进行处理,避免线上业务受影响
- apiv2密钥在商户平台设置时长度固定是32位,超出部分无效
步骤二、核实请求参数编码或生成签名串编码是否正确
2.1.检查请求参数的编码和生成签名串的编码是否为UTF-8,微信支付侧要求请求参数的编码和生成签名串时的编码都统一设置为UTF-8
例如生成签名串中的某个参数值带有中文,而实际在请求时的XML中的参数值传给微信侧是乱码,此种情况就会导致签名错误
2.2.检查签名原串是否存在被URLencode编码的参数,微信支付要求签名原串需使用参数的原值进行签名
步骤三、核实sign与sign_type是否匹配
检查调用API时是否有传sing_type字段,大多数接口不传默认是MD5,少部分接口只支持HMAC-SHA256的方式
步骤四、核实请求参数是否正确
检查请求参数是否区分大小写,参数大小写不正确将会导致签名错误,需要严格参考文档中的要求进行传参
步骤五、核实请求参数是否有特殊字符或超长
检查是否存在^&空格等特殊字符或超过规定字段长度的情况
步骤六、核实签名串的参数与实际请求参数是否一致
检查签名原串XML中的参数和实际发送请求时XML中的参数是否一致,下面截图中就是一个典型的case
特别注意:有部分接口的规则有存在特殊情况,所以在调用时务必按照对应的API文档要求传参,比如清关报关API没有随机字符串,而微信支付的接口文档中提到了微信支付API接口协议中包含字段nonce_str,所以有部分商户在入参或生成签名时加上了nonce_str导致了签名错误。
如通过以上步骤仍然无法解决你的问题,可以在帖子提供关键信息(比如签名工具中的截图和通过postman请求报错)并留言,记得对敏感信息打码,比如key,mch_id,appid等