Commit 9847d4cdb198ded812951ce7f7167004b550a041

Authored by YunaiV
1 parent be86acb9

fix:【PAY 支付】支付宝回调时,区分公钥模式、证书模式

yudao-module-pay/yudao-spring-boot-starter-biz-pay/src/main/java/cn/iocoder/yudao/framework/pay/core/client/impl/alipay/AbstractAlipayPayClient.java
@@ -23,6 +23,8 @@ import com.alipay.api.AlipayResponse; @@ -23,6 +23,8 @@ import com.alipay.api.AlipayResponse;
23 import com.alipay.api.DefaultAlipayClient; 23 import com.alipay.api.DefaultAlipayClient;
24 import com.alipay.api.domain.*; 24 import com.alipay.api.domain.*;
25 import com.alipay.api.internal.util.AlipaySignature; 25 import com.alipay.api.internal.util.AlipaySignature;
  26 +import com.alipay.api.internal.util.AntCertificationUtil;
  27 +import com.alipay.api.internal.util.codec.Base64;
26 import com.alipay.api.request.*; 28 import com.alipay.api.request.*;
27 import com.alipay.api.response.*; 29 import com.alipay.api.response.*;
28 import lombok.Getter; 30 import lombok.Getter;
@@ -30,6 +32,7 @@ import lombok.SneakyThrows; @@ -30,6 +32,7 @@ import lombok.SneakyThrows;
30 import lombok.extern.slf4j.Slf4j; 32 import lombok.extern.slf4j.Slf4j;
31 33
32 import java.nio.charset.StandardCharsets; 34 import java.nio.charset.StandardCharsets;
  35 +import java.security.cert.X509Certificate;
33 import java.time.LocalDateTime; 36 import java.time.LocalDateTime;
34 import java.util.Collections; 37 import java.util.Collections;
35 import java.util.Map; 38 import java.util.Map;
@@ -88,7 +91,10 @@ public abstract class AbstractAlipayPayClient extends AbstractPayClient<AlipayPa @@ -88,7 +91,10 @@ public abstract class AbstractAlipayPayClient extends AbstractPayClient<AlipayPa
88 verify = AlipaySignature.rsaCheckV1(params, config.getAlipayPublicKey(), 91 verify = AlipaySignature.rsaCheckV1(params, config.getAlipayPublicKey(),
89 StandardCharsets.UTF_8.name(), config.getSignType()); 92 StandardCharsets.UTF_8.name(), config.getSignType());
90 } else if (Objects.equals(config.getMode(), MODE_CERTIFICATE)) { 93 } else if (Objects.equals(config.getMode(), MODE_CERTIFICATE)) {
91 - verify = AlipaySignature.rsaCertCheckV1(params, config.getAlipayPublicCertContent(), 94 + // 由于 rsaCertCheckV1 的第二个参数是 path,所以不能这么调用!!!通过阅读源码,发现可以采用如下方式!
  95 + X509Certificate cert = AntCertificationUtil.getCertFromContent(config.getAlipayPublicCertContent());
  96 + String publicKey = Base64.encodeBase64String(cert.getEncoded());
  97 + verify = AlipaySignature.rsaCheckV1(bodyObj, publicKey,
92 StandardCharsets.UTF_8.name(), config.getSignType()); 98 StandardCharsets.UTF_8.name(), config.getSignType());
93 } else { 99 } else {
94 throw new IllegalArgumentException("未知的公钥类型:" + config.getMode()); 100 throw new IllegalArgumentException("未知的公钥类型:" + config.getMode());