mirror of
https://github.com/dromara/payment-spring-boot.git
synced 2026-03-14 05:43:46 +08:00
init 2.0.0
This commit is contained in:
@@ -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 <T> String link(T t) {
|
||||
Assert.hasText(appSecret, "wechat pay appSecret is required");
|
||||
String json = OBJECT_MAPPER
|
||||
String json = OBJECT_MAPPER
|
||||
.writeValueAsString(t);
|
||||
|
||||
TreeMap<String, String> map = OBJECT_MAPPER.readValue(json, new TypeReference<TreeMap<String, String>>() {
|
||||
@@ -200,8 +199,8 @@ public abstract class BaseModel {
|
||||
public JsonNode request(String mchId, HttpMethod method, String url) {
|
||||
String xml = this.xml();
|
||||
RequestEntity<String> 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<String> responseEntity = this.getRestTemplateClientAuthentication(mchId)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user