diff --git a/ZhuQue/pom.xml b/ZhuQue/pom.xml index 93afff8..daa0b8b 100644 --- a/ZhuQue/pom.xml +++ b/ZhuQue/pom.xml @@ -75,7 +75,12 @@ 2.4 jdk15 - + + + com.google.guava + guava + 21.0 + diff --git a/ZhuQue/src/main/java/com/dsideal/ZhuQue/Util/SignUtils.java b/ZhuQue/src/main/java/com/dsideal/ZhuQue/Util/SignUtils.java new file mode 100644 index 0000000..94b8e46 --- /dev/null +++ b/ZhuQue/src/main/java/com/dsideal/ZhuQue/Util/SignUtils.java @@ -0,0 +1,83 @@ +package com.dsideal.ZhuQue.Util; + +import com.alibaba.fastjson.JSONObject; +import com.google.common.base.Joiner; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Map; +import java.util.TreeMap; + +/** + * 签名工具 + * + * @author keytop + * @date 2020/3/6 + */ +public class SignUtils { + /** + * 参数签名 + * 示例: + * 参数对象:{"amount":100,"orderNo":"闽C12345","payTime":"2020-03-06 10:57:22","freeDetail":"[{\"code\":\"\",\"money\":100,\"time\":0,\"type\":0}]","paySource":"85d15350778b11e9bbaa506b4b2f6421","outOrderNo":"T20200306124536001","parkId":"1000001","payableAmount":200,"reqId":"5be4e3e6d5704a7d91ccbd9731d970f5","payType":1006,"payMethod":6,"appId":"85d15350778b11e9bbaa506b4b2f6421","freeTime":0,"paymentExt":"{\"deviceNo\":\"123456\"}","freeMoney":100,"ts":1583744086841} + * url拼接:amount=100&freeDetail=[{"code":"","money":100,"time":0,"type":0}]&freeMoney=100&freeTime=0&orderNo=闽C12345&outOrderNo=T20200306124536001&parkId=1000001&payMethod=6&paySource=85d15350778b11e9bbaa506b4b2f6421&payTime=2020-03-06 10:57:22&payType=1006&payableAmount=200&paymentExt={"deviceNo":"123456"}&reqId=5be4e3e6d5704a7d91ccbd9731d970f5&ts=1583744086841&EED96C219E83450A + * 签名结果:B19F7863ADCC8B5442A757AC7B90F6AC + * + * @param requestBody 参数对象 + * @param appSecret 秘钥 + * @return + */ + public static String paramsSign(JSONObject requestBody, String appSecret) { + TreeMap params = new TreeMap<>(); + //过滤掉key,appId字段,空属性及Map或List等复杂对象 + requestBody.entrySet().stream().filter( + p -> !"key".equals(p.getKey()) + && !"appId".equals(p.getKey()) + && p.getValue() != null + && !(p.getValue() instanceof Map) + && !(p.getValue() instanceof Iterable)) + .forEach(p -> { + if (!p.getValue().equals("")) { + params.put(p.getKey(), p.getValue().toString()); + } + }); + //拼接appSecret + String temp = Joiner.on("&").withKeyValueSeparator("=").join(params).concat("&").concat(appSecret); + return md5(temp).toUpperCase(); + } + + /** + * 对文本执行 md5 摘要加密, 此算法与 mysql,JavaScript生成的md5摘要进行过一致性对比. + * + * @param plainText + * @return 返回值中的字母为小写 + */ + private static String md5(String plainText) { + if (null == plainText) { + plainText = ""; + } + String mD5Str = null; + try { + // JDK 支持以下6种消息摘要算法,不区分大小写 + // md5,sha(sha-1),md2,sha-256,sha-384,sha-512 + MessageDigest md = MessageDigest.getInstance("MD5"); + md.update(plainText.getBytes(StandardCharsets.UTF_8)); + byte[] b = md.digest(); + int i; + StringBuilder builder = new StringBuilder(32); + for (byte value : b) { + i = value; + if (i < 0) { + i += 256; + } + if (i < 16) { + builder.append("0"); + } + builder.append(Integer.toHexString(i)); + } + mD5Str = builder.toString(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + return mD5Str; + } +} diff --git a/ZhuQue/src/main/java/com/dsideal/ZhuQue/Ylt/Controller/YltController.java b/ZhuQue/src/main/java/com/dsideal/ZhuQue/Ylt/Controller/YltController.java index 1e198fa..4768e84 100644 --- a/ZhuQue/src/main/java/com/dsideal/ZhuQue/Ylt/Controller/YltController.java +++ b/ZhuQue/src/main/java/com/dsideal/ZhuQue/Ylt/Controller/YltController.java @@ -4,6 +4,7 @@ import cn.hutool.http.HttpUtil; import com.alibaba.fastjson.JSONObject; import com.dsideal.ZhuQue.Interceptor.IsLoginInterface; import com.dsideal.ZhuQue.Util.CommonUtil; +import com.dsideal.ZhuQue.Util.SignUtils; import com.dsideal.ZhuQue.Ylt.Model.YltModel; import com.jfinal.aop.Before; import com.jfinal.core.Controller; @@ -43,15 +44,14 @@ public class YltController extends Controller { @Before({POST.class}) @IsLoginInterface({}) // 非指定闸机场地 - // http://10.10.21.20:8888/ZhuQue/Ylt/SyncChargePilePay?order_id=1 + // http://10.10.21.20:8888/ZhuQue/Ylt/SyncChargePilePay?order_no=2020092315154430479 // 科拓闸机场地 - // http://10.10.21.20:8888/ZhuQue/Ylt/SyncChargePilePay?order_id=248933 + // http://10.10.21.20:8888/ZhuQue/Ylt/SyncChargePilePay?order_no=2022012911045715187 public void SyncChargePilePay(String order_no) { //根据订单号获取到第三方方面提供的车场信息 Record thirdPartyStation = ym.getThirdPartyStation(order_no); if (thirdPartyStation == null) { - Record record = new Record(); - renderJson(CommonUtil.getRet(record, false, "检查到不是需要免费的道闸所在车场,无需发送减免消息!!")); + renderJson(CommonUtil.getRet(false, "检查到不是需要免费的道闸所在车场,无需发送减免消息!!")); return; } //请求地址 @@ -59,7 +59,7 @@ public class YltController extends Controller { //与科拓对接,对方平台分配的我司平台ID String appId = thirdPartyStation.getStr("third_party_appId"); //与科拓对接,对方平台分配的我司平台秘钥 - String key = thirdPartyStation.getStr("third_party_key"); + String appSecret = thirdPartyStation.getStr("third_party_key"); //闸机提供商 String name = thirdPartyStation.getStr("third_party_name"); //闸机所在车场ID @@ -73,7 +73,7 @@ public class YltController extends Controller { String charge_end_time = dingDanRecord.getStr("charge_end_time");//充电结束时间 int stationId = dingDanRecord.getInt("station_id");//电站ID //获取车场名称 - String stationName = ym.getStationById(String.valueOf(stationId)).getStr("station_name"); + String stationName = ym.getStationById(stationId).getStr("station_name"); //设备号 int deviceId = dingDanRecord.getInt("equipment_id");//充电桩ID //充电桩名称 @@ -96,7 +96,6 @@ public class YltController extends Controller { if ("科拓".equals(name)) { JSONObject jo = new JSONObject(); jo.put("appId", appId); - jo.put("key", key); jo.put("parkId", parkId); jo.put("serviceCode", "syncChargePilePay"); // 获取当前时间戳 @@ -119,12 +118,11 @@ public class YltController extends Controller { jo.put("freeType", freeType);//减免类型 jo.put("freeMoney", freeMoney);//减免金额 jo.put("freeTime", freeTime);//减免时长 + jo.put("key", SignUtils.paramsSign(jo, appSecret)); // 发送 POST 请求并获取响应 String result = HttpUtil.createPost(url) .body(jo.toString()) // 将 JSON 对象转换为字符串作为请求正文 - //.header("accept-language","zh-CN") - //.header("User-Agent","Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36") - //.header("version","1.0.0") + .header("version", "1.0.0") .header("Content-Type", "application/json") // 设置请求头,指明内容类型为 JSON .execute().body(); // 发送请求并获取响应体 diff --git a/ZhuQue/src/main/java/com/dsideal/ZhuQue/Ylt/Model/YltModel.java b/ZhuQue/src/main/java/com/dsideal/ZhuQue/Ylt/Model/YltModel.java index 2807c29..2a0542a 100644 --- a/ZhuQue/src/main/java/com/dsideal/ZhuQue/Ylt/Model/YltModel.java +++ b/ZhuQue/src/main/java/com/dsideal/ZhuQue/Ylt/Model/YltModel.java @@ -3,7 +3,9 @@ package com.dsideal.ZhuQue.Ylt.Model; import com.dsideal.ZhuQue.Util.JwtUtil; import com.jfinal.plugin.activerecord.Db; import io.jsonwebtoken.Claims; + import javax.servlet.http.HttpServletRequest; + import com.jfinal.plugin.activerecord.Record; public class YltModel { @@ -73,8 +75,9 @@ public class YltModel { * @param station_id * @return */ - public Record getStationById(String station_id) { - return Db.findById("t_station", "id", station_id); + public Record getStationById(int station_id) { + String sql = "select * from t_station where id=?"; + return Db.findFirst(sql, station_id); } /** @@ -84,6 +87,7 @@ public class YltModel { * @return */ public Record getEquipmentById(int equipment_id) { - return Db.findById("t_equipment", "id", equipment_id); + String sql = "select * from t_equipment where id =?"; + return Db.findFirst(sql, equipment_id); } } diff --git a/业务梳理/~$对外统一标准接口_充电桩抵扣.docx b/业务梳理/~$对外统一标准接口_充电桩抵扣.docx new file mode 100644 index 0000000..e4e31b2 Binary files /dev/null and b/业务梳理/~$对外统一标准接口_充电桩抵扣.docx differ diff --git a/业务梳理/驿来特收到的需求、分析与现状.docx b/业务梳理/驿来特收到的需求、分析与现状.docx index 1b50350..dc4bee8 100644 Binary files a/业务梳理/驿来特收到的需求、分析与现状.docx and b/业务梳理/驿来特收到的需求、分析与现状.docx differ diff --git a/资料/~$对外统一标准接口(收费系统)文档254.docx b/资料/~$对外统一标准接口(收费系统)文档254.docx new file mode 100644 index 0000000..5ee492b Binary files /dev/null and b/资料/~$对外统一标准接口(收费系统)文档254.docx differ