Commit 9847d4cdb198ded812951ce7f7167004b550a041
1 parent
be86acb9
fix:【PAY 支付】支付宝回调时,区分公钥模式、证书模式
Showing
1 changed file
with
7 additions
and
1 deletions
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()); |