最常见的错误有以下四种:
(一)
【错误码含义】
导致nginx未正确解析到证书序列号,logicsvr获取到证书序列为空
【可能的原因】
1. 商户发起请求时没指定API证书
2. 商户发起请求时指定的API证书文件有误
a) 证书文件路径错误(如:使用curl命令行工具时中少了./ 等)
b) 证书文件和私钥文件不匹配
c) p12证书与密码不对
d) API证书不是微信支付签发的
e)证书文件的内容损坏
3. API证书文件的权限设置不当,程序无法访问
4. 开发人员直接调用logicsvr的CGI,请求未经过nginx
【解决办法】
可按下面的步骤排查:
1. 请求中指定API证书,并确认程序有访问API证书的权限
2. 确认pem格式的证书文件(压缩包中的 apiclient_cert.pem )和私钥文件(压缩包中的 apiclient_cert.key)是匹配的。
运行命令行 openssl pkcs12 -export -out test.p12 -in ./apiclient_cert.pem -inkey ./apiclient_key.pem -passout pass:test
能正常生成 test.p12,则说明证书文件和私钥文件是匹配的,且证书文件内容未被损坏
3. 使用p12格式的证书文件时,需要传入正确的密码(默认密码是:mchcode)
4. p12格式的证书文件在windows下可双击打开。如果无法打开,说明文件被损坏。需要找商户号的超管获取正确的证书。
(apiclient_key.pem文件大小为 1.7k左右, apiclient_key.pem文件大小为 1.5k左右, apiclient_cert.p12文件大小为 2.8k左右)
5. 查看证书的签发者,确认证书文件是微信支付签发的。
运行命令行 openssl x509 -text -in ./apiclient_cert.pem |grep Issuer |awk -F, '{print $NF}'。
合法的签发者有两个:
① 权威CA签发的证书:CN=MmpaymchCA/emailAddress=mmpaymch@tencent
② 微信支付签发的证书:CN=Tenpay.com Root CA
6. 开发人员自测cgi时,必须指定nginx服务器的ip和443端口。nignx负责解析证书信息,并http header传递给logicsvr。
(二)
【错误码含义】
商户号与API证书不匹配
【可能的原因】
请求报文中的商户号A,但发起请求时却用了商户号B的证书。
【解决办法】
每个API证书中都有商户号信息,不同商户号的API证书文件是独立的,不能混用。
1. 确保请求中指定的API证书,是属于xml报文中商户号的
2. 运行以下命令行,可到查看证书文件中的商户号信息
openssl x509 -text -in ./apiclient_cert.pem |grep Subject |grep -i 'tencent' |awk -F, '{print $1,$NF}'
会有以下两种格式:
① 权威CA签发的证书:Subject: CN=1900006031 L=ShenZhen (CN字段中内容为mchcode)
② 微信支付签发的证书:Subject: C=CN SN=14767152 (SN字段中内容为merchantId)
(三)
【错误码含义】
API证书已经过期
【可能的原因】
请求报文中的商户号A,但发起请求时却用了商户号B的证书。
【解决办法】
API证书的有效期默认为1年,证书过期后,有两种解决办法:
1. 续期证书(过期30天内使用)
2. 更换证书 (更换后的证书有效期为1年)
(特别提醒:1. 证书过期前1个月,平台会多次发送提醒通知超级管理员续期证书。由于商户可能未按通知及时续期证书。 为了给商户预留处理时间,服务器会按比例拦截使用过期证书的请求。 证书到期第一天会有10%的失败,第二天会有20%的失败 , 到第十天100%失败。所以在证书过期的10天内,部分请求会成功,部分请求会被拦截
2. 证书的过期时间以商户平台展示的日期为准。命令行的输出结果并不是实际: openssl x509 -text -in ./apiclient_cert.pem | grep 'Not After' |awk -F' : ' '{print $2}')
(四)
【错误码含义】
API证书已经作废,不能继续使用
【可能的原因】
商户更换了API证书,但未及时将新证书部署到服务器上,导致程序中仍在使用老证书
【解决办法】
1. 将最新的API证书部署到服务器
2. 商户平台上可以查看到新证书的序列号。运行以下命令行,可查看到证书文件中的序列号。
可先运行第一个命令,若结果为空,再运行第二个命令。
①微信支付自签证书: openssl x509 -text -in ./apiclient_cert.pem |grep Serial 非空时,输出结果为 5-10位数字
② 权威CA签发的证书:openssl x509 -text -in ./apiclient_cert.pem |grep Serial -A 1 |grep -v Serial | tr [a-z] [A-Z] | tr -d :
非空时,输出结果为“40个字符,数字和字母”