src/main/java/com/fzzy/api/entity/ApiConfs.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/fzzy/api/utils/SM4Util.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/fzzy/api/view/ApiConfs.view.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/fzzy/conf/RestTemplateConfig.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/fzzy/otherview/whhpjl/pr/WhjlApi1101PR.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/fzzy/push/whhpjl/Whjl2023HttpClientUtil.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/fzzy/push/whhpjl/WhjlApiRemoteService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/fzzy/push/whhpjl/dto/WhjlReqDto.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/java/com/fzzy/api/entity/ApiConfs.java
@@ -62,6 +62,10 @@ @Column(name = "publicKey", length = 200) private String publicKey; @PropertyDef(label = "ææç ") @Column(name = "appCode", length = 50) private String appCode; @PropertyDef(label = "ç平尿¥å£å°å") @Column(name = "apiUrl", length = 200) private String apiUrl; src/main/java/com/fzzy/api/utils/SM4Util.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,201 @@ package com.fzzy.api.utils; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.pqc.math.linearalgebra.ByteUtils; import org.bouncycastle.util.encoders.Hex; import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.spec.SecretKeySpec; import java.security.Key; import java.security.SecureRandom; import java.security.Security; import java.util.Arrays; /** * @Author: huangyucai * @Date: 2022/10/31 * @Desc: **/ public class SM4Util { static { Security.addProvider(new BouncyCastleProvider()); } private static final String ENCODING = "UTF-8"; public static final String ALGORITHM_NAME = "SM4"; // å å¯ç®æ³/åç»å 坿¨¡å¼/åç»å¡«å æ¹å¼ // PKCS5Padding-以8个åè为ä¸ç»è¿è¡åç»å å¯ // å®ä¹åç»å 坿¨¡å¼ä½¿ç¨ï¼PKCS5Padding public static final String ALGORITHM_NAME_ECB_PADDING = "SM4/ECB/PKCS5Padding"; // 128-32ä½16è¿å¶ï¼256-64ä½16è¿å¶ public static final int DEFAULT_KEY_SIZE = 128; /** * èªå¨çæå¯é¥ï¼16è¿å¶å符串ï¼é¿åº¦32ï¼ * * @return * @explain */ public static String generateKey() throws Exception { return Hex.toHexString(generateKey(DEFAULT_KEY_SIZE)); } /** * @param keySize * @return * @throws Exception * @explain */ public static byte[] generateKey(int keySize) throws Exception { KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM_NAME, BouncyCastleProvider.PROVIDER_NAME); kg.init(keySize, new SecureRandom()); return kg.generateKey().getEncoded(); } /** * çæECBæå· * * @param algorithmName ç®æ³åç§° * @param mode æ¨¡å¼ * @param key * @return * @throws Exception * @explain ECB模å¼ï¼çµåå¯ç æ¬æ¨¡å¼ï¼Electronic codebookï¼ */ private static Cipher generateEcbCipher(String algorithmName, int mode, byte[] key) throws Exception { Cipher cipher = Cipher.getInstance(algorithmName, BouncyCastleProvider.PROVIDER_NAME); Key sm4Key = new SecretKeySpec(key, ALGORITHM_NAME); cipher.init(mode, sm4Key); return cipher; } /** * sm4å å¯ * * @param hexKey 16è¿å¶å¯é¥ï¼å¿½ç¥å¤§å°åï¼ * @param paramStr å¾ å å¯å符串 * @return è¿å16è¿å¶çå å¯å符串 * @explain å 坿¨¡å¼ï¼ECB * 坿é¿åº¦ä¸åºå®ï¼ä¼éç被å å¯å符串é¿åº¦çååèåå */ public static String encryptEcb(String hexKey, String paramStr) { try { String cipherText = ""; // 16è¿å¶å符串-->byte[] byte[] keyData = ByteUtils.fromHexString(hexKey); // String-->byte[] byte[] srcData = paramStr.getBytes(ENCODING); // å å¯åçæ°ç» byte[] cipherArray = encrypt_Ecb_Padding(keyData, srcData); // byte[]-->hexString cipherText = ByteUtils.toHexString(cipherArray); return cipherText; } catch (Exception e) { e.printStackTrace(); return ""; } } /** * å 坿¨¡å¼ä¹Ecb * * @param key * @param data * @return * @throws Exception * @explain */ public static byte[] encrypt_Ecb_Padding(byte[] key, byte[] data) throws Exception { Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.ENCRYPT_MODE, key); return cipher.doFinal(data); } /** * sm4è§£å¯ * * @param hexKey 16è¿å¶å¯é¥ * @param cipherText 16è¿å¶çå å¯å符串ï¼å¿½ç¥å¤§å°åï¼ * @return è§£å¯åçå符串 * @throws Exception * @explain è§£å¯æ¨¡å¼ï¼éç¨ECB */ public static String decryptEcb(String hexKey, String cipherText) { // ç¨äºæ¥æ¶è§£å¯åçå符串 String decryptStr = ""; // hexString-->byte[] byte[] keyData = ByteUtils.fromHexString(hexKey); // hexString-->byte[] byte[] cipherData = ByteUtils.fromHexString(cipherText); // è§£å¯ byte[] srcData = new byte[0]; try { srcData = decrypt_Ecb_Padding(keyData, cipherData); // byte[]-->String decryptStr = new String(srcData, ENCODING); } catch (Exception e) { } return decryptStr; } /** * è§£å¯ * * @param key * @param cipherText * @return * @throws Exception * @explain */ public static byte[] decrypt_Ecb_Padding(byte[] key, byte[] cipherText) throws Exception { Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.DECRYPT_MODE, key); return cipher.doFinal(cipherText); } /** * æ ¡éªå å¯ååçå符串æ¯å¦ä¸ºå䏿°æ® * * @param hexKey 16è¿å¶å¯é¥ï¼å¿½ç¥å¤§å°åï¼ * @param cipherText 16è¿å¶å å¯åçå符串 * @param paramStr å å¯åçå符串 * @return æ¯å¦ä¸ºå䏿°æ® * @throws Exception * @explain */ public static boolean verifyEcb(String hexKey, String cipherText, String paramStr) throws Exception { // ç¨äºæ¥æ¶æ ¡éªç»æ boolean flag = false; // hexString-->byte[] byte[] keyData = ByteUtils.fromHexString(hexKey); // å°16è¿å¶åç¬¦ä¸²è½¬æ¢ææ°ç» byte[] cipherData = ByteUtils.fromHexString(cipherText); // è§£å¯ byte[] decryptData = decrypt_Ecb_Padding(keyData, cipherData); // å°ååç¬¦ä¸²è½¬æ¢æbyte[] byte[] srcData = paramStr.getBytes(ENCODING); // 夿2个æ°ç»æ¯å¦ä¸è´ flag = Arrays.equals(decryptData, srcData); return flag; } /* public static void main(String[] args) { try { String json = "{\"name\":\"jz\"}"; System.out.println("ææï¼" + json); // çæ32ä½16è¿å¶å¯é¥ String key = SM4Util.generateKey(); System.out.println("å¯é¥ï¼" + key); String cipher = SM4Util.encryptEcb(key, json); System.out.println("坿ï¼" + cipher); System.out.println("æ°æ®æ¯å¦ææï¼" + SM4Util.verifyEcb(key, cipher, json)); String res = SM4Util.decryptEcb(key, cipher); System.out.println("è§£å¯åæ°æ®ï¼" + res); } catch (Exception e) { e.printStackTrace(); } }*/ } src/main/java/com/fzzy/api/view/ApiConfs.view.xml
@@ -27,6 +27,10 @@ <Property></Property> <Property name="label">çå¹³å°å å¯å ¬é¥</Property> </PropertyDef> <PropertyDef name="appCode"> <Property></Property> <Property name="label">ææç </Property> </PropertyDef> <PropertyDef name="apiUrl"> <Property></Property> <Property name="label">ç平尿¥å£å°å</Property> @@ -426,13 +430,18 @@ <Property name="labelWidth">120</Property> <Editor/> </AutoFormElement> <AutoFormElement layoutConstraint="colSpan:2"> <AutoFormElement> <Property name="name">publicKey</Property> <Property name="property">publicKey</Property> <Property name="labelWidth">125</Property> <Editor/> </AutoFormElement> <AutoFormElement> <Property name="name">appCode</Property> <Property name="property">appCode</Property> <Editor/> </AutoFormElement> <AutoFormElement> <Property name="name">pushProtocol</Property> <Property name="property">pushProtocol</Property> <Property name="labelWidth">125</Property> src/main/java/com/fzzy/conf/RestTemplateConfig.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,35 @@ package com.fzzy.conf; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.web.client.RestTemplate; import java.nio.charset.StandardCharsets; /** * RestTemplateçé ç½®ï¼SpringBootå°è£ çHTTPåè®®ï¼GETåPOSTè¯·æ±æ¹æ³ * * @author Andy * */ @Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate(ClientHttpRequestFactory factory) { RestTemplate restTemplate = new RestTemplate(factory); restTemplate.getMessageConverters().set(1,new StringHttpMessageConverter(StandardCharsets.UTF_8)); return restTemplate; } @Bean public ClientHttpRequestFactory simpleClientHttpRequestFactory() { SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); factory.setConnectTimeout(15000);// è®¾ç½®è¿æ¥è¶ æ¶ï¼å使¯«ç§ factory.setReadTimeout(15000);//设置读åè¶ æ¶ return factory; } } src/main/java/com/fzzy/otherview/whhpjl/pr/WhjlApi1101PR.java
@@ -18,6 +18,7 @@ import com.fzzy.otherview.whhpjl.dto.WhjlApi1101; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -107,30 +108,31 @@ */ @Expose public String pushData(List<WhjlApi1101> items) { ResponseDto responseDto; String result = ""; String kqdm = items.get(0).getKqdm(); ApiConfs apiConf = apiCommonService.getConf(kqdm); if (null == apiConf) return "ç³»ç»æ²¡æè·åå°å½ååºåºé 置信æ¯ï¼æ§è¡å¤±è´¥"; if (null == apiConf) { return "ç³»ç»æ²¡æè·åå°å½ååºåºé 置信æ¯ï¼æ§è¡å¤±è´¥"; } //å°è£ åæ° ApiParam param = new ApiParam(apiConf, WhjlConstant.API_CATEGORY_11, WhjlConstant.API_CODE_1101); //è·åå®ç°æ¥å£ ApiRemoteService apiService = apiPushManager.getApiRemoteService(param.getPushProtocol()); if (null == apiService) return "ç³»ç»æ²¡æå½åæ¨éåè®®é ç½®ï¼æ§è¡å¤±è´¥"; if (null == apiService) { return "ç³»ç»æ²¡æå½åæ¨éåè®®é ç½®ï¼æ§è¡å¤±è´¥"; } //æ¨éï¼æ°æ®ä¸ºéåå½¢å¼ responseDto = apiService.pushData(param, apiConf, items); if (responseDto.getSuccess() == 0) { //æ¨éæåï¼æ´æ°æ°æ®ä¸ä¼ ç¶æ ResponseDto responseDto; ApiInfoData infoData; for (WhjlApi1101 data : items) { responseDto = apiService.pushData(param, apiConf, items); if (responseDto.getSuccess() == 0) { if(Constant.CZBZ_I.equals(data.getCzbz())){ infoData = new ApiInfoData(); infoData.setId(data.getBizId()); infoData.setKqdm(data.getKqdm()); @@ -142,7 +144,6 @@ data.setCzbz(Constant.CZBZ_U); infoData.setCzbz(Constant.CZBZ_U); infoData.setData(JSON.toJSONString(data)); apiInfoDataRep.save(infoData); } } src/main/java/com/fzzy/push/whhpjl/Whjl2023HttpClientUtil.java
@@ -1,66 +1,40 @@ package com.fzzy.push.whhpjl; import com.alibaba.fastjson.JSON; import com.fzzy.api.entity.ApiConfs; import com.fzzy.push.whhpjl.dto.WhjlReqDto; import com.fzzy.push.whhpjl.dto.WhjlRespDto; import lombok.extern.slf4j.Slf4j; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; /** * æ¦æ±åç²®çå¹³å°-ä¸ä¼ æ°æ®æå¡ç±» * * @author czt * @date 2023/08/04 * @date 2023/10/23 */ @Slf4j @Component public class Whjl2023HttpClientUtil { @Autowired private RestTemplate restTemplate; /** * post formData * æ°æ®ä¸æ¥postè¯·æ± * @param url * @param reqData * @return * @throws Exception */ @SuppressWarnings("resource") public static WhjlRespDto postPushData(String url, WhjlReqDto reqData , ApiConfs apiConfs) throws Exception { log.info("---------æ¥å£è¯·æ±å°åï¼" +url+ "----------åæ°ï¼" + reqData.toString() +"---------"); BufferedReader in = null; URL urls = new URL(url); HttpURLConnection connection = null; OutputStream outputStream = null; public WhjlRespDto postPushData(String url, WhjlReqDto reqData) { log.info("---------æ¥å£è¯·æ±å°åï¼" + url + "----------åæ°ï¼" + JSON.toJSONString(reqData) + "---------"); String rs = ""; WhjlRespDto responseDto; try { connection = (HttpURLConnection) urls.openConnection(); connection.setRequestProperty("Content-Type", "application/json;charset=UTF-8"); connection.setDoOutput(true); connection.setDoInput(true); connection.setRequestProperty("Accept-Language", "zh-CN,zh;q=0.8"); connection.setRequestProperty("Accept", "*/*"); connection.setRequestProperty("Range", "bytes=" + ""); connection.setConnectTimeout(20000); connection.setReadTimeout(30000); connection.setRequestMethod("POST"); outputStream = connection.getOutputStream(); outputStream.write(reqData.toString().getBytes("UTF-8")); try { connection.connect(); if (connection.getResponseCode() == 200) { in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8")); String line = ""; while ((line = in.readLine()) != null) { rs += line; } }else{ log.error("httpç¶æï¼" + connection.getResponseCode()); log.error("httpæ¶æ¯ï¼" + connection.getResponseMessage()); } rs = restTemplate.postForObject(url, reqData, String.class); } catch (Exception e) { System.out.println("åçå¼å¸¸"); @@ -72,18 +46,5 @@ responseDto = JSON.parseObject(rs,WhjlRespDto.class); if(responseDto == null ) return new WhjlRespDto(99,"æ¥å£è¯·æ±åçæªç¥é误"); return responseDto; } finally { try { outputStream.close(); if (in != null){ in.close(); } } catch (Exception e) { } outputStream = null; if (connection != null) connection.disconnect(); connection = null; } } } src/main/java/com/fzzy/push/whhpjl/WhjlApiRemoteService.java
@@ -39,6 +39,8 @@ private ApiTriggerService apiTriggerService; @Autowired private ApiLogRep apiLogRep; @Autowired private Whjl2023HttpClientUtil whjl2023HttpClientUtil; @Override public String getProtocol() { @@ -64,7 +66,7 @@ ApiLog apiLog = new ApiLog(); apiLog.setId(ContextUtil.getUUID()); apiLog.setInteId(inteId); String jsonData = getJsonData(inteId, data); String jsonData = getJsonData(data); log.info("æ¥å£æ°æ®ä¿¡æ¯=" + jsonData); inteId = getInteId(inteId); if (StringUtils.isEmpty(inteId)) { @@ -86,42 +88,38 @@ return responseDto; } //å°è£ æ¨éæ°æ® WhjlReqDto reqData = new WhjlReqDto(); //æ¥ææ è¯ID reqData.setId(ContextUtil.getUUID()); //身份ID reqData.setUid(conf.getUserName()); //è·åæä»¤id String key = RedisConst.buildKey(RedisConst.KYE_ORDER, conf.getKqdm()); String orderId = (String)redisUtil.get(key); if(StringUtils.isEmpty(orderId)){ ResponseDto responseDto = new ResponseDto(99, "æä»¤id失æ"); apiLog.setStatus(99); apiLog.setResult("æä»¤id失æ"); apiLogRep.save(apiLog); return responseDto; orderId = reqData.getId(); } //å°è£ æ¨éæ°æ® WhjlReqDto reqData = new WhjlReqDto(); reqData.setId(ContextUtil.getUUID()); reqData.setUid(conf.getKqdm()); //æä»¤ID reqData.setOrderid(orderId); reqData.setAppcode(conf.getUserName()); reqData.setTimestamp(ContextUtil.getCurTimeMillis()); //åºç¨ç reqData.setAppcode(conf.getAppCode()); //æ¶é´æ³ reqData.setTimestamp(Long.valueOf(ContextUtil.getCurTimeMillis())); //身份ç¾åï¼å¯¹åºç¨ç _ææç _ç«ç¹ç¼ç _æ¥æID_æ¶é´æ³è¿è¡MD5ç®æ³ç¾å String accessToken = reqData.getAppcode() +"_" + conf.getPassword() +"_" + reqData.getUid() + "_" + reqData.getId() + "_" + reqData.getTimestamp(); log.info("身份ç¾åï¼" + accessToken); reqData.setAccesstoken(MyMD5Util.encrypt(accessToken)); //æ°æ®æ»æ¡æ° List<Object> list = (List<Object>)data; reqData.setDatalength(list.size()); //æ°æ®è¿è¡SM4å å¯ reqData.setData(AESUtils.encrypt(jsonData, conf.getPublicKey())); reqData.setOperator("insert"); //æ°æ®ä¸»ä½ï¼è¿è¡SM4å å¯ reqData.setData(SM4Util.encryptEcb(conf.getPublicKey(), jsonData)); //æè¦ï¼æ°æ®ä¸»ä½çMD5å¼ reqData.setDigst(MyMD5Util.encrypt(jsonData)); //身份ç¾åï¼å¯¹åºç¨ç _ææç _ç«ç¹ç¼ç _æ¥æID_æ¶é´æ³è¿è¡MD5ç®æ³ç¾å StringBuffer buffer = new StringBuffer(); buffer.append(reqData.getAppcode()).append("_"); buffer.append(conf.getPublicKey()).append("_"); buffer.append(conf.getKqmc()).append("_"); buffer.append(reqData.getId()).append("_"); buffer.append(reqData.getTimestamp()); reqData.setDigst(MyMD5Util.encrypt(buffer.toString())); reqData.setDigest(MyMD5Util.encrypt(jsonData)); //æä½ç±»å reqData.setOperator("insert"); WhjlRespDto responseDto = Whjl2023HttpClientUtil.postPushData(conf.getApiUrl() + inteId, reqData, conf); WhjlRespDto responseDto = whjl2023HttpClientUtil.postPushData(conf.getApiUrl() + inteId, reqData); apiLog.setStatus(responseDto.getCode() == 200 ? 0 : responseDto.getCode()); apiLog.setResult(responseDto.getResult()); apiLogRep.save(apiLog); @@ -137,15 +135,16 @@ } /** * è°æ´æ°æ®å°è£ ï¼è·åjsonæ°æ® * è°æ´æ°æ®å°è£ ælistï¼è·åjsonæ°æ® * * @param inteId * @param data * @return * @throws Exception */ private String getJsonData(String inteId, Object data) { return JSON.toJSONString(data); private String getJsonData(Object data) { List<Object> list = new ArrayList<>(); list.add(data); return JSON.toJSONString(list); } private String getInteId(String inteId) { src/main/java/com/fzzy/push/whhpjl/dto/WhjlReqDto.java
@@ -35,7 +35,7 @@ /** * æ¶é´æ³ */ private String timestamp; private Long timestamp; /** * 身份ç¾å @@ -55,7 +55,7 @@ /** * æ°æ®æè¦ */ private String digst; private String digest; /** * æä½ç±»å