前幾天和其他公司系統做對接,每隔5分鍾把數據推到對方系統。
sign生成規則:sm3(年月日+單位編碼+byzl@smart)
sid=sm4(
{
"depaCode":"4403",
"sign":"11111",
"registerDeskAmount":1,
"inoculateDeskAmount":1,
"watchingAmount":1,
"serviceAmount":1
})
secretKey密鑰
V3UvdKISG6BnBEqq
示例
http://192.168.199.62:9778/smart/api/getSmartScreenDigital
引入maven依賴
<!--使用SM工具類 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.2.5</version>
</dependency>
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId>
<version>1.62</version>
</dependency>
封裝SM加密工具類
package com.jwx.digital.client.util; import cn.hutool.core.util.CharsetUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.crypto.SmUtil; import cn.hutool.crypto.asymmetric.KeyType; import cn.hutool.crypto.asymmetric.SM2; import cn.hutool.crypto.symmetric.SymmetricCrypto; import lombok.extern.slf4j.Slf4j; /** * SMUtils:SM加密工具類 * @Date 2020-10-29 * @version 1.0 */ @Slf4j public class SMUtils { /** * 默認的 sm4加密key */ public static final String DEFAULT_SM4_SECRET_KEY = "123456"; /** * SM2加密例子 * @param data 需要加密的字符串 * @return 返回加密后的字符串 */ public static String toSM2Str(String data) { SM2 sm2 = SmUtil.sm2(); // 公鑰加密,私鑰解密 String encryptStr = sm2.encryptBcd(data, KeyType.PublicKey); String decryptStr = StrUtil.utf8Str(sm2.decryptFromBcd(encryptStr, KeyType.PrivateKey)); return encryptStr; } /** * SM3加密 * @param data 需要加密的字符串 * @return 返回加密后的字符串 */ public static String toSM3Str(String data) { return SmUtil.sm3(data).toUpperCase(); } /** * SM4加密 * @param data 需要加密的字符串 * @param secretKey 需要加密的字符串 * @return 返回加密后的字符串 */ public static String toSM4Str(String data,String secretKey) { SymmetricCrypto sm4 = SmUtil.sm4(secretKey.getBytes(CharsetUtil.CHARSET_UTF_8)); return sm4.encryptHex(data, CharsetUtil.CHARSET_UTF_8).toUpperCase(); } public static String toSM4Str(String data) { return toSM4Str(data,DEFAULT_SM4_SECRET_KEY); } /** * SM4解密 * @param data 需要加密的字符串 * @param secretKey 需要加密的字符串 * @return 返回加密后的字符串 */ public static String parseSM4Str(String data,String secretKey) { SymmetricCrypto sm4 = SmUtil.sm4(secretKey.getBytes(CharsetUtil.CHARSET_UTF_8)); return sm4.decryptStr(data, CharsetUtil.CHARSET_UTF_8); } public static String parseSM4Str(String data) { return parseSM4Str(data,DEFAULT_SM4_SECRET_KEY); } }
參數實體
package com.jwx.digital.client.pojo.dto.ybzl; import com.jwx.commons.core.pojo.BaseDTO; import lombok.Data; /** * YbzlSmartScreenDigitalDTO * * @author 紅葉如醉 * @version 1.0 * @Date 2020-10-28 */ @Data public class YbzlSmartScreenDigitalDTO extends BaseDTO { /** * 單位編碼 */ private String depaCode; /** *校驗碼 */ private String sign; /** *當天(所有)登記台排隊人數 */ private Integer registerDeskAmount; /** *當天(所有)接種台排隊人數 */ private Integer inoculateDeskAmount; /** *當天(所有)留觀排隊人數 */ private Integer watchingAmount; /** *當天(所有)服務人數 */ private Integer serviceAmount; }
參數加密,調用外部接口
/** * 統計該門診人數情況 * * @return */ @Override public YbzlSmartScreenDigitalDTO CountSmartScreenDigital() { YbzlSmartScreenDigitalDTO ybzlSmartScreenDigitalDTO = new YbzlSmartScreenDigitalDTO(); ybzlSmartScreenDigitalDTO.setDepaCode(depaCode); // sign生成規則:sm3(年月日+單位編碼+ybzl@cybermax) SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd"); StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(format.format(new Date())).append(depaCode).append(serverUrlProperties.getSignSecret()); ybzlSmartScreenDigitalDTO.setSign(SMUtils.toSM3Str(stringBuilder.toString())); Example example = new Example(TicketActionDO.class); example.createCriteria().andEqualTo("prtyCode", ProcedureTypeEnum.REGISTRATION.getValue()) .andGreaterThan("tiacCreateTime", DateUtil.getCurrentDay()); //登記總人數 int registerDeskAmount = ticketActionMapper.selectCountByExample(example); ybzlSmartScreenDigitalDTO.setRegisterDeskAmount(registerDeskAmount); example.clear(); example.createCriteria().andEqualTo("prtyCode", ProcedureTypeEnum.VACCINATION.getValue()) .andGreaterThan("tiacCreateTime", DateUtil.getCurrentDay()); //接種總人數 ybzlSmartScreenDigitalDTO.setInoculateDeskAmount(ticketActionMapper.selectCountByExample(example)); example.clear(); example.createCriteria().andEqualTo("prtyCode", ProcedureTypeEnum.WATCH.getValue()) .andEqualTo("tiacStatus", TicketActionStatusEnum.PROCESSING.getValue()) .andGreaterThan("tiacCreateTime", DateUtil.getCurrentDay()); //正在留觀人數,不包括完成 ybzlSmartScreenDigitalDTO.setWatchingAmount(ticketActionMapper.selectCountByExample(example)); //當天服務人數 == 登記的人數 ybzlSmartScreenDigitalDTO.setServiceAmount(registerDeskAmount); String sid = SMUtils.toSM4Str(JSON.toJSONString(ybzlSmartScreenDigitalDTO), serverUrlProperties.getSecretKey()); Response<OuterResult> resultResponse; try { ybzlInterface = RetrofitFactory.getYbzlApi(); log.info("推送登記接種留觀服務人數到服務{} 數據內容{} ====== start", serverUrlProperties.getYbzlUrl(),JSON.toJSONString(ybzlSmartScreenDigitalDTO)); resultResponse = ybzlInterface.getSmartScreenDigital(sid).execute(); if(resultResponse.body()==null){ log.error("推送登記接種留觀服務人數到服務{} 返回消息體為空",serverUrlProperties.getYbzlUrl()); }else if (BasicEcode.SUCCESS.equals(resultResponse.body().getEcode())) { log.info("推送登記接種留觀服務人數到服務{}成功",serverUrlProperties.getYbzlUrl()); }else { log.error("推送登記接種留觀服務人數到服務{}異常 錯誤碼{}", serverUrlProperties.getYbzlUrl(),resultResponse.body().getEcode()); } } catch (Exception e) { log.error("推送登記接種留觀服務人數到服務{}異常{}", serverUrlProperties.getYbzlUrl(),e); } log.info("推送登記接種留觀服務人數 ====== end"); return ybzlSmartScreenDigitalDTO; }