🎨 优化代码

This commit is contained in:
Binary Wang 2020-07-11 21:40:33 +08:00
parent b93169e78c
commit 4ab50809d8
10 changed files with 116 additions and 46 deletions

View File

@ -3,21 +3,25 @@ package me.chanjar.weixin.common.util.json;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.google.gson.stream.JsonReader;
import lombok.NoArgsConstructor;
import java.io.Reader;
/**
* @author niefy
*/
public class GsonParser {
private static final JsonParser JSON_PARSER = new JsonParser();
public static JsonObject parse(String json){
public static JsonObject parse(String json) {
return JSON_PARSER.parse(json).getAsJsonObject();
}
public static JsonObject parse(Reader json){
public static JsonObject parse(Reader json) {
return JSON_PARSER.parse(json).getAsJsonObject();
}
public static JsonObject parse(JsonReader json){
public static JsonObject parse(JsonReader json) {
return JSON_PARSER.parse(json).getAsJsonObject();
}
}

View File

@ -13,7 +13,6 @@ import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
* @author chanjarster
*/
public class WxGsonBuilder {
private static final GsonBuilder INSTANCE = new GsonBuilder();
static {

View File

@ -71,6 +71,7 @@
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<!-- 待优化去掉 -->
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.10.4</version>

View File

@ -1,6 +1,7 @@
package com.github.binarywang.wxpay.bean.payscore;
import com.google.gson.annotations.SerializedName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@ -14,6 +15,7 @@ import java.io.Serializable;
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class TimeRange implements Serializable {
private static final long serialVersionUID = 8169562173656314930L;
/**

View File

@ -6,6 +6,7 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import me.chanjar.weixin.common.util.json.WxGsonBuilder;
import java.io.Serializable;
import java.util.List;
@ -22,6 +23,10 @@ import java.util.List;
public class WxPayScoreRequest implements Serializable {
private static final long serialVersionUID = 364764508076146082L;
public String toJson() {
return WxGsonBuilder.create().toJson(this);
}
/**
* out_order_no : 1234323JKHDFE1243252
* appid : wxd678efh567hg6787

View File

@ -3,6 +3,7 @@ package com.github.binarywang.wxpay.bean.payscore;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import lombok.NoArgsConstructor;
import me.chanjar.weixin.common.util.json.WxGsonBuilder;
import java.io.Serializable;
import java.util.List;
@ -17,6 +18,10 @@ import java.util.Map;
public class WxPayScoreResult implements Serializable {
private static final long serialVersionUID = 8809250065540275770L;
public static WxPayScoreResult fromJson(String json) {
return WxGsonBuilder.create().fromJson(json, WxPayScoreResult.class);
}
/**
* appid : wxd678efh567hg6787
* mchid : 1230000109

View File

@ -8,9 +8,8 @@ import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.PayScoreService;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.v3.util.AesUtils;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import lombok.RequiredArgsConstructor;
import me.chanjar.weixin.common.util.json.WxGsonBuilder;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.client.utils.URIBuilder;
@ -26,7 +25,6 @@ import java.util.Map;
*/
@RequiredArgsConstructor
public class PayScoreServiceImpl implements PayScoreService {
private static final Gson GSON = new GsonBuilder().create();
private final WxPayService payService;
@Override
@ -37,8 +35,8 @@ public class PayScoreServiceImpl implements PayScoreService {
request.setAppid(config.getAppId());
request.setServiceId(config.getServiceId());
request.setNotifyUrl(config.getPayScoreNotifyUrl());
String result = payService.postV3(url, GSON.toJson(request));
WxPayScoreResult wxPayScoreCreateResult = GSON.fromJson(result, WxPayScoreResult.class);
String result = this.payService.postV3(url, request.toJson());
WxPayScoreResult wxPayScoreCreateResult = WxPayScoreResult.fromJson(result);
//补充算一下签名给小程序跳转用
String currentTimeMillis = System.currentTimeMillis() + "";
@ -84,7 +82,7 @@ public class PayScoreServiceImpl implements PayScoreService {
uriBuilder.setParameter("appid", config.getAppId());
try {
String result = payService.getV3(uriBuilder.build());
return GSON.fromJson(result, WxPayScoreResult.class);
return WxPayScoreResult.fromJson(result);
} catch (URISyntaxException e) {
throw new WxPayException("未知异常!", e);
}
@ -95,12 +93,12 @@ public class PayScoreServiceImpl implements PayScoreService {
public WxPayScoreResult cancelServiceOrder(String outOrderNo, String reason) throws WxPayException {
WxPayConfig config = this.payService.getConfig();
String url = String.format("%s/v3/payscore/serviceorder/%s/cancel", this.payService.getPayBaseUrl(), outOrderNo);
HashMap<String, Object> map = new HashMap<>(4);
Map<String, Object> map = new HashMap<>(4);
map.put("appid", config.getAppId());
map.put("service_id", config.getServiceId());
map.put("reason", reason);
String result = payService.postV3(url, GSON.toJson(map));
return GSON.fromJson(result, WxPayScoreResult.class);
String result = payService.postV3(url, WxGsonBuilder.create().toJson(map));
return WxPayScoreResult.fromJson(result);
}
@Override
@ -111,8 +109,8 @@ public class PayScoreServiceImpl implements PayScoreService {
request.setAppid(config.getAppId());
request.setServiceId(config.getServiceId());
request.setOutOrderNo(null);
String result = payService.postV3(url, GSON.toJson(request));
return GSON.fromJson(result, WxPayScoreResult.class);
String result = payService.postV3(url, request.toJson());
return WxPayScoreResult.fromJson(result);
}
@Override
@ -123,19 +121,19 @@ public class PayScoreServiceImpl implements PayScoreService {
request.setAppid(config.getAppId());
request.setServiceId(config.getServiceId());
request.setOutOrderNo(null);
String result = payService.postV3(url, GSON.toJson(request));
return GSON.fromJson(result, WxPayScoreResult.class);
String result = payService.postV3(url, request.toJson());
return WxPayScoreResult.fromJson(result);
}
@Override
public WxPayScoreResult payServiceOrder(String outOrderNo) throws WxPayException {
WxPayConfig config = this.payService.getConfig();
String url = String.format("%s/v3/payscore/serviceorder/%s/pay", this.payService.getPayBaseUrl(), outOrderNo);
HashMap<String, Object> map = new HashMap<>(2);
Map<String, Object> map = new HashMap<>(2);
map.put("appid", config.getAppId());
map.put("service_id", config.getServiceId());
String result = payService.postV3(url, GSON.toJson(map));
return GSON.fromJson(result, WxPayScoreResult.class);
String result = payService.postV3(url, WxGsonBuilder.create().toJson(map));
return WxPayScoreResult.fromJson(result);
}
@Override
@ -146,13 +144,13 @@ public class PayScoreServiceImpl implements PayScoreService {
request.setAppid(config.getAppId());
request.setServiceId(config.getServiceId());
request.setOutOrderNo(null);
String result = payService.postV3(url, GSON.toJson(request));
return GSON.fromJson(result, WxPayScoreResult.class);
String result = payService.postV3(url, request.toJson());
return WxPayScoreResult.fromJson(result);
}
@Override
public PayScoreNotifyData parseNotifyData(String data) {
return GSON.fromJson(data, PayScoreNotifyData.class);
return WxGsonBuilder.create().fromJson(data, PayScoreNotifyData.class);
}
@Override
@ -163,8 +161,7 @@ public class PayScoreServiceImpl implements PayScoreService {
String nonce = resource.getNonce();
String apiV3Key = this.payService.getConfig().getApiV3Key();
try {
String s = AesUtils.decryptToString(associatedData, nonce, cipherText, apiV3Key);
return GSON.fromJson(s, WxPayScoreResult.class);
return WxPayScoreResult.fromJson(AesUtils.decryptToString(associatedData, nonce, cipherText, apiV3Key));
} catch (GeneralSecurityException | IOException e) {
throw new WxPayException("解析报文异常!", e);
}

View File

@ -25,6 +25,7 @@ import java.security.cert.CertificateExpiredException;
import java.security.cert.CertificateNotYetValidException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.locks.ReentrantLock;
@ -148,30 +149,32 @@ public class AutoUpdateCertificatesVerifier implements Verifier {
* 反序列化证书并解密
*/
private List<X509Certificate> deserializeToCerts(byte[] apiV3Key, String body) throws GeneralSecurityException, IOException {
AesUtils decryptor = new AesUtils(apiV3Key);
AesUtils aesUtils = new AesUtils(apiV3Key);
ObjectMapper mapper = new ObjectMapper();
JsonNode dataNode = mapper.readTree(body).get("data");
List<X509Certificate> newCertList = new ArrayList<>();
if (dataNode != null) {
for (int i = 0, count = dataNode.size(); i < count; i++) {
JsonNode encryptCertificateNode = dataNode.get(i).get("encrypt_certificate");
//解密
String cert = decryptor.decryptToString(
encryptCertificateNode.get("associated_data").toString().replaceAll("\"", "")
.getBytes(StandardCharsets.UTF_8),
encryptCertificateNode.get("nonce").toString().replaceAll("\"", "")
.getBytes(StandardCharsets.UTF_8),
encryptCertificateNode.get("ciphertext").toString().replaceAll("\"", ""));
if (dataNode == null) {
return Collections.emptyList();
}
X509Certificate x509Cert = PemUtils
.loadCertificate(new ByteArrayInputStream(cert.getBytes(StandardCharsets.UTF_8)));
try {
x509Cert.checkValidity();
} catch (CertificateExpiredException | CertificateNotYetValidException e) {
continue;
}
newCertList.add(x509Cert);
List<X509Certificate> newCertList = new ArrayList<>();
for (int i = 0, count = dataNode.size(); i < count; i++) {
JsonNode encryptCertificateNode = dataNode.get(i).get("encrypt_certificate");
//解密
String cert = aesUtils.decryptToString(
encryptCertificateNode.get("associated_data").toString().replaceAll("\"", "")
.getBytes(StandardCharsets.UTF_8),
encryptCertificateNode.get("nonce").toString().replaceAll("\"", "")
.getBytes(StandardCharsets.UTF_8),
encryptCertificateNode.get("ciphertext").toString().replaceAll("\"", ""));
X509Certificate x509Cert = PemUtils
.loadCertificate(new ByteArrayInputStream(cert.getBytes(StandardCharsets.UTF_8)));
try {
x509Cert.checkValidity();
} catch (CertificateExpiredException | CertificateNotYetValidException e) {
continue;
}
newCertList.add(x509Cert);
}
return newCertList;

View File

@ -0,0 +1,54 @@
package com.github.binarywang.wxpay.bean.payscore;
import org.testng.annotations.Test;
/**
* @author <a href="https://github.com/binarywang">Binary Wang</a>
* @date 2020-07-11
*/
public class WxPayScoreRequestTest {
@Test
public void testToJson() {
WxPayScoreRequest request = WxPayScoreRequest.builder()
.outOrderNo("QLS202005201058000201")
.appid("123")
.serviceId("345")
.serviceIntroduction("租借服务")
.timeRange(new TimeRange("OnAccept", "20200520225840"))
.build();
System.out.println(request.toJson());
/* {
"out_order_no":"QLS202005201058000201",
"appid":"123",
"service_id":"345",
"service_introduction":"租借服务",
"time_range":{
"start_time":"OnAccept",
"end_time":"20200520225840"
},
"location":{
"start_location":"",
"end_location":""
},
"risk_fund":{
"name":"DEPOSIT",
"amount":200,
"description":"丢失偿还费用2元/台"
},
"attach":"",
"notify_url":"/pay/notify/payScore",
"openid":"",
"need_user_confirm":true,
"profit_sharing":false,
"post_payments":[
{
"name":"租借服务",
"amount":100,
"description":"服务费1元/台",
"count":1
}
],
"total_amount":0
}*/
}
}

View File

@ -64,7 +64,7 @@ public class PayScoreServiceImplTest {
}
@Test
public void testQueryServiceOrder() throws URISyntaxException, WxPayException {
public void testQueryServiceOrder() throws WxPayException {
//两个参数选填一个
this.payService.getPayScoreService().queryServiceOrder("11", "");
}