mirror of
https://codeup.aliyun.com/67c68d4e484ca2f0a13ac3c1/ydc/jsowell-charger-web.git
synced 2026-04-21 11:35:12 +08:00
新增 宁波点行平台Service
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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";
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user