package com.smartor.common; import com.alibaba.fastjson2.JSON; import com.smartor.domain.MtSubmitSmResp; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.Map; /** * MT消息发送工具类(SP向行业汇聚平台提交MT消息) * 接口地址:http://ip:port/submitsm * 编码:UTF-8,鉴权算法:MD5 */ @Slf4j @Component public class MtSubmitSmUtil { private static final RestTemplate restTemplate = new RestTemplate(); @Value("${sms_password}") private String password; @Value("${sms_accountName}") private String accountName; @Value("${sms_url}") private String url; @Value("${sms_sourceAddr}") private String sourceAddr; @Value("${sms_serviceCode}") private String serviceCode; @Value("${sms_appkey}") private String appKey; @Value("${sms_flag}") private String smsFlag; /** * 发送MT消息 * * @param destAddr 目标号码 * @param content 短信内容 * @return MtSubmitSmResp 响应结果 */ public Map submitSm(String destAddr, String content) { try { String date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); String hashHex = buildHashHex(accountName, password, date); Map authMap = new HashMap<>(); authMap.put("Algorithm", "MD5"); authMap.put("Date", date); authMap.put("HASHHEX", hashHex); Map reqMap = new HashMap<>(); reqMap.put("accountName", accountName); reqMap.put("Authorization", authMap); reqMap.put("DestAddr", destAddr); reqMap.put("SourceAddr", sourceAddr); reqMap.put("Content", smsFlag + content); reqMap.put("ServiceCode", serviceCode); HttpHeaders headers = new HttpHeaders(); headers.setContentType(new MediaType("application", "json", StandardCharsets.UTF_8)); headers.set("Accept-Language", "UTF-8"); headers.set("app-key", "ak-BFq4NN0TMf92J7KAioNYGz74"); HttpEntity entity = new HttpEntity<>(JSON.toJSONString(reqMap), headers); log.info("MtSubmitSm 请求地址:{},请求参数:{}", url + "/submitsm", JSON.toJSONString(reqMap)); ResponseEntity response = restTemplate.postForEntity(url, entity, String.class); log.info("MtSubmitSm 响应结果:{}", response.getBody()); return JSON.parseObject(response.getBody(), Map.class); } catch (Exception e) { log.error("MtSubmitSm 发送失败,url:{},destAddr:{},error:{}", url, destAddr, e.getMessage(), e); Map resp = new HashMap<>(); resp.put("code", -1); resp.put("message", "发送异常:" + e.getMessage()); return resp; } } /** * 计算HASHHEX:MD5(Algorithm:帐号名:密码:Date) * 例:MD5:95555:12345:2016-10-09 16:19:43 */ private static String buildHashHex(String accountName, String password, String date) throws Exception { String plain = "MD5:" + accountName + ":" + password + ":" + date; MessageDigest md = MessageDigest.getInstance("MD5"); byte[] bytes = md.digest(plain.getBytes(StandardCharsets.UTF_8)); StringBuilder sb = new StringBuilder(); for (byte b : bytes) { sb.append(String.format("%02x", b)); } return sb.toString(); } }