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}
+