fix: 修复微信支付v3 api 构建失败报“无可用的平台证书...”问题。

This commit is contained in:
qp_fss
2025-04-30 02:02:33 +08:00
parent e6d73249fd
commit 5d17b343ee
2 changed files with 22 additions and 12 deletions

View File

@@ -15,6 +15,7 @@ import org.apache.commons.lang3.RegExUtils;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.ssl.SSLContexts; import org.apache.http.ssl.SSLContexts;
import org.dromara.daxpay.channel.wechat.code.WechatPayCode;
import javax.net.ssl.SSLContext; import javax.net.ssl.SSLContext;
import java.io.*; import java.io.*;
@@ -42,6 +43,12 @@ public class WxPayConfig {
private static final String PROBLEM_MSG = "证书文件【%s】有问题请核实"; private static final String PROBLEM_MSG = "证书文件【%s】有问题请核实";
private static final String NOT_FOUND_MSG = "证书文件【%s】不存在请核实"; private static final String NOT_FOUND_MSG = "证书文件【%s】不存在请核实";
/**
* 接口版本, 使用v2还是v3接口
* @see WechatPayCode#API_V2
*/
private String apiVersion;
/** /**
* 微信支付接口请求地址域名部分. * 微信支付接口请求地址域名部分.
*/ */
@@ -277,7 +284,6 @@ public class WxPayConfig {
* 初始化api v3请求头 自动签名验签 * 初始化api v3请求头 自动签名验签
* 方法参照 <a href="https://github.com/wechatpay-apiv3/wechatpay-apache-httpclient">微信支付官方api项目</a> * 方法参照 <a href="https://github.com/wechatpay-apiv3/wechatpay-apache-httpclient">微信支付官方api项目</a>
* *
* @return org.apache.http.impl.client.CloseableHttpClient
* @author doger.wang * @author doger.wang
**/ **/
public CloseableHttpClient initApiV3HttpClient() throws WxPayException { public CloseableHttpClient initApiV3HttpClient() throws WxPayException {
@@ -353,16 +359,19 @@ public class WxPayConfig {
boolean pathC = this.getPrivateCertContent() != null && this.getPrivateKeyContent() != null; boolean pathC = this.getPrivateCertContent() != null && this.getPrivateKeyContent() != null;
boolean pathS = this.getPrivateCertString() != null && this.getPrivateKeyString() != null; boolean pathS = this.getPrivateCertString() != null && this.getPrivateKeyString() != null;
if (pathB || pathC || pathS) { if(WechatPayCode.API_V2.equals(this.getApiVersion())){
certificatesVerifier = new AutoUpdateCertificatesVerifier( if (pathB || pathC || pathS) {
new WxPayCredentials(mchId, new PrivateKeySigner(certSerialNo, merchantPrivateKey)), certificatesVerifier = new AutoUpdateCertificatesVerifier(
this.getApiV3Key().getBytes(StandardCharsets.UTF_8), this.getCertAutoUpdateTime(), new WxPayCredentials(mchId, new PrivateKeySigner(certSerialNo, merchantPrivateKey)),
this.getPayBaseUrl(), wxPayHttpProxy); this.getApiV3Key().getBytes(StandardCharsets.UTF_8), this.getCertAutoUpdateTime(),
} this.getPayBaseUrl(), wxPayHttpProxy);
if (publicKey != null) { }
Verifier publicCertificatesVerifier = new PublicCertificateVerifier(publicKey, publicKeyId); }else{
publicCertificatesVerifier.setOtherVerifier(certificatesVerifier); if (publicKey != null) {
certificatesVerifier = publicCertificatesVerifier; Verifier publicCertificatesVerifier = new PublicCertificateVerifier(publicKey, publicKeyId);
publicCertificatesVerifier.setOtherVerifier(certificatesVerifier);
certificatesVerifier = publicCertificatesVerifier;
}
} }
return certificatesVerifier; return certificatesVerifier;
} }
@@ -493,4 +502,4 @@ public class WxPayConfig {
return null; return null;
} }
} }

View File

@@ -168,6 +168,7 @@ public class WechatPayConfigService {
payConfig.setSubAppId(wechatPayConfig.getSubAppId()); payConfig.setSubAppId(wechatPayConfig.getSubAppId());
payConfig.setMchKey(wechatPayConfig.getApiKeyV2()); payConfig.setMchKey(wechatPayConfig.getApiKeyV2());
payConfig.setApiV3Key(wechatPayConfig.getApiKeyV3()); payConfig.setApiV3Key(wechatPayConfig.getApiKeyV3());
payConfig.setApiVersion(wechatPayConfig.getApiVersion());
// 注意不要使用base64的方式进行配置, 因为wxjava 是直接读取文本并不会进行解码, 会导致证书异常 // 注意不要使用base64的方式进行配置, 因为wxjava 是直接读取文本并不会进行解码, 会导致证书异常
if (StrUtil.isNotBlank(wechatPayConfig.getPublicKey())){ if (StrUtil.isNotBlank(wechatPayConfig.getPublicKey())){
payConfig.setPublicKeyContent(Base64.decode(wechatPayConfig.getPublicKey())); payConfig.setPublicKeyContent(Base64.decode(wechatPayConfig.getPublicKey()));