mirror of
https://codeup.aliyun.com/67c68d4e484ca2f0a13ac3c1/ydc/jsowell-charger-web.git
synced 2026-06-13 11:49:49 +08:00
新增 宁波点行平台Service
This commit is contained in:
@@ -120,25 +120,39 @@ public class CRC16Util {
|
|||||||
|
|
||||||
// 测试
|
// 测试
|
||||||
public static void main(String[] args) {
|
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));
|
||||||
|
|
||||||
// 加密标志
|
// System.out.println("old_低位在前,高位在后:" + old_crc);
|
||||||
byte[] encryptFlag = BytesUtil.str2Bcd("00");
|
// 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 YYYY_MM_DD = "yyyy-MM-dd";
|
||||||
|
|
||||||
|
public static String YYMMDD = "yyMMdd";
|
||||||
|
|
||||||
public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
|
public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
|
||||||
|
|
||||||
public static String YYYYMMDDHHMM = "yyyyMMddHHmm";
|
public static String YYYYMMDDHHMM = "yyyyMMddHHmm";
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
package com.jsowell.common.util;
|
package com.jsowell.common.util;
|
||||||
|
|
||||||
|
import com.alibaba.fastjson2.JSON;
|
||||||
|
import com.jsowell.common.util.http.HttpUtils;
|
||||||
import org.bouncycastle.jce.provider.BouncyCastleProvider;
|
import org.bouncycastle.jce.provider.BouncyCastleProvider;
|
||||||
|
|
||||||
import com.alibaba.fastjson2.JSONObject;
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
@@ -18,6 +20,9 @@ import java.security.spec.ECGenParameterSpec;
|
|||||||
import java.security.spec.InvalidKeySpecException;
|
import java.security.spec.InvalidKeySpecException;
|
||||||
import java.security.spec.PKCS8EncodedKeySpec;
|
import java.security.spec.PKCS8EncodedKeySpec;
|
||||||
import java.security.spec.X509EncodedKeySpec;
|
import java.security.spec.X509EncodedKeySpec;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -198,17 +203,33 @@ public class Sm2Util {
|
|||||||
return sm2Signer.verifySignature(Base64.decode(sign));
|
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) {
|
private static String getSignContent(JSONObject rawData) {
|
||||||
JSONObject data = new JSONObject(new TreeMap<>());
|
StringBuilder content = new StringBuilder();
|
||||||
rawData.forEach((k, v) -> data.put(k, v));
|
List<String> keys = new ArrayList<>(rawData.keySet());
|
||||||
StringBuffer sb = new StringBuffer();
|
// 将参数集合排序
|
||||||
data.forEach((k, v) -> {
|
Collections.sort(keys);
|
||||||
if (v != null && !"".equals(v)) {
|
for (int i = 0; i < keys.size(); i++) {
|
||||||
sb.append(k + "=" + v + "&");
|
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 content.toString();
|
||||||
return stringData == null || stringData.isEmpty() ? "" : stringData.substring(0, stringData.length() - 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static BCECPrivateKey getPrivateKey(byte[] privateBytes) throws NoSuchProviderException, NoSuchAlgorithmException, InvalidKeySpecException {
|
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 platformPublicKeyStr = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEYPOlKmr/XY+na8KxiNvRui1esFugt4tT2AVk+eRlH4KCYLabDZDordal3kcn4UNM7t6J+dyhcfLstNWXpf4lQA==";
|
||||||
String thirdPartyPrivateKeyStr = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgCMref1FGlPZ9RfeJw/cnU5uEvFZNhHt7OvF4sgXnBjWgCgYIKoEcz1UBgi2hRANCAARj6kqkCaeNJSxWExQFsot1OuSCFrQOblhKx0U/y8GhgSND2MOAM08yXzl308waLqLt+jcsLF2UTW6XfrZNS5pk";
|
String thirdPartyPrivateKeyStr = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgCMref1FGlPZ9RfeJw/cnU5uEvFZNhHt7OvF4sgXnBjWgCgYIKoEcz1UBgi2hRANCAARj6kqkCaeNJSxWExQFsot1OuSCFrQOblhKx0U/y8GhgSND2MOAM08yXzl308waLqLt+jcsLF2UTW6XfrZNS5pk";
|
||||||
JSONObject data = new JSONObject();
|
JSONObject data = new JSONObject();
|
||||||
data.put("outTradeId","202212231641900215435329");
|
data.put("outTradeId","202212231641900215435");
|
||||||
data.put("plateNum","浙B12345");
|
data.put("plateNum","浙B12345");
|
||||||
data.put("startTime","2023-01-09 10:00:01");
|
data.put("startTime","2023-01-09 10:00:01");
|
||||||
data.put("endTime","2023-01-09 11:00:02");
|
data.put("endTime","2023-01-09 11:00:02");
|
||||||
data.put("recordTime","2023-01-09 12:00:03");
|
data.put("recordTime","2023-01-09 12:00:03");
|
||||||
data.put("payAmount","12.34");
|
data.put("payAmount","12.34");
|
||||||
System.out.println(data);
|
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("connection", "Keep-Alive");
|
||||||
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
|
conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
|
||||||
conn.setRequestProperty("Accept-Charset", "utf-8");
|
conn.setRequestProperty("Accept-Charset", "utf-8");
|
||||||
|
conn.setRequestProperty("Content-Type", "application/json");
|
||||||
// conn.setRequestProperty("Authorization", "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI0MjUwMTA3NjUiLCJpYXQiOjE2ODU0MjM3ODMsInN1YiI6IjNEU0JUV0hWSUM2S1ZDS0kiLCJleHAiOjY4Njk0MjM3ODN9.nU-6QNNBp0dcz65_lT-yVAoESZFUHmOwZpoqsKVNspQ");
|
// conn.setRequestProperty("Authorization", "eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI0MjUwMTA3NjUiLCJpYXQiOjE2ODU0MjM3ODMsInN1YiI6IjNEU0JUV0hWSUM2S1ZDS0kiLCJleHAiOjY4Njk0MjM3ODN9.nU-6QNNBp0dcz65_lT-yVAoESZFUHmOwZpoqsKVNspQ");
|
||||||
conn.setRequestProperty("tpToken", tpToken);
|
conn.setRequestProperty("tpToken", tpToken);
|
||||||
conn.setDoOutput(true);
|
conn.setDoOutput(true);
|
||||||
|
|||||||
@@ -60,14 +60,14 @@ public class DianXingPlatformServiceImpl implements ThirdPartyPlatformService {
|
|||||||
if (orderBasicInfo == null) {
|
if (orderBasicInfo == null) {
|
||||||
throw new BusinessException("", "未查询到该订单信息");
|
throw new BusinessException("", "未查询到该订单信息");
|
||||||
}
|
}
|
||||||
String plateNum = orderBasicInfo.getPlateNumber() == null ? "无" : orderBasicInfo.getPlateNumber();
|
String plateNum = orderBasicInfo.getPlateNumber().equals("") ? "无" : orderBasicInfo.getPlateNumber();
|
||||||
// 拼装订单信息 JSON 参数
|
// 拼装订单信息 JSON 参数
|
||||||
JSONObject jsonObject = new JSONObject();
|
JSONObject jsonObject = new JSONObject();
|
||||||
jsonObject.put("outTradeId", orderBasicInfo.getOrderCode()); // 充电桩平台订单号
|
jsonObject.put("outTradeId", orderBasicInfo.getOrderCode()); // 充电桩平台订单号
|
||||||
jsonObject.put("plateNum", plateNum); // 车牌号
|
jsonObject.put("plateNum", plateNum); // 车牌号
|
||||||
jsonObject.put("startTime", orderBasicInfo.getChargeStartTime()); // 充电开始时间,格式 yyyy-MM-dd HH:mm:ss
|
jsonObject.put("startTime", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, orderBasicInfo.getChargeStartTime())); // 充电开始时间,格式 yyyy-MM-dd HH:mm:ss
|
||||||
jsonObject.put("endTime", orderBasicInfo.getChargeEndTime()); // 充电结束时间,
|
jsonObject.put("endTime", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, orderBasicInfo.getChargeEndTime())); // 充电结束时间,
|
||||||
jsonObject.put("payAmount", orderBasicInfo.getPayAmount()); // 支付金额,格式为小数点后保留 2 位
|
jsonObject.put("payAmount", String.valueOf(orderBasicInfo.getPayAmount())); // 支付金额,格式为小数点后保留 2 位
|
||||||
jsonObject.put("recordTime", DateUtils.getDateTime()); // 记录上报时间
|
jsonObject.put("recordTime", DateUtils.getDateTime()); // 记录上报时间
|
||||||
|
|
||||||
// 查询出该平台的配置参数
|
// 查询出该平台的配置参数
|
||||||
|
|||||||
Reference in New Issue
Block a user