新增 宁波点行平台Service

This commit is contained in:
Lemon
2024-05-13 11:00:16 +08:00
parent 09a32ab467
commit 60039af78c
5 changed files with 90 additions and 31 deletions

View File

@@ -120,25 +120,39 @@ public class CRC16Util {
// 测试
public static void main(String[] args) {
// 序列号域
byte[] serialNumber = BytesUtil.str2Bcd("3c40");
// // 序列号域
// byte[] serialNumber = BytesUtil.str2Bcd("3c40");
//
// // 加密标志
// byte[] encryptFlag = BytesUtil.str2Bcd("00");
//
// // 帧类型标志
// byte[] frameType = BytesUtil.str2Bcd("03");
//
// // 消息体
// byte[] msgBody = BytesUtil.str2Bcd("880000000000270100");
//
// byte[] data = Bytes.concat(serialNumber, encryptFlag, frameType, msgBody);
//
// String old_crc = String.format("%04x", CRC16Util.calcCrc16Old(data));
// String crc = String.format("%04x", CRC16Util.calcCrc16(data));
// 加密标志
byte[] encryptFlag = BytesUtil.str2Bcd("00");
// System.out.println("old_低位在前高位在后:" + old_crc);
// System.out.println("new_低位在前高位在后:" + crc);
// 帧类型标志
byte[] frameType = BytesUtil.str2Bcd("03");
// 获取 年月日 日期
String dateStr = DateUtils.dateTimeNow(DateUtils.YYMMDD);
int dateInt = Integer.parseInt(dateStr);
// 将年月日加上 160829
String data = String.valueOf(dateInt + 160829);
byte[] bytes = BytesUtil.str2Bcd(data);
// crc16加密
String crc = String.format("%04x", CRC16Util.calcCrc16(bytes));
System.out.println(crc);
// 将16进制转成10进制
int i = Integer.parseInt(crc, 16);
System.out.println(i);
// 消息体
byte[] msgBody = BytesUtil.str2Bcd("880000000000270100");
byte[] data = Bytes.concat(serialNumber, encryptFlag, frameType, msgBody);
String old_crc = String.format("%04x", CRC16Util.calcCrc16Old(data));
String crc = String.format("%04x", CRC16Util.calcCrc16(data));
System.out.println("old_低位在前高位在后:" + old_crc);
System.out.println("new_低位在前高位在后:" + crc);
}
/**

View File

@@ -32,6 +32,8 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
public static String YYYY_MM_DD = "yyyy-MM-dd";
public static String YYMMDD = "yyMMdd";
public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
public static String YYYYMMDDHHMM = "yyyyMMddHHmm";

View File

@@ -1,5 +1,7 @@
package com.jsowell.common.util;
import com.alibaba.fastjson2.JSON;
import com.jsowell.common.util.http.HttpUtils;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import com.alibaba.fastjson2.JSONObject;
@@ -18,6 +20,9 @@ import java.security.spec.ECGenParameterSpec;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.TreeMap;
/**
@@ -198,17 +203,33 @@ public class Sm2Util {
return sm2Signer.verifySignature(Base64.decode(sign));
}
// private static String getSignContent(JSONObject rawData) {
// JSONObject data = new JSONObject(new TreeMap<>());
// rawData.forEach((k, v) -> data.put(k, v));
// StringBuffer sb = new StringBuffer();
// data.forEach((k, v) -> {
// if (v != null && !"".equals(v)) {
// sb.append(k + "=" + v + "&");
// }
// });
// String stringData = sb.toString();
// return stringData == null || stringData.isEmpty() ? "" : stringData.substring(0, stringData.length() - 1);
// }
private static String getSignContent(JSONObject rawData) {
JSONObject data = new JSONObject(new TreeMap<>());
rawData.forEach((k, v) -> data.put(k, v));
StringBuffer sb = new StringBuffer();
data.forEach((k, v) -> {
if (v != null && !"".equals(v)) {
sb.append(k + "=" + v + "&");
StringBuilder content = new StringBuilder();
List<String> keys = new ArrayList<>(rawData.keySet());
// 将参数集合排序
Collections.sort(keys);
for (int i = 0; i < keys.size(); i++) {
String key = keys.get(i);
String value = (String) rawData.get(key);
// 拼装所有非空参数
if (key != null && !"".equalsIgnoreCase(key) && value != null && !"".equalsIgnoreCase(value)) {
content.append(i == 0 ? "" : "&").append(key).append("=").append(value);
}
});
String stringData = sb.toString();
return stringData == null || stringData.isEmpty() ? "" : stringData.substring(0, stringData.length() - 1);
}
return content.toString();
}
private static BCECPrivateKey getPrivateKey(byte[] privateBytes) throws NoSuchProviderException, NoSuchAlgorithmException, InvalidKeySpecException {
@@ -230,13 +251,34 @@ public class Sm2Util {
String platformPublicKeyStr = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEYPOlKmr/XY+na8KxiNvRui1esFugt4tT2AVk+eRlH4KCYLabDZDordal3kcn4UNM7t6J+dyhcfLstNWXpf4lQA==";
String thirdPartyPrivateKeyStr = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgCMref1FGlPZ9RfeJw/cnU5uEvFZNhHt7OvF4sgXnBjWgCgYIKoEcz1UBgi2hRANCAARj6kqkCaeNJSxWExQFsot1OuSCFrQOblhKx0U/y8GhgSND2MOAM08yXzl308waLqLt+jcsLF2UTW6XfrZNS5pk";
JSONObject data = new JSONObject();
data.put("outTradeId","202212231641900215435329");
data.put("outTradeId","202212231641900215435");
data.put("plateNum","浙B12345");
data.put("startTime","2023-01-09 10:00:01");
data.put("endTime","2023-01-09 11:00:02");
data.put("recordTime","2023-01-09 12:00:03");
data.put("payAmount","12.34");
System.out.println(data);
System.out.println(generateEncryptedRequestInfo(data,platformPublicKeyStr,thirdPartyPrivateKeyStr));
String recordInfoStr = generateEncryptedRequestInfo(data, platformPublicKeyStr, thirdPartyPrivateKeyStr);
String tpToken = "4121d1c9121a41d894ed5082d264db30";
// 发送请求
String url = "http://123.60.34.253:9527/parking-shop/tp/chargeRecord/report";
JSONObject postParam = new JSONObject();
postParam.put("recordInfo", recordInfoStr);
String result = HttpUtils.sendPostTpToken(url, postParam.toJSONString(), tpToken); // {"code":103,"msg":"数据验签不通过","data":null}
// String result = HttpUtil.post(url, postParam.toJSONString());
System.out.println(result);
}
public static JSONObject getPlaintextRequestInfo(String encryptedString, String platformPrivateKeyStr, String thirdPartyPublicKeyStr) throws NoSuchAlgorithmException, InvalidKeySpecException, NoSuchProviderException {
String plaintext = decrypt(platformPrivateKeyStr, encryptedString);
JSONObject result = JSON.parseObject(plaintext);
if(verify(thirdPartyPublicKeyStr, result)){
return result;
}else{
return null;
}
}
}

View File

@@ -288,6 +288,7 @@ public class HttpUtils {
conn.setRequestProperty("connection", "Keep-Alive");
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
conn.setRequestProperty("Accept-Charset", "utf-8");
conn.setRequestProperty("Content-Type", "application/json");
// conn.setRequestProperty("Authorization", "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI0MjUwMTA3NjUiLCJpYXQiOjE2ODU0MjM3ODMsInN1YiI6IjNEU0JUV0hWSUM2S1ZDS0kiLCJleHAiOjY4Njk0MjM3ODN9.nU-6QNNBp0dcz65_lT-yVAoESZFUHmOwZpoqsKVNspQ");
conn.setRequestProperty("tpToken", tpToken);
conn.setDoOutput(true);