diff --git a/jsowell-common/src/main/java/com/jsowell/common/util/CRC16Util.java b/jsowell-common/src/main/java/com/jsowell/common/util/CRC16Util.java index c9f3d820b..03d7cb2a8 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/util/CRC16Util.java +++ b/jsowell-common/src/main/java/com/jsowell/common/util/CRC16Util.java @@ -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); } /** diff --git a/jsowell-common/src/main/java/com/jsowell/common/util/DateUtils.java b/jsowell-common/src/main/java/com/jsowell/common/util/DateUtils.java index 8a60791cc..b6bd46113 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/util/DateUtils.java +++ b/jsowell-common/src/main/java/com/jsowell/common/util/DateUtils.java @@ -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"; diff --git a/jsowell-common/src/main/java/com/jsowell/common/util/Sm2Util.java b/jsowell-common/src/main/java/com/jsowell/common/util/Sm2Util.java index 6a9e64878..f5699cbcd 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/util/Sm2Util.java +++ b/jsowell-common/src/main/java/com/jsowell/common/util/Sm2Util.java @@ -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 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; + } } } diff --git a/jsowell-common/src/main/java/com/jsowell/common/util/http/HttpUtils.java b/jsowell-common/src/main/java/com/jsowell/common/util/http/HttpUtils.java index 1b9b28f75..23b42cfbd 100644 --- a/jsowell-common/src/main/java/com/jsowell/common/util/http/HttpUtils.java +++ b/jsowell-common/src/main/java/com/jsowell/common/util/http/HttpUtils.java @@ -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); diff --git a/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/platform/ningbodianxing/service/DianXingPlatformServiceImpl.java b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/platform/ningbodianxing/service/DianXingPlatformServiceImpl.java index d796e235f..2d43f2f13 100644 --- a/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/platform/ningbodianxing/service/DianXingPlatformServiceImpl.java +++ b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/platform/ningbodianxing/service/DianXingPlatformServiceImpl.java @@ -60,14 +60,14 @@ public class DianXingPlatformServiceImpl implements ThirdPartyPlatformService { if (orderBasicInfo == null) { throw new BusinessException("", "未查询到该订单信息"); } - String plateNum = orderBasicInfo.getPlateNumber() == null ? "无" : orderBasicInfo.getPlateNumber(); + String plateNum = orderBasicInfo.getPlateNumber().equals("") ? "无" : orderBasicInfo.getPlateNumber(); // 拼装订单信息 JSON 参数 JSONObject jsonObject = new JSONObject(); jsonObject.put("outTradeId", orderBasicInfo.getOrderCode()); // 充电桩平台订单号 jsonObject.put("plateNum", plateNum); // 车牌号 - jsonObject.put("startTime", orderBasicInfo.getChargeStartTime()); // 充电开始时间,格式 yyyy-MM-dd HH:mm:ss - jsonObject.put("endTime", orderBasicInfo.getChargeEndTime()); // 充电结束时间, - jsonObject.put("payAmount", orderBasicInfo.getPayAmount()); // 支付金额,格式为小数点后保留 2 位 + jsonObject.put("startTime", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, orderBasicInfo.getChargeStartTime())); // 充电开始时间,格式 yyyy-MM-dd HH:mm:ss + jsonObject.put("endTime", DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD_HH_MM_SS, orderBasicInfo.getChargeEndTime())); // 充电结束时间, + jsonObject.put("payAmount", String.valueOf(orderBasicInfo.getPayAmount())); // 支付金额,格式为小数点后保留 2 位 jsonObject.put("recordTime", DateUtils.getDateTime()); // 记录上报时间 // 查询出该平台的配置参数