支付宝旧版回调验签使用的是 AlipayNotify.verify(params),新版本采用的是AlipaySignature.rsaCheckV1,AlipaySignature类在新版SDK包的路径com.alipay.api.internal.util中,但是在验签过程中报以下错误:
java.io.IOException: ObjectIdentifier mismatch: 2.16.840.1.101.3.4.2.1
调用的代码:
AlipaySignature.rsaCheckV1(params,"支付宝公钥","UTF-8");
注意支付宝公钥是在签约的支付宝基础应用中查看,支付宝基础应用中有查看(进入开发者中心,找到应用2.0签约,点应用信息标签,在页面上有查看应用公钥、查看支付宝公钥标签,点查看支付宝公钥标签,复制支付宝公钥,作为上面rsaCheckV1方法的第二个参数值)。
设置了公钥后,还需要修改rsaCheckV1的程序代码,在SDK中找到AlipaySignature.java,找到:
public static boolean rsaCheckContent(String content, String sign, String publicKey,
String charset) throws AlipayApiException {
try {
PublicKey pubKey = getPublicKeyFromX509("RSA",
new ByteArrayInputStream(publicKey.getBytes()));
java.security.Signature signature = java.security.Signature .getInstance(AlipayConstants.SIGN_ALGORITHMS);
AlipayConstants.SIGN_ALGORITHMS的值是SHA1WithRSA,因为我们用的是RSA2公钥,所以需要将上面的代码改为:
java.security.Signature signature = java.security.Signature .getInstance("SHA256WithRSA");
另外,因为使用SHA256,可能需要替换jre\lib\security目录下的两个jar包,US_export_policy.jar和local_policy.jar,从Oracle官方网站查找jce_policy-8.zip,替换本地的
jre\lib\security目录下这两个JAR包,按照上面的方法修改后,AlipaySignature.rsaCheckV1(params,"支付宝公钥","UTF-8"); 验签通过。