From b0cfd8142320d7635f4a0aeab0e93fb6c50f2000 Mon Sep 17 00:00:00 2001 From: Jacky <17600037713@163.com> Date: Tue, 12 Nov 2024 16:09:05 +0800 Subject: [PATCH] chore(): migrate sdk version - migrate apache httpclient to httpclient5 https://hc.apache.org/httpcomponents-client-5.4.x/migration-guide/migration-to-classic.html - upgrade jdk version to 17 - upgrade springboot 3.2.5 --- payment-spring-boot-autoconfigure/pom.xml | 17 ++++---- .../payment/wechat/v2/model/BaseModel.java | 43 ++++++++++++++----- .../payment/wechat/v3/SignatureProvider.java | 11 +++-- .../payment/wechat/v3/WechatPayClient.java | 7 +-- payment-spring-boot-starter/pom.xml | 15 ++++--- pom.xml | 13 +++--- 6 files changed, 66 insertions(+), 40 deletions(-) diff --git a/payment-spring-boot-autoconfigure/pom.xml b/payment-spring-boot-autoconfigure/pom.xml index 86214da8..1bed04d2 100644 --- a/payment-spring-boot-autoconfigure/pom.xml +++ b/payment-spring-boot-autoconfigure/pom.xml @@ -22,20 +22,20 @@ cn.felord payment-spring-boot - 1.0.20.RELEASE + ${revision} payment-spring-boot-autoconfigure - 1.0.20.RELEASE + ${revision} jar 4.0.0 - 1.8 - 1.8 + 17 + 17 UTF-8 UTF-8 - 1.8 + 17 @@ -74,9 +74,10 @@ alipay-sdk-java - org.apache.httpcomponents - httpclient - provided + org.apache.httpcomponents.client5 + httpclient5 + 5.2.3 + com.fasterxml.jackson.dataformat diff --git a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v2/model/BaseModel.java b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v2/model/BaseModel.java index f5ceb41e..579dd972 100644 --- a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v2/model/BaseModel.java +++ b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v2/model/BaseModel.java @@ -28,11 +28,20 @@ import com.fasterxml.jackson.dataformat.xml.XmlMapper; import lombok.Getter; import lombok.SneakyThrows; -import org.apache.http.conn.ssl.NoopHostnameVerifier; -import org.apache.http.conn.ssl.SSLConnectionSocketFactory; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClients; -import org.apache.http.ssl.SSLContextBuilder; +import org.apache.hc.client5.http.config.ConnectionConfig; +import org.apache.hc.client5.http.impl.classic.CloseableHttpClient; +import org.apache.hc.client5.http.impl.classic.HttpClients; +import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager; +import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManagerBuilder; +import org.apache.hc.client5.http.ssl.SSLConnectionSocketFactoryBuilder; +import org.apache.hc.core5.http.io.SocketConfig; +import org.apache.hc.core5.http.ssl.TLS; +import org.apache.hc.core5.pool.PoolConcurrencyPolicy; +import org.apache.hc.core5.pool.PoolReusePolicy; +import org.apache.hc.core5.ssl.SSLContextBuilder; +import org.apache.hc.core5.ssl.SSLContexts; +import org.apache.hc.core5.util.TimeValue; +import org.apache.hc.core5.util.Timeout; import org.bouncycastle.crypto.Digest; import org.bouncycastle.crypto.digests.MD5Digest; import org.bouncycastle.util.encoders.Hex; @@ -65,6 +74,7 @@ import java.util.TreeMap; import java.util.stream.Collectors; + /** * The type Base model. * @@ -231,13 +241,26 @@ private RestTemplate getRestTemplateClientAuthentication(String mchId) SSLContext sslcontext = SSLContextBuilder.create() .loadKeyMaterial(store, pem) .build(); - // Allow TLSv1 protocol only - HostnameVerifier hostnameVerifier = NoopHostnameVerifier.INSTANCE; - SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[]{"TLSv1"}, - null, hostnameVerifier); + + PoolingHttpClientConnectionManager connectionManager = PoolingHttpClientConnectionManagerBuilder.create() + .setSSLSocketFactory(SSLConnectionSocketFactoryBuilder.create() + .setSslContext(SSLContexts.createSystemDefault()) + .setTlsVersions(TLS.V_1_3) + .build()) + .setDefaultSocketConfig(SocketConfig.custom() + .setSoTimeout(Timeout.ofMinutes(1)) + .build()) + .setPoolConcurrencyPolicy(PoolConcurrencyPolicy.STRICT) + .setConnPoolPolicy(PoolReusePolicy.LIFO) + .setDefaultConnectionConfig(ConnectionConfig.custom() + .setSocketTimeout(Timeout.ofMinutes(1)) + .setConnectTimeout(Timeout.ofMinutes(1)) + .setTimeToLive(TimeValue.ofMinutes(10)) + .build()) + .build(); CloseableHttpClient httpclient = HttpClients.custom() - .setSSLSocketFactory(sslsf) + .setConnectionManager(connectionManager) .build(); HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(httpclient); return new RestTemplate(clientHttpRequestFactory); diff --git a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/SignatureProvider.java b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/SignatureProvider.java index b949cd66..0f554b91 100644 --- a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/SignatureProvider.java +++ b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/SignatureProvider.java @@ -32,7 +32,6 @@ import org.springframework.http.converter.xml.MappingJackson2XmlHttpMessageConverter; import org.springframework.util.AlternativeJdkIdGenerator; import org.springframework.util.Assert; -import org.springframework.util.Base64Utils; import org.springframework.util.IdGenerator; import org.springframework.web.client.RestOperations; import org.springframework.web.client.RestTemplate; @@ -161,7 +160,7 @@ public String doRequestSign(PrivateKey privateKey, String... orderedComponents) signer.initSign(privateKey); final String signatureStr = createSign(orderedComponents); signer.update(signatureStr.getBytes(StandardCharsets.UTF_8)); - return Base64Utils.encodeToString(signer.sign()); + return Base64.getEncoder().encodeToString(signer.sign()); } /** @@ -189,7 +188,7 @@ public boolean responseSignVerify(ResponseSignVerifyParams params) { Signature signer = Signature.getInstance("SHA256withRSA", BC_PROVIDER); signer.initVerify(certificate.getX509Certificate()); signer.update(signatureStr.getBytes(StandardCharsets.UTF_8)); - return signer.verify(Base64Utils.decodeFromString(params.getWechatpaySignature())); + return signer.verify(Base64.getDecoder().decode((params.getWechatpaySignature()))); } catch (Exception e) { throw new PayException("An exception occurred during the response verification, the cause: " + e.getMessage()); } @@ -288,7 +287,7 @@ public String decryptResponseBody(String tenantId, String associatedData, String byte[] bytes; try { - bytes = cipher.doFinal(Base64Utils.decodeFromString(ciphertext)); + bytes = cipher.doFinal(Base64.getDecoder().decode((ciphertext))); } catch (GeneralSecurityException e) { throw new PayException(e); } @@ -314,7 +313,7 @@ public String encryptRequestMessage(String message, Certificate certificate) { byte[] data = message.getBytes(StandardCharsets.UTF_8); byte[] cipherData = cipher.doFinal(data); - return Base64Utils.encodeToString(cipherData); + return Base64.getEncoder().encodeToString(cipherData); } catch (Exception e) { throw new PayException(e); @@ -335,7 +334,7 @@ public String decryptResponseMessage(String message, String tenantId) { PrivateKey privateKey = wechatMetaBean.getKeyPair().getPrivate(); Cipher cipher = Cipher.getInstance("RSA/ECB/OAEPWithSHA-1AndMGF1Padding", BC_PROVIDER); cipher.init(Cipher.DECRYPT_MODE, privateKey); - byte[] data = Base64Utils.decodeFromString(message); + byte[] data = Base64.getDecoder().decode((message)); byte[] cipherData = cipher.doFinal(data); return new String(cipherData, StandardCharsets.UTF_8); diff --git a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatPayClient.java b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatPayClient.java index 6c987baf..635b2598 100644 --- a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatPayClient.java +++ b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/WechatPayClient.java @@ -252,7 +252,8 @@ private void doExecute(WechatRequestEntity requestEntity) { ResponseEntity responseEntity = restOperations.exchange(requestEntity, ObjectNode.class); HttpHeaders headers = responseEntity.getHeaders(); ObjectNode body = responseEntity.getBody(); - HttpStatus statusCode = responseEntity.getStatusCode(); + HttpStatusCode statusCode = responseEntity.getStatusCode(); + // 微信请求id String requestId = headers.getFirst("Request-ID"); if (!statusCode.is2xxSuccessful()) { @@ -298,7 +299,7 @@ private String doDownload(WechatRequestEntity requestEntity) { ResponseEntity responseEntity = restOperations.exchange(requestEntity, String.class); - HttpStatus statusCode = responseEntity.getStatusCode(); + HttpStatusCode statusCode = responseEntity.getStatusCode(); // 微信请求id String requestId = requestEntity.getHeaders().getFirst("Request-ID"); if (!statusCode.is2xxSuccessful()) { @@ -322,7 +323,7 @@ private ResponseEntity doResource(WechatRequestEntity requestEn ResponseEntity responseEntity = restOperations.exchange(requestEntity, Resource.class); - HttpStatus statusCode = responseEntity.getStatusCode(); + HttpStatusCode statusCode = responseEntity.getStatusCode(); // 微信请求id String requestId = requestEntity.getHeaders().getFirst("Request-ID"); if (!statusCode.is2xxSuccessful()) { diff --git a/payment-spring-boot-starter/pom.xml b/payment-spring-boot-starter/pom.xml index 52620ab0..ef9dc997 100644 --- a/payment-spring-boot-starter/pom.xml +++ b/payment-spring-boot-starter/pom.xml @@ -22,21 +22,21 @@ cn.felord payment-spring-boot - 1.0.20.RELEASE + ${revision} payment-spring-boot-starter - 1.0.20.RELEASE + ${revision} jar 4.0.0 - 1.8 - 1.8 + 17 + 17 UTF-8 UTF-8 - 1.8 + 17 @@ -53,8 +53,9 @@ bcprov-jdk15to18 - org.apache.httpcomponents - httpclient + org.apache.httpcomponents.client5 + httpclient5 + 5.2.3 com.fasterxml.jackson.dataformat diff --git a/pom.xml b/pom.xml index 4c8b1724..8d63b50e 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> cn.felord payment-spring-boot - 1.0.20.RELEASE + ${revision} pom 4.0.0 @@ -47,7 +47,7 @@ - payment-spring-boot-1.0.18.RELEASE + payment-spring-boot-${project.version} https://github.com/NotFound403/payment-spring-boot scm:git:https://github.com/NotFound403/payment-spring-boot.git scm:git:https://github.com/NotFound403/payment-spring-boot.git @@ -83,14 +83,15 @@ - 1.8 - 1.8 + 17 + 17 UTF-8 UTF-8 - 1.8 - 2.7.7 + 17 + 3.2.5 4.31.7.ALL 1.78 + 2.0.1.RELEASE