支付宝开放平台SDK封装了签名和验签过程,只需配置账号及密钥参数,强烈建议使用。
如果使用了开放平台SDK,签名验签问题通常是因为密钥配置错误导致。
配置代码示例,问题描述中会以示例中的变量名为例:
AlipayClient alipayClient = new DefaultAlipayClient(gateway,app_id,private_key,"json",charset,alipay_public_key,sign_type);
问题描述 | 解决方案 |
---|---|
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":"无效签名"}” | 签名校验失败。 |
问题描述 | 解决方案 |
---|---|
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!” | 支付宝返回内容验签失败。 |
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 | 验签失败,方法同上。 |
未使用开放平台SDK,请参考此处流程。