本文章主要协助开发者定位服务商V3(JSON)接口签名报错的问题,大家可根据以下步骤逐步排查。
微信支付已提供java、php、go语言的相关业务SDK,该SDK已支持签名验签的功能,开发者可以根据自己的需要选择对应的SDK使用,建议开发者首选使用微信支付提供的SDK进行开发,具体可参考:微信支付SDK介绍
步骤一、核实服务商商户号和商户私钥是否有误
1.1.检查接口传入的服务商商户号(sp_mchid)和子商户号(sub_mchid)是否正确,可用接口传入的商户号登录微信支付合作伙伴平台看看能否登录成功
1.2.检查服务商商户号与商户证书、证书私钥是否匹配,有以下两种方式可以处理:
- 可登录微信支付合作伙伴平台【API安全】->【API证书】->【查看证书】,查看商户API证书序列号,检查是否是正确的商户证书。如确认是正确的商户证书,开发者接下来可以使用如下的openssl命令检查私钥和商户证书中的modulus(p、q两个大素数的乘积)是否一致。如果两者一致,那么私钥和证书是成对的。
$ openssl x509 -noout -modulus -in 1900009191_20180326_cert.pem
Modulus=C6D43C87B991…
$ openssl rsa -noout -modulus -in 1900009191_20180326_key.pem
Modulus=C6D43C87B991…
modulus长度为2048位,输出为512个字节。
- 可登录微信支付合作伙伴平台【API安全】->【API证书】->【查看证书】,查看商户API证书序列号。如确认是正确的商户证书,开发者接下来可以使用官方提供的微信支付 APIv3 Postman 脚本进行验证。若使用postman工具发送请求验证成功,则说明商户证书和私钥没问题
特别提醒: 已经接入并使用微信支付颁发证书的商户请参考微信支付API证书升级指引(技术人员)。API v3已不支持使用微信支付颁发的证书,必须要用由证书授权机构Certificate Authority(简称CA)颁发的证书
商户申请商户API证书时,会生成商户私钥,商户私钥保存在本地证书文件夹的文件apiclient_key.pem 中。
步骤二、核实请求参数编码或签名串编码是否正确
检查请求参数的编码和生成签名串的编码是否为UTF-8,微信支付侧要求请求参数的编码和生成签名串时的编码都统一设置为UTF-8。
例如构造签名串中的JSAON中某个参数值带有中文,而实际在请求时的JSON串中的参数值传给微信侧是乱码,此种情况就会导致签名错误
步骤三、核实签名串的参数与实际请求参数是否一致
3.1.检查手工拼接的URL,是否和实际请求发送的不一致。我们建议的实现是使用HTTP库构造请求对象或者URL对象,再使用相应的方法取得URL。
3.2.检查构造签名串时的随机串,时间戳和设置Authorization头时的随机串,时间戳是否一致
3.3.检查构造签名串时的JSON串中的参数和实际发送请求时JSON串中的参数是否一致(当请求方法为POST或PUT时,需使用真实发送的JSON报文,所以下方截图以JSAPI下单举例)
3.4.检查签名和请求时,是否使用了前后两次序列化的JSON串作为请求主体
针对这类情况我们建议开发者将关键参数生成并保存在变量中,签名和发送请求时统一使用,避免前后生成的信息不一致。
步骤四、核实构建签名串顺序是否正确
检查构建签名串有没有按照文档要求的顺序进行构建
错误的顺序:
正确的顺序如下:
步骤五、核实构造签名串时的参数是否正确
5.1.检查构造签名串中的获取HTTP请求的方法是否正确,获取HTTP请求的方法需要是大写(GET,POST,PUT,PATCH,DELETE)
5.2.检查构造签名串时的URL是否正确,正确的做法应该是去除域名部分得到参与签名的URL。如果请求中有查询参数,URL末尾应附加有’?'和对应的查询字符串
步骤六、核实签名串的最后一行是否有附加换行符
签名串一共有五行,每一行为一个参数。行尾以 \n(换行符,ASCII编码值为0x0A)结束,包括最后一行。如果参数本身以\n结束,也需要附加一个\n
- 请求报文主体不为空(如POST请求),最后一行应该是一个\n(换行符)。
- 请求报文主体为空(如GET请求),最后一行应该是两个\n(换行符)。
特别提醒:部分特殊接口,请求报文body后面没有换行符,例如下载电子回单API
附录:
- 通过以上排查步骤仍未解决你的问题,那么你还可以使用微信支付官方提供的SDK和下载微信支付官方提供的验签工具处理或在帖子提供关键信息(比如构造签名串和实际请求时的参数信息)并留言,记得对敏感信息打码,比如证书序列号,商户私钥,mch_id,appid等
这里建议使用微信支付官方推荐的版本,因为微信支付官方可能只会在推荐的版本上做迭代优化
- 微信支付官方提供的验签工具使用指引