mirror of
				https://gitee.com/binary/weixin-java-tools.git
				synced 2025-10-31 18:46:10 +08:00 
			
		
		
		
	🎨 #3498【微信支付】服务商模式-兼容公钥模式下请求头序列号以及灰度切换
This commit is contained in:
		| @ -320,16 +320,7 @@ public class WxPayConfig { | ||||
|       //构造Http Proxy正向代理 | ||||
|       WxPayHttpProxy wxPayHttpProxy = getWxPayHttpProxy(); | ||||
|  | ||||
|       Verifier certificatesVerifier; | ||||
|       if (publicKey == null) { | ||||
|         certificatesVerifier = | ||||
|           new AutoUpdateCertificatesVerifier( | ||||
|             new WxPayCredentials(mchId, new PrivateKeySigner(certSerialNo, merchantPrivateKey)), | ||||
|             this.getApiV3Key().getBytes(StandardCharsets.UTF_8), this.getCertAutoUpdateTime(), | ||||
|             this.getPayBaseUrl(), wxPayHttpProxy); | ||||
|       } else { | ||||
|         certificatesVerifier = new PublicCertificateVerifier(publicKey, publicKeyId); | ||||
|       } | ||||
|       Verifier certificatesVerifier = getVerifier(merchantPrivateKey, wxPayHttpProxy, publicKey); | ||||
|  | ||||
|       WxPayV3HttpClientBuilder wxPayV3HttpClientBuilder = WxPayV3HttpClientBuilder.create() | ||||
|         .withMerchant(mchId, certSerialNo, merchantPrivateKey) | ||||
| @ -355,6 +346,19 @@ public class WxPayConfig { | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   private Verifier getVerifier(PrivateKey merchantPrivateKey, WxPayHttpProxy wxPayHttpProxy, PublicKey publicKey) { | ||||
|     Verifier certificatesVerifier = new AutoUpdateCertificatesVerifier( | ||||
|       new WxPayCredentials(mchId, new PrivateKeySigner(certSerialNo, merchantPrivateKey)), | ||||
|       this.getApiV3Key().getBytes(StandardCharsets.UTF_8), this.getCertAutoUpdateTime(), | ||||
|       this.getPayBaseUrl(), wxPayHttpProxy); | ||||
|     if (publicKey != null) { | ||||
|       Verifier publicCertificatesVerifier = new PublicCertificateVerifier(publicKey, publicKeyId); | ||||
|       publicCertificatesVerifier.setOtherVerifier(certificatesVerifier); | ||||
|       certificatesVerifier = publicCertificatesVerifier; | ||||
|     } | ||||
|     return certificatesVerifier; | ||||
|   } | ||||
|  | ||||
|   /** | ||||
|    * 初始化一个WxPayHttpProxy对象 | ||||
|    * | ||||
|  | ||||
| @ -100,6 +100,8 @@ public class WxPayServiceApacheHttpImpl extends BaseWxPayServiceImpl { | ||||
|     HttpPost httpPost = this.createHttpPost(url, requestStr); | ||||
|     httpPost.addHeader(ACCEPT, APPLICATION_JSON); | ||||
|     httpPost.addHeader(CONTENT_TYPE, APPLICATION_JSON); | ||||
|     String serialNumber = getWechatpaySerial(getConfig()); | ||||
|     httpPost.addHeader("Wechatpay-Serial", serialNumber); | ||||
|     try (CloseableHttpResponse response = httpClient.execute(httpPost)) { | ||||
|       //v3已经改为通过状态码判断200 204 成功 | ||||
|       int statusCode = response.getStatusLine().getStatusCode(); | ||||
| @ -387,10 +389,9 @@ public class WxPayServiceApacheHttpImpl extends BaseWxPayServiceImpl { | ||||
|    * @return | ||||
|    */ | ||||
|   private String getWechatpaySerial(WxPayConfig wxPayConfig) { | ||||
|     String serialNumber = wxPayConfig.getVerifier().getValidCertificate().getSerialNumber().toString(16).toUpperCase(); | ||||
|     if (StringUtils.isNotBlank(wxPayConfig.getPublicKeyId())) { | ||||
|       serialNumber = wxPayConfig.getPublicKeyId(); | ||||
|       return wxPayConfig.getPublicKeyId(); | ||||
|     } | ||||
|     return serialNumber; | ||||
|     return wxPayConfig.getVerifier().getValidCertificate().getSerialNumber().toString(16).toUpperCase(); | ||||
|   } | ||||
| } | ||||
|  | ||||
| @ -9,6 +9,8 @@ public class PublicCertificateVerifier implements Verifier{ | ||||
|  | ||||
|     private final PublicKey publicKey; | ||||
|  | ||||
|     private Verifier certificateVerifier; | ||||
|  | ||||
|     private final X509PublicCertificate publicCertificate; | ||||
|  | ||||
|     public PublicCertificateVerifier(PublicKey publicKey, String publicId) { | ||||
| @ -16,8 +18,15 @@ public class PublicCertificateVerifier implements Verifier{ | ||||
|         this.publicCertificate = new X509PublicCertificate(publicKey, publicId); | ||||
|     } | ||||
|  | ||||
|    public void setOtherVerifier(Verifier verifier) { | ||||
|       this.certificateVerifier = verifier; | ||||
|    } | ||||
|  | ||||
|     @Override | ||||
|     public boolean verify(String serialNumber, byte[] message, String signature) { | ||||
|         if (!serialNumber.contains("PUB_KEY_ID")) { | ||||
|             return this.certificateVerifier.verify(serialNumber, message, signature); | ||||
|         } | ||||
|         try { | ||||
|             Signature sign = Signature.getInstance("SHA256withRSA"); | ||||
|             sign.initVerify(publicKey); | ||||
|  | ||||
| @ -7,4 +7,6 @@ public interface Verifier { | ||||
|  | ||||
|  | ||||
|   X509Certificate getValidCertificate(); | ||||
|  | ||||
|   default void setOtherVerifier(Verifier verifier) {}; | ||||
| } | ||||
|  | ||||
		Reference in New Issue
	
	Block a user
	 SynchPj
					SynchPj