前言:签名错误!估计很多朋友看到这个报错的时候就比较头大了,不知道如何下手,对什么是签名等都不是特别了解,所以很难处理好这类问题,下面是我总结的目前一些签名错误的排查指引。阅读本文章前,建议提前看一下文章右侧的目录,帮助你更好的阅读此文章。
确定自己使用的什么版本接口(通过这两个就可以直接判断使用的是什么版本):
v3接口特征:
1、参数是JSON格式
2、签名类型为非对称密钥SHA256-RSA参考的是:如何生成签名
v2接口特征:
1、参数是XML格式
2、签名类型为MD5/HMAC-SHA256,参考的是:签名算法
---------
v2签名错误排查指引:点击
---------
什么是签名:
1、这里解释的稍微通俗一点,就是把要传递给接口的参数,进行加密,加密的这个动作就是签名,作用就是保障这条请求是你的请求
2、v2接口使用的是APIv2密钥进行签名的(注意是APIv2密钥,跟APIv3密钥没有关系,二者互不影响)
3、v3接口使用的是商户API证书的私钥进行签名的(什么是商户API证书?如何获取商户API证书?,按照该文档下载后是一个压缩包,有个说明文件,建议先阅读一下说明文件,解压后找到apiclient_key.pem文件,双击选择文本方式打开,就是私钥内容了)
先确定自己是服务商还是直连商户:
需要提前准备的工具:
1、postman
2、v3接口签名生成工具(若签名长度过长可能会导致签名工具直接闪退,说明签名本身就有问题)
下载解压收拾打开这个文件(有些朋友打开时可能会提示这个错误,原因是电脑本身自己就缺少了 msvcr120.dll 该组件,可以到网上自行下载一个,这里也无法上传,所以需要自己去下载一下了)
打开后选择【签名/验签】
3、微信支付API v3 Postman脚本使用指南,点击下载( 注意:该脚本只适用于v3接口进行测试)
下载后按照官方的步骤进行导入,然后配置,配置后是这样的(只需要配置下图配置的三个参数,其他的不用管,注意格式要跟下图一样),记得保存配置(ctrl+s)
注意看自己的请求头是否有这个,我这边配置好直接就有了,没有的手动添加一下即可,注意是:Authorization {{auth}} 别写错了
如何确定是配置成功,点证书下载能成功则说明配置没有问题,若报签名错误(就是这个三个参数有问题,缺少了或者有空格或者商户号和证书序列号商户API证书私钥不匹配,注意服务商模式使用的是服务商的商户API证书私钥)或其他错误则是配置有问题(插件没有导入,或者不小心修改了插件的方法或者填入参数格式不对或者没有保存)
下面介绍一下签名错误的检查方法
若使用的是v3接口的SDK报《微信支付签名验证失败》,则说明是APIv3密钥错误
服务端接口签名错误(比如JSAPI下单、APP下单等接口,除调起支付和回调接口基本可以认为是服务端接口)
只要状态码是401和提示签名啥啥错的,都是签名有问题
1、先使用postman进行测试,按照上述v3接口postman插件配置好后,只要请求证书能成功,则代表使用的商户号、商户API证书私钥和商户API证书序列号是正确的(注意商户API证书序列号和商户API证书是一一对应的吗,如下图,使用的是第一个商户API证书序列号就使用使用第一个对应的后面的证书)
如何查看商户API证书序列号:
2、使用postman测试没有问题,则代表这三个参数没有问题,使用验签工具进行验签(注意:验签所使用到的商户API证书私钥一定要是postman当中配置的,若是服务商模式,则使用服务商的商户API证书私钥:apiclient_key.pem)
v3接口post请求:
明文格式如下 (对应我的,各位朋友根据自己真实参数进行填写):
HTTP请求方法\n --> POST(换行,也就是我们常说的回车键)
URL\n --> /v3/pay/transactions/native(换行,也就是我们常说的回车键)
请求时间戳\n --> 1651914100(换行,也就是我们常说的回车键)
请求随机串\n --> qwer12345(换行,也就是我们常说的回车键)
请求报文主体\n -->(这个就是自己真实的请求参数,就一行){“mchid”:“1900006xxxx”,“out_trade_no”:“native121775250120140703323355”,“appid”:“wxdace60xxxxxxx”,“description”:“Image形象店-深圳腾大-QQ公仔”,“notify_url”: “https://weixin.qq.com/","amount”: {
“total”: 1,“currency”: “CNY”}}(换行,也就是我们常说的回车键)
签名值如下(各位朋友根据自己真实参数进行填写):
bmxt36Iplhdc5vnA4J/yEG4jfgdeWEO3Ws7viQ6cXCjJdoKyFIJM8S7HL7aNpxxxxxJMi/PjMGSt2NdZdXrD35J9yq6JnpLnRYrmup8n7z3hAg2sqzqykvbPltQeLsTCwZEkP20CaPO4cxxxxxxxxxxxornI39iXJ6FcSgoffM0MO5BCzoDq+Q4iUTYjLBEysKRxxxxxRjaVo9E2buvEgl0eEb4b98FtpgZOiUg28fxl6O/dm+z7AaLfu9okuOuXhxKjH8J2/7k0x7hJW5viaaD0Bcq+Xg==
(验签出现这个则说明签名本身就有问题,有空格或者长度有问题)
v3接口get请求:
HTTP请求方法\n --> GET(换行,也就是我们常说的回车键)
URL\n --> /v3/pay/transactions/id/1217752501201407033233368018?mchid=1900006xxxx(换行,也就是我们常说的回车键)
请求时间戳\n --> 1651914100(换行,也就是我们常说的回车键)
请求随机串\n --> qwer12345(换行,也就是我们常说的回车键)
请求报文主体\n -->)换行(根据签名规则,一个换行,加上面的一个,所以是两个,可参考上面的验签截图,也就是我们常说的回车键)
签名长度:
若上述验签显示不通过则说明是你签名值有问题,没有按照官方的要求生成,可能的原因有
1、代码里面的 \n并不是换行,而且当成了字符串
2、参数有空格、特殊符号或者大小写不对,比如i、L(小写的L),可能是代码某个方法转义了
3、签名使用的 商户性质跟使用的商户API证书私钥不匹配,比如服务商模式使用了子商户的商户API证书私钥(注意使用的文档别搞错了,如何区分文档是不是服务商的,一般文档参数带了子商户号就是服务商的文档)
4、完整签名值Authorization跟不符合文档要求
5、注意检查在验签工具当中的参数 是否有反斜杠 \,而你实际传递给接口的是没有的,导致你生成签名的参数是带\,接口校验时是没有,所以签名失败
注意,需要跟图片的格式一样,标点符号均为英文下的符号,不要有多余的空格,检查商户号、商户API证书序列号等是否正确且一一匹配
客户端签名错误(比如JSAPI调起支付、APP调起支付等,这类属于特殊签名方式,在对应的文档会有详细的说明情况,比如JSAPI调起支付就有介绍如何生成签名)
签名步骤(以JSAPI调起支付为例)
使用验签工具进行验签:
签名长度:
1.先确定前后端使用的是不是同一个签名方式(说白话就是前端必须需要使用一样的版本,比如都使用v2或者v3,本文介绍的是v3,所以服务端,比如下单接口必须是使用的v3版,json格式的参数),前后端签名方式或使用的版本不一致就会报签名错误
2.按照对应的文档检查参数格式及参数是否正确(比如: 签名时是否需要prepayid= )
3.调起支付的前端方法尽量使用微信支付官方文档提供的方法,注意参数不要有空格等问题
4.如果上面检查都没有问题,可能自己的代码有问题,前后端传输问题,比如时间戳timeStamp后端没有成功传递给接口,导致最终传递给微信接是空的也会报错,这种情况建议先把参数提前生成好,然后写死在前端,建议直接重新写个简单的测试页面(可以避免缓存的影响)
狗来写都比你们微信强
文档写的跟屎一样,都是技术看你们的技术文档都™各种掉坑
你好。微信小程序怎么接入支付分免押?
特约商户是直连商户吗
你还有个问题没贴出来。。。签名长度出现异常的原因有哪些?我这边支付成功了,结果回调通知出现解码长度报错。。。郁闷死了不知道是哪个环节
小程序V3支付自动分账参数profit_sharing 报错
"{"code":"PARAM_ERROR","detail":{"location":null,"value":["/body/profit_sharing"]},"message":"[0xe8][0xaf][0xb7][0xe6][0xb1][0x82][0xe4][0xb8][0xad][0xe5][0x90][0xab][0xe6][0x9c][0x89][0xe6][0x9c][0xaa][0xe5][0x9c][0xa8]API[0xe6][0x96][0x87][0xe6][0xa1][0xa3][0xe4][0xb8][0xad][0xe5][0xae][0x9a][0xe4][0xb9][0x89][0xe7][0x9a][0x84][0xe5][0x8f][0x82][0xe6][0x95][0xb0]"}"
去掉profit_sharing 一切正常
com.wechat.pay.contrib.apache.httpclient.exception.HttpCodeException: 下载平台证书返回状态码异常,状态码为:401
一直报没权限是什么问题
遇到这个问题,有大佬知道么
Caused by: java.lang.NoSuchMethodError: com.fasterxml.jackson.databind.ObjectReader.readValue(Ljava/lang/String;Ljava/lang/Class;)Ljava/lang/Object;