CZT
2023-09-18 65b9b81171843545bc17a8e7167ff06c3d80e73d
调整上海接口加密问题
已修改8个文件
171 ■■■■■ 文件已修改
src/main/java/com/fzzy/api/utils/RSAUtils.java 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/fzzy/order/OrderManager.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/fzzy/order/data/OrderData.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/fzzy/push/sh2023/SH2023ApiRemoteService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/fzzy/push/sh2023/SH2023HttpClientUtil.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/fzzy/push/sh2023/SH2023OrderApiServiceImpl.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/fzzy/push/sh2023/dto/SH2023Api1101.java 45 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/fzzy/push/whhpjl/WhjlOrderApiServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | 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