src/main/java/com/fzzy/api/utils/RSAUtils.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/fzzy/order/OrderManager.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/fzzy/order/data/OrderData.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/fzzy/push/sh2023/SH2023ApiRemoteService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/fzzy/push/sh2023/SH2023HttpClientUtil.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/fzzy/push/sh2023/SH2023OrderApiServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/fzzy/push/sh2023/dto/SH2023Api1101.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/fzzy/push/whhpjl/WhjlOrderApiServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/fzzy/api/utils/RSAUtils.java
@@ -12,6 +12,7 @@ import java.security.interfaces.RSAPublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.Arrays; import java.util.Base64; import java.util.HashMap; import java.util.Map; @@ -26,7 +27,7 @@ private static final String CHARSET = "utf-8"; private static final int KEYSIZE = 2048;// 密钥位数 private static final int KEYSIZE = 1024;// 密钥位数 private static final int RESERVE_BYTES = 11; private static final String ECB_PADDING = "RSA/ECB/PKCS1Padding"; @@ -41,6 +42,7 @@ String privateKeyStr = getPrivateKeyStr(map); log.info("-----私钥={}", privateKeyStr); System.out.println(privateKeyStr.length()); String publicKeyStr = getPublicKeyStr(map); log.info("-----公钥={}", publicKeyStr); @@ -123,24 +125,37 @@ * @return 加密后的密文 */ public static String encrypt(String text, String publicKeyStr) { String result = ""; try { log.info("明文字符串为:[{}]", text); // 加密 Cipher cipher = Cipher.getInstance(KEY_ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, getPublicKey(publicKeyStr)); // URLEncoder编码解决中文乱码问题 byte[] data = text.getBytes(StandardCharsets.UTF_8); // 加密时超过117字节就报错。为此采用分段加密的办法来加密 byte[] enBytes = null; for (int i = 0; i < data.length; i += MAX_ENCRYPT_BLOCK) { // 注意要使用2的倍数,否则会出现加密后的内容再解密时为乱码 byte[] doFinal = cipher.doFinal(ArrayUtils.subarray(data, i, i + MAX_ENCRYPT_BLOCK)); enBytes = ArrayUtils.addAll(enBytes, doFinal); byte[] textArray = text.getBytes(); int textLength = textArray.length; log.info("加密字节数={}", textLength); // 最大加密字节数,超出最大字节数需要分组加密 int MAX_ENCRYPT_BLOCK = 117; // 标识 int offSet = 0; byte[] resultBytes = {}; byte[] cache = {}; while (textLength - offSet > 0) { if (textLength - offSet > MAX_ENCRYPT_BLOCK) { cache = cipher.doFinal(textArray, offSet, MAX_ENCRYPT_BLOCK); offSet += MAX_ENCRYPT_BLOCK; } else { cache = cipher.doFinal(textArray, offSet, textLength - offSet); offSet = textLength; } resultBytes = Arrays.copyOf(resultBytes, resultBytes.length + cache.length); System.arraycopy(cache, 0, resultBytes, resultBytes.length - cache.length, cache.length); } return Base64.getEncoder().encodeToString(enBytes); result = Base64.getEncoder().encodeToString(resultBytes); } catch (Exception e) { throw new RuntimeException("加密字符串[" + text + "]时遇到异常", e); } return result; } /** src/main/java/com/fzzy/order/OrderManager.java
@@ -56,7 +56,7 @@ return; } OrderData data = JSONObject.parseObject(req.getData().toString(), OrderData.class); data.setOrderid(req.getOrderid()); //根据配置信息执行 OrderApiService service; for (ApiConfs conf : apiConfList) { src/main/java/com/fzzy/order/data/OrderData.java
@@ -30,4 +30,6 @@ * 备注信息 */ private String remark; private String orderid; } src/main/java/com/fzzy/push/sh2023/SH2023ApiRemoteService.java
@@ -11,6 +11,7 @@ import com.fzzy.api.service.ApiTriggerService; import com.fzzy.api.utils.*; import com.fzzy.api.view.repository.*; import com.fzzy.order.data.OrderData; import com.fzzy.push.sh2023.dto.*; import lombok.Data; import lombok.extern.slf4j.Slf4j; @@ -108,8 +109,8 @@ //获取指令id String key = RedisConst.buildKey(RedisConst.KYE_ORDER, conf.getKqdm()); String orderId = (String)redisUtil.get(key); if(StringUtils.isEmpty(orderId)){ OrderData orderData = (OrderData)redisUtil.get(key); if(StringUtils.isEmpty(orderData.getOrderid())){ log.error("指令id失效=" + jsonData); ResponseDto responseDto = new ResponseDto(99, "指令id失效"); apiLog.setStatus(99); @@ -124,18 +125,21 @@ //获取身份ID,即行政区划码 reqData.setUid(conf.getUserName()); //指令id reqData.setOrderid(orderId); reqData.setOrderid(orderData.getOrderid()); //身份签名,使用自有RSA私钥进行加密(地区行政区划代码_当天日期) reqData.setAccess_token(RSAUtils.encryptData(reqData.getUid() + "_" + DateFormatUtils.format(new Date(), "yyyy-MM-dd"), conf.getPassword())); //数据总条数 List<Object> list = (List<Object>) data; reqData.setDatalength(list.size()); //使用区级平台公钥对数据进行RSA加密 reqData.setData(RSAUtils.encrypt(jsonData, conf.getPublicKey())); //摘要,数据主体的MD5值 reqData.setDigst(MyMD5Util.encrypt(jsonData)); SH2023RespDto responseDto = SH2023HttpClientUtil.postPushData(conf.getApiUrl() + inteId, reqData, conf); SH2023RespDto responseDto = SH2023HttpClientUtil.postPushData(conf.getApiUrl() + inteId, JSON.toJSONString(reqData), conf); apiLog.setStatus(responseDto.getCode() == 200 ? 0 : responseDto.getCode()); apiLog.setResult(responseDto.getResult()); apiLogRep.save(apiLog); @@ -196,8 +200,8 @@ //获取指令id String key = RedisConst.buildKey(RedisConst.KYE_ORDER, conf.getKqdm()); String orderId = (String)redisUtil.get(key); if(StringUtils.isEmpty(orderId)){ OrderData orderData = (OrderData)redisUtil.get(key); if(StringUtils.isEmpty(orderData.getOrderid())){ ResponseDto responseDto = new ResponseDto(99, "指令id失效"); apiLog.setStatus(99); apiLog.setResult("指令id失效"); @@ -211,7 +215,7 @@ //获取身份ID,即行政区划码 reqData.setUid(conf.getUserName()); //指令id reqData.setOrderid(orderId); reqData.setOrderid(orderData.getOrderid()); //身份签名,使用自有RSA私钥进行加密(地区行政区划代码_当天日期) reqData.setAccess_token(RSAUtils.encryptData(reqData.getUid() + "_" + DateFormatUtils.format(new Date(), "yyyy-MM-dd"), conf.getPassword())); //数据总条数 @@ -222,7 +226,7 @@ //摘要,数据主体的MD5值 reqData.setDigst(MyMD5Util.encrypt(jsonData)); SH2023RespDto responseDto = SH2023HttpClientUtil.postPushData(conf.getApiUrl() + inteId, reqData, conf); SH2023RespDto responseDto = SH2023HttpClientUtil.postPushData(conf.getApiUrl() + inteId, JSON.toJSONString(reqData), conf); apiLog.setStatus(responseDto.getCode() == 200 ? 0 : responseDto.getCode()); apiLog.setResult(responseDto.getResult()); apiLogRep.save(apiLog); src/main/java/com/fzzy/push/sh2023/SH2023HttpClientUtil.java
@@ -26,8 +26,8 @@ * @throws Exception */ @SuppressWarnings("resource") public static SH2023RespDto postPushData(String url, SH2023ReqDto reqData , ApiConfs apiConfs) throws Exception { log.info("---------接口请求地址:" +url+ "----------参数:" + reqData.toString() +"---------"); public static SH2023RespDto postPushData(String url, String reqData , ApiConfs apiConfs) throws Exception { log.info("---------接口请求地址:" +url+ "----------参数:" + reqData +"---------"); BufferedReader in = null; URL urls = new URL(url); HttpURLConnection connection = null; @@ -48,7 +48,8 @@ connection.setRequestMethod("POST"); outputStream = connection.getOutputStream(); outputStream.write(reqData.toString().getBytes("UTF-8")); outputStream.write(reqData.getBytes("UTF-8")); try { connection.connect(); if (connection.getResponseCode() == 200) { src/main/java/com/fzzy/push/sh2023/SH2023OrderApiServiceImpl.java
@@ -13,6 +13,8 @@ import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.time.DateUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.text.ParseException; /** @@ -22,6 +24,7 @@ * @date 2023/08/17 */ @Slf4j @Service public class SH2023OrderApiServiceImpl implements OrderApiService { @Autowired @@ -59,7 +62,7 @@ //指令存入缓存,时效24小时 String key = RedisConst.buildKey(RedisConst.KYE_ORDER, conf.getKqdm()); redisUtil.set(key, orderid, 59 * 60 * 24); redisUtil.set(key, req, 59 * 60 * 24); ApiParam param = new ApiParam(); param.setPushProtocol(conf.getPushProtocol()); @@ -71,7 +74,7 @@ log.info("接收的指令中接口内容为={}", req.getContent()); String[] interfaces = ids.split(";"); for (String inteId : interfaces) { log.info("还是执行接口={}的数据上报", inteId); log.info("执行接口={}的数据上报", inteId); param.setInteId(inteId); getDataToPush(param, inteId); } @@ -85,102 +88,151 @@ switch (inteId) { case "1101": sh2023PushService11.pushData1101(apiRemoteService, param); break; case "1102": sh2023PushService11.pushData1102(apiRemoteService, param); break; case "1103": sh2023PushService11.pushData1103(apiRemoteService, param); break; case "1104": sh2023PushService11.pushData1104(apiRemoteService, param); break; case "1105": sh2023PushService11.pushData1105(apiRemoteService, param); break; case "1106": sh2023PushService11.pushData1106(apiRemoteService, param); break; case "1107": sh2023PushService11.pushData1107(apiRemoteService, param); break; case "1108": sh2023PushService11.pushData1108(apiRemoteService, param); break; case "1109": sh2023PushService11.pushData1109(apiRemoteService, param); break; case "1110": sh2023PushService11.pushData1110(apiRemoteService, param); break; case "1111": sh2023PushService11.pushData1111(apiRemoteService, param); break; case "1112": sh2023PushService11.pushData1112(apiRemoteService, param); break; case "1113": sh2023PushService11.pushData1113(apiRemoteService, param); break; case "1114": sh2023PushService11.pushData1114(apiRemoteService, param); break; case "1201": sh2023PushService12.pushData1201(apiRemoteService, param); break; case "1202": sh2023PushService12.pushData1202(apiRemoteService, param); break; case "1203": sh2023PushService12.pushData1203(apiRemoteService, param); break; case "1204": sh2023PushService12.pushData1204(apiRemoteService, param); break; case "1205": sh2023PushService12.pushData1205(apiRemoteService, param); break; case "1206": sh2023PushService12.pushData1206(apiRemoteService, param); break; case "1207": sh2023PushService12.pushData1207(apiRemoteService, param); break; case "1208": sh2023PushService12.pushData1209(apiRemoteService, param); break; case "1209": sh2023PushService12.pushData1209(apiRemoteService, param); break; case "1210": sh2023PushService12.pushData1210(apiRemoteService, param); break; case "1211": sh2023PushService12.pushData1211(apiRemoteService, param); break; case "1212": sh2023PushService12.pushData1212(apiRemoteService, param); break; case "2101": sh2023PushService12.pushData2101(apiRemoteService, param); break; case "2102": sh2023PushService12.pushData2102(apiRemoteService, param); break; case "2104": sh2023PushService12.pushData2104(apiRemoteService, param); break; case "1301": sh2023PushService13.pushData1301(apiRemoteService, param); break; case "1302": sh2023PushService13.pushData1302(apiRemoteService, param); break; case "1303": sh2023PushService13.pushData1303(apiRemoteService, param); break; case "1304": sh2023PushService13.pushData1304(apiRemoteService, param); break; case "1305": sh2023PushService13.pushData1305(apiRemoteService, param); break; case "1306": sh2023PushService13.pushData1306(apiRemoteService, param); break; case "1307": sh2023PushService13.pushData1307(apiRemoteService, param); break; case "1308": sh2023PushService13.pushData1308(apiRemoteService, param); break; case "1309": sh2023PushService13.pushData1309(apiRemoteService, param); break; case "1310": sh2023PushService13.pushData1310(apiRemoteService, param); break; case "1311": sh2023PushService13.pushData1311(apiRemoteService, param); break; case "2103": sh2023PushService13.pushData2103(apiRemoteService, param); break; case "1401": sh2023PushService14.pushData1401(apiRemoteService, param); break; case "1402": sh2023PushService14.pushData1402(apiRemoteService, param); break; case "1403": sh2023PushService14.pushData1403(apiRemoteService, param); break; case "1404": sh2023PushService14.pushData1404(apiRemoteService, param); break; case "1405": sh2023PushService14.pushData1405(apiRemoteService, param); break; case "2203": sh2023PushService14.pushData2203(apiRemoteService, param); break; case "2204": sh2023PushService14.pushData2204(apiRemoteService, param); break; default: log.error("-----上海市平台:未匹配到接口编码,不推送-----"); break; } } src/main/java/com/fzzy/push/sh2023/dto/SH2023Api1101.java
@@ -3,22 +3,15 @@ import com.alibaba.fastjson.annotation.JSONField; import com.bstek.dorado.annotation.PropertyDef; import com.fasterxml.jackson.annotation.JsonFormat; import com.fzzy.api.entity.ApiParent; import lombok.Data; import lombok.EqualsAndHashCode; import org.springframework.format.annotation.DateTimeFormat; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; import java.io.Serializable; import java.util.Date; /** * 接口表-单位 * * @author chen * @author czt * @date 2022-09-02 14:18 */ @Data @@ -96,6 +89,9 @@ @PropertyDef(label = "仓房数") private Integer cfs; @PropertyDef(label = "廒间数") private Integer ajs; @PropertyDef(label = "油罐数") private Integer ygs; @@ -105,26 +101,8 @@ @PropertyDef(label = "纬度") private double wd; @PropertyDef(label = "单位状态") private String dwzt; @PropertyDef(label = "备案类型", description = "0:初次备案 1:变更备案 2:重新备案") private String balx; @PropertyDef(label = "仓储业务类型") private String ccywlx; @PropertyDef(label = "仓储品种") private String ccpz; @PropertyDef(label = "备案状态") private String bazt; @PropertyDef(label = "操作标志") private String czbz; @PropertyDef(label = "廒间数") private Integer ajs; @PropertyDef(label = "标记位") private String bjw; @@ -133,17 +111,4 @@ @JSONField(format = "yyyy-MM-dd HH:mm:ss") private Date zhgxsj; @JSONField(serialize = false) @PropertyDef(label = "业务id") private String bizId; @JSONField(serialize = false) @PropertyDef(label = "同步时间", description = "从粮库系统同步到接口管理中心的时间") private Date syncTime; @JSONField(serialize = false) @PropertyDef(label = "库区代码") private String kqdm; } } src/main/java/com/fzzy/push/whhpjl/WhjlOrderApiServiceImpl.java
@@ -4,6 +4,7 @@ import com.fzzy.api.entity.ApiConfs; import com.fzzy.order.OrderApiService; import com.fzzy.order.data.OrderData; import org.springframework.stereotype.Service; /** * 上武汉军粮平台2023版-指令解析 @@ -11,6 +12,7 @@ * @author czt * @date 2023/08/17 */ @Service public class WhjlOrderApiServiceImpl implements OrderApiService { @Override