From 2bd091e268b3836f088e52e209d218d81b49ffd5 Mon Sep 17 00:00:00 2001 From: xiafang Date: Tue, 27 Jun 2023 14:01:26 +0800 Subject: [PATCH] init 2.0.0 --- payment-spring-boot-autoconfigure/pom.xml | 36 ++++++ .../payment/wechat/v2/model/BaseModel.java | 13 +- .../wechat/v3/client/RetrofitFactory.java | 122 ++++++++++++++++++ pom.xml | 78 ++++++++++- 4 files changed, 241 insertions(+), 8 deletions(-) create mode 100644 payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/client/RetrofitFactory.java diff --git a/payment-spring-boot-autoconfigure/pom.xml b/payment-spring-boot-autoconfigure/pom.xml index 89ed791..9383645 100644 --- a/payment-spring-boot-autoconfigure/pom.xml +++ b/payment-spring-boot-autoconfigure/pom.xml @@ -64,6 +64,42 @@ spring-boot-starter-web provided + + com.squareup.retrofit2 + retrofit + + + com.squareup.retrofit2 + adapter-rxjava3 + + + com.squareup.retrofit2 + converter-jaxb + + + com.squareup.retrofit2 + converter-jackson + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + com.squareup.okhttp3 + okhttp + + + com.squareup.okhttp3 + logging-interceptor + + + org.slf4j + slf4j-api + org.bouncycastle bcprov-jdk15to18 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 f5ceb41..b65aeca 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 @@ -73,7 +73,7 @@ import java.util.stream.Collectors; */ @Getter public abstract class BaseModel { - public static final String HMAC_SHA256="HMAC-SHA256"; + public static final String HMAC_SHA256 = "HMAC-SHA256"; private static final XmlMapper XML_MAPPER = new XmlMapper(); private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper(); @@ -84,8 +84,7 @@ public abstract class BaseModel { .setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE); OBJECT_MAPPER // .configure(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY, true) - .setSerializationInclusion(JsonInclude.Include.NON_NULL) - .setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE); + .setSerializationInclusion(JsonInclude.Include.NON_NULL); } @@ -165,7 +164,7 @@ public abstract class BaseModel { @SneakyThrows private String hmacSha256(String src) { String algorithm = "HmacSHA256"; - Mac sha256HMAC = Mac.getInstance(algorithm,"BC"); + Mac sha256HMAC = Mac.getInstance(algorithm, "BC"); SecretKeySpec secretKeySpec = new SecretKeySpec(appSecret.getBytes(), algorithm); sha256HMAC.init(secretKeySpec); byte[] bytes = sha256HMAC.doFinal(src.getBytes(StandardCharsets.UTF_8)); @@ -182,7 +181,7 @@ public abstract class BaseModel { @SneakyThrows private String link(T t) { Assert.hasText(appSecret, "wechat pay appSecret is required"); - String json = OBJECT_MAPPER + String json = OBJECT_MAPPER .writeValueAsString(t); TreeMap map = OBJECT_MAPPER.readValue(json, new TypeReference>() { @@ -200,8 +199,8 @@ public abstract class BaseModel { public JsonNode request(String mchId, HttpMethod method, String url) { String xml = this.xml(); RequestEntity body = RequestEntity.method(method, UriComponentsBuilder.fromHttpUrl(url) - .build() - .toUri()) + .build() + .toUri()) .contentType(MediaType.valueOf("application/x-www-form-urlencoded;charset=UTF-8")) .body(xml); ResponseEntity responseEntity = this.getRestTemplateClientAuthentication(mchId) diff --git a/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/client/RetrofitFactory.java b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/client/RetrofitFactory.java new file mode 100644 index 0000000..f455f7c --- /dev/null +++ b/payment-spring-boot-autoconfigure/src/main/java/cn/felord/payment/wechat/v3/client/RetrofitFactory.java @@ -0,0 +1,122 @@ +/* + * Copyright 2019-2022 felord.cn + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * Website: + * https://felord.cn + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package cn.felord.payment.wechat.v3.client; + + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.PropertyNamingStrategy; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import okhttp3.ConnectionPool; +import okhttp3.OkHttpClient; +import okhttp3.logging.HttpLoggingInterceptor; +import retrofit2.Retrofit; +import retrofit2.adapter.rxjava3.RxJava3CallAdapterFactory; +import retrofit2.converter.jackson.JacksonConverterFactory; + +import java.util.concurrent.TimeUnit; + +/** + * The type Retrofit factory. + * + * @author dax + * @since 2023 /5/21 + */ +public final class RetrofitFactory { + + /** + * The constant JACKSON_CONVERTER_FACTORY. + */ + public static final JacksonConverterFactory JACKSON_CONVERTER_FACTORY = JacksonConverterFactoryBuilder.build(); + + /** + * Create retrofit. + * + * @param baseUrl the base url + * @return the retrofit + */ + public static Retrofit create(String baseUrl) { + return create(baseUrl, new ConnectionPool()); + } + + /** + * Create retrofit. + * + * @param baseUrl the base url + * @param connectionPool the connection pool + * @return the retrofit + */ + public static Retrofit create(String baseUrl, ConnectionPool connectionPool) { + return create(baseUrl, connectionPool, HttpLoggingInterceptor.Level.NONE); + } + + /** + * Create retrofit. + * + * @param baseUrl the base url + * @param connectionPool the connection pool + * @param level the level + * @return the retrofit + */ + public static Retrofit create(String baseUrl, ConnectionPool connectionPool, HttpLoggingInterceptor.Level level) { + return new Retrofit.Builder() + .baseUrl(baseUrl) + .client(okHttpClient(connectionPool, level)) + .addCallAdapterFactory(RxJava3CallAdapterFactory.create()) + .addConverterFactory(JACKSON_CONVERTER_FACTORY) + .build(); + } + + private static OkHttpClient okHttpClient(ConnectionPool connectionPool, HttpLoggingInterceptor.Level level) { + HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor(); + httpLoggingInterceptor.level(level); + return new OkHttpClient.Builder() + .connectionPool(connectionPool) + .addInterceptor(httpLoggingInterceptor) + .retryOnConnectionFailure(true) + .connectTimeout(30, TimeUnit.SECONDS) + .readTimeout(30, TimeUnit.SECONDS) + .writeTimeout(30, TimeUnit.SECONDS) + .build(); + } + + + /** + * The type Jackson converter factory builder. + */ + static final class JacksonConverterFactoryBuilder { + private JacksonConverterFactoryBuilder() { + } + + /** + * Build jackson converter factory. + * + * @return the jackson converter factory + */ + public static JacksonConverterFactory build() { + ObjectMapper objectMapper = new ObjectMapper().setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE) + .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + // empty string error + .configure(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT, true) + .setSerializationInclusion(JsonInclude.Include.NON_NULL) + .registerModule(new JavaTimeModule()); + return JacksonConverterFactory.create(objectMapper); + } + } +} diff --git a/pom.xml b/pom.xml index 448adcb..07c2b7f 100644 --- a/pom.xml +++ b/pom.xml @@ -91,6 +91,11 @@ 2.7.7 4.31.7.ALL 1.69 + 2.9.0 + 4.10.0 + 1.18.26 + 2.13.5 + 2.0.7 @@ -116,7 +121,6 @@ pom import - com.alipay.sdk alipay-sdk-java @@ -132,6 +136,78 @@ payment-spring-boot-autoconfigure ${project.version} + + com.squareup.retrofit2 + retrofit + ${retrofit.version} + + + com.squareup.okhttp3 + okhttp + + + + + com.squareup.retrofit2 + adapter-rxjava3 + ${retrofit.version} + + + com.squareup.retrofit2 + converter-jaxb + ${retrofit.version} + + + com.squareup.retrofit2 + converter-jackson + + + com.fasterxml.jackson.core + jackson-databind + + + ${retrofit.version} + + + com.squareup.okhttp3 + okhttp + ${okhttp3.version} + + + com.squareup.okhttp3 + logging-interceptor + ${okhttp3.version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + com.fasterxml.jackson.datatype + jackson-datatype-jdk8 + ${jackson.version} + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + ${jackson.version} + + + com.fasterxml.jackson.module + jackson-module-parameter-names + ${jackson.version} + + + org.slf4j + slf4j-api + ${slf4j.version} + + + org.projectlombok + lombok + ${lombok.version} +