Skip to content

Commit 5ac9922

Browse files
authored
🎨 #3498【微信支付】服务商模式-兼容公钥模式下请求头序列号以及灰度切换
1 parent 03790d6 commit 5ac9922

File tree

4 files changed

+30
-14
lines changed

4 files changed

+30
-14
lines changed

weixin-java-pay/src/main/java/com/github/binarywang/wxpay/config/WxPayConfig.java

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -320,16 +320,7 @@ public CloseableHttpClient initApiV3HttpClient() throws WxPayException {
320320
//构造Http Proxy正向代理
321321
WxPayHttpProxy wxPayHttpProxy = getWxPayHttpProxy();
322322

323-
Verifier certificatesVerifier;
324-
if (publicKey == null) {
325-
certificatesVerifier =
326-
new AutoUpdateCertificatesVerifier(
327-
new WxPayCredentials(mchId, new PrivateKeySigner(certSerialNo, merchantPrivateKey)),
328-
this.getApiV3Key().getBytes(StandardCharsets.UTF_8), this.getCertAutoUpdateTime(),
329-
this.getPayBaseUrl(), wxPayHttpProxy);
330-
} else {
331-
certificatesVerifier = new PublicCertificateVerifier(publicKey, publicKeyId);
332-
}
323+
Verifier certificatesVerifier = getVerifier(merchantPrivateKey, wxPayHttpProxy, publicKey);
333324

334325
WxPayV3HttpClientBuilder wxPayV3HttpClientBuilder = WxPayV3HttpClientBuilder.create()
335326
.withMerchant(mchId, certSerialNo, merchantPrivateKey)
@@ -355,6 +346,19 @@ public CloseableHttpClient initApiV3HttpClient() throws WxPayException {
355346
}
356347
}
357348

349+
private Verifier getVerifier(PrivateKey merchantPrivateKey, WxPayHttpProxy wxPayHttpProxy, PublicKey publicKey) {
350+
Verifier certificatesVerifier = new AutoUpdateCertificatesVerifier(
351+
new WxPayCredentials(mchId, new PrivateKeySigner(certSerialNo, merchantPrivateKey)),
352+
this.getApiV3Key().getBytes(StandardCharsets.UTF_8), this.getCertAutoUpdateTime(),
353+
this.getPayBaseUrl(), wxPayHttpProxy);
354+
if (publicKey != null) {
355+
Verifier publicCertificatesVerifier = new PublicCertificateVerifier(publicKey, publicKeyId);
356+
publicCertificatesVerifier.setOtherVerifier(certificatesVerifier);
357+
certificatesVerifier = publicCertificatesVerifier;
358+
}
359+
return certificatesVerifier;
360+
}
361+
358362
/**
359363
* 初始化一个WxPayHttpProxy对象
360364
*
@@ -382,7 +386,7 @@ private InputStream loadConfigInputStream(String configString, String configPath
382386
if (configContent != null) {
383387
return new ByteArrayInputStream(configContent);
384388
}
385-
389+
386390
if (StringUtils.isNotEmpty(configString)) {
387391
configContent = Base64.getDecoder().decode(configString);
388392
return new ByteArrayInputStream(configContent);

weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/WxPayServiceApacheHttpImpl.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,8 @@ public String postV3(String url, String requestStr) throws WxPayException {
100100
HttpPost httpPost = this.createHttpPost(url, requestStr);
101101
httpPost.addHeader(ACCEPT, APPLICATION_JSON);
102102
httpPost.addHeader(CONTENT_TYPE, APPLICATION_JSON);
103+
String serialNumber = getWechatpaySerial(getConfig());
104+
httpPost.addHeader("Wechatpay-Serial", serialNumber);
103105
try (CloseableHttpResponse response = httpClient.execute(httpPost)) {
104106
//v3已经改为通过状态码判断200 204 成功
105107
int statusCode = response.getStatusLine().getStatusCode();
@@ -387,10 +389,9 @@ private WxPayException convertException(JsonObject jsonObject) {
387389
* @return
388390
*/
389391
private String getWechatpaySerial(WxPayConfig wxPayConfig) {
390-
String serialNumber = wxPayConfig.getVerifier().getValidCertificate().getSerialNumber().toString(16).toUpperCase();
391392
if (StringUtils.isNotBlank(wxPayConfig.getPublicKeyId())) {
392-
serialNumber = wxPayConfig.getPublicKeyId();
393+
return wxPayConfig.getPublicKeyId();
393394
}
394-
return serialNumber;
395+
return wxPayConfig.getVerifier().getValidCertificate().getSerialNumber().toString(16).toUpperCase();
395396
}
396397
}

weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/PublicCertificateVerifier.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,15 +9,24 @@ public class PublicCertificateVerifier implements Verifier{
99

1010
private final PublicKey publicKey;
1111

12+
private Verifier certificateVerifier;
13+
1214
private final X509PublicCertificate publicCertificate;
1315

1416
public PublicCertificateVerifier(PublicKey publicKey, String publicId) {
1517
this.publicKey = publicKey;
1618
this.publicCertificate = new X509PublicCertificate(publicKey, publicId);
1719
}
1820

21+
public void setOtherVerifier(Verifier verifier) {
22+
this.certificateVerifier = verifier;
23+
}
24+
1925
@Override
2026
public boolean verify(String serialNumber, byte[] message, String signature) {
27+
if (!serialNumber.contains("PUB_KEY_ID")) {
28+
return this.certificateVerifier.verify(serialNumber, message, signature);
29+
}
2130
try {
2231
Signature sign = Signature.getInstance("SHA256withRSA");
2332
sign.initVerify(publicKey);

weixin-java-pay/src/main/java/com/github/binarywang/wxpay/v3/auth/Verifier.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,6 @@ public interface Verifier {
77

88

99
X509Certificate getValidCertificate();
10+
11+
default void setOtherVerifier(Verifier verifier) {};
1012
}

0 commit comments

Comments
 (0)