原因
项目需要实现自动提现到支付宝,涉及到资金类支出接口 ,所以需要升级密钥为公钥证书;
参考文档:支付宝密钥相关文档
准备证书
生成csr时保存下来的2个.txt(应用公钥没啥用,应用私钥需要妥善保存),支付宝平台下载 3个.csr(应用公钥证书、支付宝公钥证书、支付宝根证书);
代码修改
- 升级SDK版本,低版本SDK不支持证书模式
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.11.54.ALL</version>
</dependency>
- 升级初始化方式
private static final String URL = "https://openapi.alipay.com/gateway.do";
/**
* 数据类型
*/
public static final String DATA_FORMAT = "json";
public static final String CHARSET = CharsetUtil.UTF_8;
/**
* 签名类型
*/
public static final String SIGN_TYPE = "RSA2";
@Bean
public AlipayClient aplipayClient(AliPayProperties properties) {
try {
CertAlipayRequest certAlipayRequest = new CertAlipayRequest();
certAlipayRequest.setServerUrl(URL);
certAlipayRequest.setAppId(properties.getAppId());
//应用私钥,生成csr文件时,保存到本地的私钥txt文件
certAlipayRequest.setPrivateKey(readKey(properties.getMerchantPrivateKeyPath()));
certAlipayRequest.setFormat(DATA_FORMAT);
certAlipayRequest.setCharset(CHARSET);
certAlipayRequest.setSignType(SIGN_TYPE);
//应用公钥证书路径
certAlipayRequest.setCertPath(properties.getMerchantCertPath());
//支付宝公钥证书路径
certAlipayRequest.setAlipayPublicCertPath(properties.getAlipayCertPath());
//支付宝根证书路径
certAlipayRequest.setRootCertPath(properties.getAlipayRootCertPath());
return new DefaultAlipayClient(certAlipayRequest);
} catch (AlipayApiException e) {
AssertUtils.fail("AlipayClient初始化失败:"+e.getMessage());
return null;
}
}
private String readKey(String path) {
if (FileUtil.exist(path)) {
FileReader reader = new FileReader(path);
return reader.readString();
} else {
AssertUtils.fail("缺少支付宝应用密钥文件");
}
return null;
}
- alipayClient.execute改成 alipayClient.certificateExecute
- 回调验签方法 AlipaySignature.rsaCheckV1 升级为 AlipaySignature.rsaCertCheckV1