自助排查

支付宝开放平台SDK封装了签名和验签过程,只需配置账号及密钥参数,强烈建议使用。

SDK下载地址

TIPS:文中代码部分以JAVA语言演示,其他语言请参考各自SDK。


使用开放平台SDK接入


如果使用了开放平台SDK,签名验签问题通常是因为密钥配置错误导致。

配置代码示例,问题描述中会以示例中的变量名为例:


签名问题

问题描述解决方案
SDK抛出异常:com.alipay.api.AlipayApiException: RSA私钥格式不正确,请检查是否正确配置了PKCS8格式的私钥。代码中私钥(private_key)格式错误导致。
1>.检查格式是否正确。Java需使用PKCS8格式,其他语言使用PKCS1格式。
2>.检查私钥是否一行。
请求时,SDK抛出异常:java.lang.NullPointerException: privateKey should not be NULL。代码中私钥(private_key)参数未赋值导致。请把商户应用私钥赋值给该参数。
请求时,SDK抛出异常:java.security.NoSuchAlgorithmException: MD5 KeyFactory not available。代码中签名类型(sign_type)设置错误导致。开放平台接口需设置成RSA。
请求时,支付宝返回报错信息:{"code":"40003","msg":"Insufficient Conditions","sub_code":"isv.missing-signature-config","sub_msg":"验签出错, 未配置对应签名算法的公钥或者证书"}开放平台未配置商户公钥导致。请登录开放平台,上传公钥。教程
请求时,支付宝返回报错信息:{"code":"40002","msg":"Invalid Arguments","sub_code":"isv.invalid-signature","sub_msg":"无效签名"}

签名校验失败。
1>.检查网关地址(gateway)是生产环境还是沙箱环境,必须使用与之匹配的应用id(app_id)与私钥(private_key)
2>.检查编码类型(charset)是否正确。
3>.检查私钥(private_key)与开放平台上传的应用公钥是否匹配。
4>.检查签名类型(sign_type)值是否正确。如果未传入sign_type参数,默认为RSA类型。

请求时,支付宝返回报错信息:{"code":"40002","msg":"Invalid Arguments","sub_code":"isv.missing-alipay-root-cert-sn","sub_msg":"缺少支付宝根证书序列号"}

请求参数中缺少支付宝根证书序列号( alipay_root_cert_sn)导致。检查自己的请求参数中是否携带支付宝根证书SN。

请求时,支付宝返回报错信息:{"code":"40002","msg":"Invalid Arguments","sub_code":"isv.invalid-alipay-root-cert-sn","sub_msg":"无效支付宝根证书序列号"}

支付宝根证书序列号(alipay_root_cert_sn)校验失败,检查自己使用的支付宝根证书是否是门户上下载的最新根证书,下载方式详见签名专区教程。

请求时,支付宝返回报错信息:{"code":"40002","msg":"Invalid Arguments","sub_code":"isv.missing-app-cert-sn","sub_msg":"缺少应用公钥证书序列号"}

请求参数中缺少应用公钥证书序列号(app_cert_sn)。

请求时,支付宝返回报错信息:{"code":"40002","msg":"Invalid Arguments","sub_code":"isv.app-cert-expired","sub_msg":"您用来加签的私钥对应的应用公钥证书已过期,请尽快更新您的应用公钥证书"}

应用公钥证书已过期,请登录开放平台,重新申请或重新上传有效的应用公钥证书,更新方式详见签名专区教程。

请求时,支付宝返回报错信息:{"code":"40002","msg":"Invalid Arguments","sub_code":"isv.app-cert-not-exist","sub_msg":"应用公钥证书不存在"}

请求参数中指定的应用公钥证书不存在,检查开发者使用的应用公钥证书是否已上传开发平台,上传方式详见签名专区教程。

请求时,支付宝返回报错信息:{"code":"40002","msg":"Invalid Arguments","sub_code":"isv.missing-alipay-cert-sn","sub_msg":"缺少支付宝公钥证书序列号"}

请求参数中缺少支付宝公钥证书序列号(alipay_cert_sn)

请求时,支付宝返回报错信息:{"code":"40002","msg":"Invalid Arguments","sub_code":"isv.alipay-cert-not-exist","sub_msg":"支付宝公钥证书不存在"}

请求参数中指定的支付宝公钥证书不存在。请检查是否下载使用了应用最新的支付宝公钥证书,下载方式详见签名专区教程。


验签问题

问题描述解决方案
SDK抛出异常:java.lang.NullPointerException: alipayPublicKey should not be NULL。代码中支付宝公钥(alipay_public_key)参数未赋值导致。请把支付宝公钥赋值给该参数。教程
SDK抛出异常:java.security.InvalidKeyException代码中支付宝公钥(alipay_public_key)参数内容错误导致。请核对。
SDK抛出异常:com.alipay.api.AlipayApiException: sign check fail: check Sign and Data Fail

支付宝返回内容验签失败。
1>.检查网关地址(gateway)是生产环境还是沙箱环境,必须使用与之匹配的应用id(app_id)与支付宝公钥(alipay_public_key)
2>.检查编码类型(charset)是否正确。
3>.检查代码中支付宝公钥(alipay_public_key)参数与开放平台上获取的支付宝公钥是否一致。

SDK抛出异常:Caused by: java.security.SignatureException: Signature length not correct: got 256 but was expecting 128

支付宝公钥(alipay_public_key)与签名类型(sign_type)不匹配。Sign_type设置为RSA2,alipay_public_key需使用对应的支付宝公钥,不能使用开放平台RSA类型下的支付宝公钥。

SDK抛出异常:Caused by: java.security.SignatureException: Signature length not correct: got 128 but was expecting 256

支付宝公钥(alipay_public_key)与签名类型(sign_type)不匹配。Sign_type设置了RSA,alipay_public_key需使用对应的支付宝公钥,不能使用开放平台RSA2类型下的支付宝公钥。

AlipaySignature.rsaCheckV1()方法返回false验签失败,方法同上。

AlipayRootCert Is Invalid

初始化解析不到有效的支付宝根证书文件,建议检查根证书文件是否正确

AppCert Is Invalid

初始化解析不到有效的应用根证书文件,建议检查应用证书文件是否正确。


TIPS:开放平台SDK提供了AlipaySignature.rsaCheckV1()与AlipaySignature.rsaCheckV2()两个版本。V1验签时会剔除sign_type参数,V2会保留sign_type参数。V2仅适用于生活号接口。


未使用开放平台SDK


未使用开放平台SDK,请参考此处流程

onlineServer