| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.common.utils.sms; |
| | | |
| | | import com.alibaba.fastjson.JSON; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.alibaba.fastjson.annotation.JSONField; |
| | | import com.ruoyi.common.utils.HttpUtil; |
| | | import com.ruoyi.common.utils.StringUtils; |
| | | import com.ruoyi.common.utils.http.HttpUtils; |
| | | import com.ruoyi.common.utils.sign.Md5Utils; |
| | | import lombok.Data; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | |
| | | import java.nio.charset.StandardCharsets; |
| | | import java.util.Base64; |
| | | import java.util.Date; |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * çä¿¡åéå·¥å
·ç±» |
| | | * |
| | | * @author ruoyi |
| | | */ |
| | | @Slf4j |
| | | public final class SmsUtils { |
| | | |
| | | private SmsUtils() { |
| | | } |
| | | |
| | | /** |
| | | * äºMAS æ¯æ¹æ¬¡æå¤ææºå·æ°é |
| | | */ |
| | | private static final int YUNMAS_MAX_MOBILES = 5000; |
| | | |
| | | /** |
| | | * äºMAS è¿åç 说æ |
| | | */ |
| | | private static final Map<String, String> YUNMAS_RSPCOD_DESC = new HashMap<>(); |
| | | |
| | | static { |
| | | YUNMAS_RSPCOD_DESC.put("success", "æ°æ®éªè¯éè¿"); |
| | | YUNMAS_RSPCOD_DESC.put("IllegalMac", "macæ ¡éªä¸éè¿"); |
| | | YUNMAS_RSPCOD_DESC.put("IllegalSignId", "æ æçç¾åç¼ç "); |
| | | YUNMAS_RSPCOD_DESC.put("InvalidMessage", "éæ³æ¶æ¯ï¼è¯·æ±æ°æ®è§£æå¤±è´¥"); |
| | | YUNMAS_RSPCOD_DESC.put("InvalidUsrOrPwd", "éæ³ç¨æ·å/å¯ç "); |
| | | YUNMAS_RSPCOD_DESC.put("NoSignId", "æªå¹é
å°å¯¹åºçç¾åä¿¡æ¯"); |
| | | YUNMAS_RSPCOD_DESC.put("TooManyMobiles", "ææºå·æ°éè¶
é(>5000)"); |
| | | } |
| | | |
| | | /** |
| | | * äºMAS æ¥å£é
ç½®ã |
| | | * <p> |
| | | * 注æï¼secretKey åªåä¸ mac 计ç®ï¼ä¸è½æ¾è¿è¯·æ±æ¥æã |
| | | */ |
| | | @Data |
| | | public static class YunMasConfig { |
| | | /** |
| | | * æ¥å£å°å |
| | | */ |
| | | private String url; |
| | | /** |
| | | * ä¼ä¸åç§° |
| | | */ |
| | | private String ecName; |
| | | /** |
| | | * æ¥å£è´¦å·ç¨æ·å |
| | | */ |
| | | private String apId; |
| | | /** |
| | | * å¯é¥ï¼ä»
åä¸ mac 计ç®ï¼ |
| | | */ |
| | | private String secretKey; |
| | | /** |
| | | * ç¾åç¼ç |
| | | */ |
| | | private String sign; |
| | | /** |
| | | * æ©å±ç ï¼ç²¾ç¡®å¹é
填空åç¬¦ä¸²ï¼æ¨¡ç³å¹é
å¯å¡«ç©ºå符串æèªå®ä¹æ©å±ç ï¼ä¸æå¡ä»£ç å计ä¸è¶
è¿20ä½ï¼ |
| | | */ |
| | | private String addSerial; |
| | | |
| | | public String getAddSerial() { |
| | | return addSerial == null ? "" : addSerial; |
| | | } |
| | | |
| | | /** |
| | | * 丽水å¦å¹¼é»è®¤é
ç½®ï¼æªå¨ sys_config ä¸é
ç½®æ¶ä½¿ç¨ï¼ |
| | | */ |
| | | public static YunMasConfig defaultLishui() { |
| | | YunMasConfig config = new YunMasConfig(); |
| | | config.setUrl("http://9.208.5.35:1992/sms/norsubmit"); |
| | | config.setEcName("丽水å¸å¦å¹¼ä¿å¥é¢"); |
| | | config.setApId("dxjkkf"); |
| | | config.setSecretKey("1q2w3e4r5t6y"); |
| | | config.setSign("D9gKbwdt7"); |
| | | config.setAddSerial(""); |
| | | return config; |
| | | } |
| | | |
| | | /** |
| | | * æ ¹æ®é
ç½®å
容ï¼jsonï¼æå»ºï¼æªé
ç½®çåæ®µæ²¿ç¨é»è®¤å¼ |
| | | * |
| | | * @param configJson å½¢å¦ {"url":"...","ecName":"...","apId":"...","secretKey":"...","sign":"...","addSerial":""} |
| | | */ |
| | | public static YunMasConfig of(String configJson) { |
| | | YunMasConfig config = defaultLishui(); |
| | | if (StringUtils.isEmpty(configJson)) { |
| | | return config; |
| | | } |
| | | JSONObject json; |
| | | try { |
| | | json = JSON.parseObject(configJson); |
| | | } catch (Exception e) { |
| | | log.error("ãäºMASãé
置解æå¤±è´¥ï¼ä½¿ç¨é»è®¤é
ç½®ï¼é
ç½®å
容ï¼{}", configJson, e); |
| | | return config; |
| | | } |
| | | if (json == null) { |
| | | return config; |
| | | } |
| | | if (StringUtils.isNotEmpty(json.getString("url"))) { |
| | | config.setUrl(json.getString("url")); |
| | | } |
| | | if (StringUtils.isNotEmpty(json.getString("ecName"))) { |
| | | config.setEcName(json.getString("ecName")); |
| | | } |
| | | if (StringUtils.isNotEmpty(json.getString("apId"))) { |
| | | config.setApId(json.getString("apId")); |
| | | } |
| | | if (StringUtils.isNotEmpty(json.getString("secretKey"))) { |
| | | config.setSecretKey(json.getString("secretKey")); |
| | | } |
| | | if (StringUtils.isNotEmpty(json.getString("sign"))) { |
| | | config.setSign(json.getString("sign")); |
| | | } |
| | | if (json.containsKey("addSerial")) { |
| | | config.setAddSerial(json.getString("addSerial")); |
| | | } |
| | | return config; |
| | | } |
| | | |
| | | /** |
| | | * å
³é®åæ°æ¯å¦é½å
¨ |
| | | */ |
| | | public boolean isValid() { |
| | | return StringUtils.isNotEmpty(url) && StringUtils.isNotEmpty(ecName) |
| | | && StringUtils.isNotEmpty(apId) && StringUtils.isNotEmpty(secretKey) |
| | | && StringUtils.isNotEmpty(sign); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * çä¿¡åéç»æ |
| | | */ |
| | | @Data |
| | | public static class SmsResult { |
| | | /** |
| | | * å¹³å°è¿åçç¶æç ï¼success è¡¨ç¤ºæ ¡éªéè¿ï¼ |
| | | */ |
| | | private String rspcod; |
| | | /** |
| | | * æ¶æ¯æ¹æ¬¡å·ï¼å¤±è´¥æ¶ä¸ºç©º |
| | | */ |
| | | private String msgGroup; |
| | | /** |
| | | * å¹³å°è¿åçæ°æ®æ ¡éªç»æ |
| | | */ |
| | | private boolean success; |
| | | /** |
| | | * æ¬å°å¼å¸¸/失败æè¿°ï¼ä¾¿äºææ¥ |
| | | */ |
| | | private String message; |
| | | |
| | | /** |
| | | * æ¯å¦åéæåï¼å¹³å°æ ¡éªéè¿ï¼ |
| | | */ |
| | | @JSONField(serialize = false, deserialize = false) |
| | | public boolean isOk() { |
| | | return success && "success".equals(rspcod); |
| | | } |
| | | |
| | | public static SmsResult fail(String message) { |
| | | SmsResult result = new SmsResult(); |
| | | result.setSuccess(false); |
| | | result.setMessage(message); |
| | | return result; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æå·å¸ä¸å»é¢å´å±±é¢åºæçä¿¡æ¥å£ |
| | | * |
| | | * @param url çä¿¡URL |
| | | * @param userName çä¿¡å¸å· |
| | | * @param passWord çä¿¡å¯ç |
| | | * @param phone ææºå·ç»åå¦ 13500000001,13500000002 |
| | | * @param content çä¿¡å
容 |
| | | * @return åéç»æ |
| | | */ |
| | | public static String sendSms(String url, String userName, String passWord, String phone, String content) { |
| | | long timestamp = new Date().getTime(); |
| | | String sign = Md5Utils.hash(userName + timestamp + Md5Utils.hash(passWord)); |
| | | content = "ãæå·å¸è¿ç¤å»é¢ã" + content; |
| | | String jsonMsg = "{" + |
| | | "\"userName\": \"" + userName + "\"," + |
| | | "\"content\": \"" + content + "\"," + |
| | | "\"phoneList\": [" + phone + "]," + |
| | | "\"timestamp\": " + timestamp + "," + |
| | | "\"sign\": \"" + sign + "\"" + |
| | | "}"; |
| | | Boolean sendMsg = HttpUtil.postJsonRequest(url, jsonMsg); |
| | | return sendMsg.toString(); |
| | | |
| | | } |
| | | |
| | | |
| | | /** |
| | | * æå·å¸ä¸å»é¢æ¹æ»¨é¢åºæçä¿¡æ¥å£ |
| | | * |
| | | * @param url çä¿¡URL |
| | | * @param userName çä¿¡å¸å· |
| | | * @param passWord çä¿¡å¯ç |
| | | * @param phone ææºå·ç»åå¦ 13500000001,13500000002 |
| | | * @param content çä¿¡å
容 |
| | | * @return åéç»æ |
| | | */ |
| | | public static String sendSms1(String url, String userName, String passWord, String phone, String content) { |
| | | long timestamp = new Date().getTime(); |
| | | String sign = Md5Utils.hash(userName + timestamp + Md5Utils.hash(passWord)); |
| | | content = "ãæå·å¸ç¬¬ä¸äººæ°å»é¢ã" + content; |
| | | String jsonMsg = "{" + |
| | | "\"userName\": \"" + userName + "\"," + |
| | | "\"content\": \"" + content + "\"," + |
| | | "\"phoneList\": [" + phone + "]," + |
| | | "\"timestamp\": " + timestamp + "," + |
| | | "\"sign\": \"" + sign + "\"" + |
| | | "}"; |
| | | Boolean sendMsg = HttpUtil.postJsonRequest(url, jsonMsg); |
| | | return sendMsg.toString(); |
| | | |
| | | } |
| | | |
| | | /** |
| | | * ä¸å½ç§»å¨äºMAS æ®éçä¿¡åéï¼ä¸å¯¹ä¸/å¤å¯¹ä¸æ¨¡å¼ï¼ |
| | | * <p> |
| | | * æ¥å£ï¼POST {url}ï¼æ¥æä¸º json ç base64 ç¼ç ã |
| | | * <ul> |
| | | * <li>mac æ ecNameãapIdãsecretKeyãmobilesãcontentãsignãaddSerial é¡ºåºæ¼æ¥åå MD5ï¼32ä½å°åï¼</li> |
| | | * <li>secretKey åªåä¸ mac 计ç®ï¼ä¸æ¾è¿è¯·æ±æ¥æ</li> |
| | | * <li>ç¾åç±å¹³å°æ ¹æ® sign ç¼ç èªå¨è¿½å ï¼content ä¸ä¸è¦åæå·¥æ¼ãç¾åã</li> |
| | | * </ul> |
| | | * |
| | | * @param config äºMAS é
ç½® |
| | | * @param mobiles æ¶ä¿¡ææºå·ï¼è±æéå·åéï¼å¦ 13800138000,13800138001ï¼æ¯æ¹ä¸è¶
è¿ 5000 个 |
| | | * @param content çä¿¡å
容ï¼mac ç¨æç»å
容计ç®ï¼è®¡ç®åä¸å¾åä¿®æ¹ï¼ |
| | | * @return åéç»æï¼éè¿ {@link SmsResult#isOk()} 夿æ¯å¦æå |
| | | */ |
| | | public static SmsResult sendYunMasSms(YunMasConfig config, String mobiles, String content) { |
| | | if (config == null || !config.isValid()) { |
| | | return SmsResult.fail("äºMASé
ç½®ä¸å®æ´"); |
| | | } |
| | | if (StringUtils.isEmpty(mobiles)) { |
| | | return SmsResult.fail("æ¶ä¿¡ææºå·ä¸è½ä¸ºç©º"); |
| | | } |
| | | if (StringUtils.isEmpty(content)) { |
| | | return SmsResult.fail("çä¿¡å
容ä¸è½ä¸ºç©º"); |
| | | } |
| | | if (mobiles.split(",").length > YUNMAS_MAX_MOBILES) { |
| | | return SmsResult.fail("ææºå·æ°éè¶
é(>" + YUNMAS_MAX_MOBILES + ")"); |
| | | } |
| | | |
| | | String addSerial = config.getAddSerial(); |
| | | // 1. mac å¿
é¡»ç¨æ¥æéæç»åéçå
å®¹è®¡ç® |
| | | String mac = Md5Utils.hash(config.getEcName() + config.getApId() + config.getSecretKey() |
| | | + mobiles + content + config.getSign() + addSerial); |
| | | |
| | | // 2. ç¨ json ç»è£
æ¥æï¼é¿å
å
容ä¸çå¼å·/åææ ç ´åæ¥æï¼secretKey ä¸è½æ¥æ |
| | | JSONObject body = new JSONObject(true); |
| | | body.put("ecName", config.getEcName()); |
| | | body.put("apId", config.getApId()); |
| | | body.put("mobiles", mobiles); |
| | | body.put("content", content); |
| | | body.put("sign", config.getSign()); |
| | | body.put("addSerial", addSerial); |
| | | body.put("mac", mac); |
| | | |
| | | String requestBody = Base64.getEncoder() |
| | | .encodeToString(body.toJSONString().getBytes(StandardCharsets.UTF_8)); |
| | | |
| | | try { |
| | | String resp = HttpUtil.postJsonRequestForString(config.getUrl(), requestBody); |
| | | log.info("ãäºMASãåéçä¿¡ï¼ææºå·ï¼{}ï¼ååºï¼{}", mobiles, resp); |
| | | if (StringUtils.isEmpty(resp)) { |
| | | return SmsResult.fail("äºMASååºä¸ºç©º"); |
| | | } |
| | | SmsResult result = JSON.parseObject(resp, SmsResult.class); |
| | | if (result == null) { |
| | | return SmsResult.fail("äºMASååºè§£æå¤±è´¥ï¼" + resp); |
| | | } |
| | | if (!result.isOk()) { |
| | | String desc = YUNMAS_RSPCOD_DESC.getOrDefault(result.getRspcod(), "æªç¥é误"); |
| | | result.setMessage(desc); |
| | | log.error("ãäºMASãåéå¤±è´¥ï¼ææºå·ï¼{}ï¼rspcodï¼{}ï¼{}ï¼ï¼ååºï¼{}", |
| | | mobiles, result.getRspcod(), desc, resp); |
| | | } |
| | | return result; |
| | | } catch (Exception e) { |
| | | log.error("ãäºMASãåéå¼å¸¸ï¼ææºå·ï¼{}ï¼åå ï¼{}", mobiles, e.getMessage(), e); |
| | | return SmsResult.fail("äºMASåéå¼å¸¸ï¼" + e.getMessage()); |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * æå·å¸ä¸å»é¢å´å±±é¢åºå¾®ä¿¡æ¥å£ |
| | | * |
| | | * @param url 微信URL |
| | | * @param phone ææºå· 13500000001 |
| | | * @param idCard èº«ä»½è¯ |
| | | * @return åéç»æ |
| | | */ |
| | | public static String sendChat(String url, String phone, String idCard) { |
| | | String urlTemp = "http://192.200.54.14:5003/sfjk/SendMessage?sfzh=" |
| | | + idCard |
| | | + "&title=æ¨å¥½ï¼é请æ¨å¡«ååºé¢è°æ¥è¡¨ï¼è¯·ç¹å»å¡«åã&content=å¾
é访&phone=" + phone |
| | | + "&url=" + url + "&key=ff76f8904f5f32b5ee1739e8ea46e60g"; |
| | | String sendMsg = ""; |
| | | try { |
| | | log.info("ãsendChatãå¸ä¸å¾®ä¿¡å
¬ä¼å·è¯·æ±åæ°ï¼{}", urlTemp); |
| | | sendMsg = HttpUtils.sendPost(urlTemp); |
| | | log.info("ãsendChatãå¸ä¸å¾®ä¿¡å
¬ä¼å·è¿åå¼ï¼{}", sendMsg); |
| | | } catch (Exception ex) { |
| | | sendMsg = ex.getMessage(); |
| | | log.error(ex.getMessage()); |
| | | } |
| | | return sendMsg; |
| | | } |
| | | } |