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

This commit is contained in:
YunaiV 2025-05-05 23:52:36 +08:00
parent be86acb9b6
commit 9847d4cdb1
1 changed files with 7 additions and 1 deletions

View File

@ -23,6 +23,8 @@ import com.alipay.api.AlipayResponse;
import com.alipay.api.DefaultAlipayClient; import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.domain.*; import com.alipay.api.domain.*;
import com.alipay.api.internal.util.AlipaySignature; import com.alipay.api.internal.util.AlipaySignature;
import com.alipay.api.internal.util.AntCertificationUtil;
import com.alipay.api.internal.util.codec.Base64;
import com.alipay.api.request.*; import com.alipay.api.request.*;
import com.alipay.api.response.*; import com.alipay.api.response.*;
import lombok.Getter; import lombok.Getter;
@ -30,6 +32,7 @@ import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.security.cert.X509Certificate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.Collections; import java.util.Collections;
import java.util.Map; import java.util.Map;
@ -88,7 +91,10 @@ public abstract class AbstractAlipayPayClient extends AbstractPayClient<AlipayPa
verify = AlipaySignature.rsaCheckV1(params, config.getAlipayPublicKey(), verify = AlipaySignature.rsaCheckV1(params, config.getAlipayPublicKey(),
StandardCharsets.UTF_8.name(), config.getSignType()); StandardCharsets.UTF_8.name(), config.getSignType());
} else if (Objects.equals(config.getMode(), MODE_CERTIFICATE)) { } else if (Objects.equals(config.getMode(), MODE_CERTIFICATE)) {
verify = AlipaySignature.rsaCertCheckV1(params, config.getAlipayPublicCertContent(), // 由于 rsaCertCheckV1 的第二个参数是 path所以不能这么调用通过阅读源码发现可以采用如下方式
X509Certificate cert = AntCertificationUtil.getCertFromContent(config.getAlipayPublicCertContent());
String publicKey = Base64.encodeBase64String(cert.getEncoded());
verify = AlipaySignature.rsaCheckV1(bodyObj, publicKey,
StandardCharsets.UTF_8.name(), config.getSignType()); StandardCharsets.UTF_8.name(), config.getSignType());
} else { } else {
throw new IllegalArgumentException("未知的公钥类型:" + config.getMode()); throw new IllegalArgumentException("未知的公钥类型:" + config.getMode());