diff --git a/notify-sms/pom.xml b/notify-sms/pom.xml index 24fc9cb..04d01f4 100644 --- a/notify-sms/pom.xml +++ b/notify-sms/pom.xml @@ -35,5 +35,10 @@ 4.5.2 + + org.apache.httpcomponents + httpclient + + \ No newline at end of file diff --git a/notify-sms/src/main/java/com/cicdi/notify/sms/SmsProvider.java b/notify-sms/src/main/java/com/cicdi/notify/sms/SmsProvider.java index e4a7e50..911b7a8 100644 --- a/notify-sms/src/main/java/com/cicdi/notify/sms/SmsProvider.java +++ b/notify-sms/src/main/java/com/cicdi/notify/sms/SmsProvider.java @@ -7,8 +7,8 @@ import com.cicdi.notify.Provider; */ public enum SmsProvider implements Provider { - aliyunSms("阿里云短信服务"), - telecom("电信139短信服务"); + aliyun("阿里云短信服务"), + js139("云信通短信通知服务"); private final String name; diff --git a/notify-sms/src/main/java/com/cicdi/notify/sms/aliyun/AliyunSmsNotifier.java b/notify-sms/src/main/java/com/cicdi/notify/sms/aliyun/AliyunSmsNotifier.java index 2b4f241..5d99cc6 100644 --- a/notify-sms/src/main/java/com/cicdi/notify/sms/aliyun/AliyunSmsNotifier.java +++ b/notify-sms/src/main/java/com/cicdi/notify/sms/aliyun/AliyunSmsNotifier.java @@ -61,7 +61,7 @@ public class AliyunSmsNotifier extends AbstractNotifier { @Override public Provider getProvider() { - return SmsProvider.aliyunSms; + return SmsProvider.aliyun; } @Override @@ -84,9 +84,7 @@ public class AliyunSmsNotifier extends AbstractNotifier { JSONObject json = JSON.parseObject(response.getData()); if (!"ok".equalsIgnoreCase(json.getString("Code"))) { - // TODO 自定义异常 -// return new BusinessException(json.getString("Message"), json.getString("Code")); - throw new Exception("json.getString(\"Message\"), json.getString(\"Code\")"); + throw new RuntimeException("json.getString(\"Message\"), json.getString(\"Code\")"); } } catch (Exception e) { e.printStackTrace(); diff --git a/notify-sms/src/main/java/com/cicdi/notify/sms/aliyun/AliyunSmsNotifierProvider.java b/notify-sms/src/main/java/com/cicdi/notify/sms/aliyun/AliyunSmsNotifierProvider.java index 1371f5b..73b0791 100644 --- a/notify-sms/src/main/java/com/cicdi/notify/sms/aliyun/AliyunSmsNotifierProvider.java +++ b/notify-sms/src/main/java/com/cicdi/notify/sms/aliyun/AliyunSmsNotifierProvider.java @@ -3,6 +3,7 @@ package com.cicdi.notify.sms.aliyun; import com.alibaba.fastjson.JSON; import com.cicdi.notify.*; import com.cicdi.notify.sms.SmsProvider; +import com.cicdi.notify.template.Template; import com.cicdi.notify.template.TemplateManager; import com.cicdi.notify.template.TemplateProperties; import com.cicdi.notify.template.TemplateProvider; @@ -20,7 +21,7 @@ public class AliyunSmsNotifierProvider implements NotifierProvider, TemplateProv @Override public Provider getProvider() { - return SmsProvider.aliyunSms; + return SmsProvider.aliyun; } // public static final DefaultConfigMetadata templateConfig = new DefaultConfigMetadata("阿里云短信模版", @@ -46,9 +47,7 @@ public class AliyunSmsNotifierProvider implements NotifierProvider, TemplateProv // } @Override - public AliyunSmsTemplate createTemplate(TemplateProperties properties) { - // TODO 验证工具 - //return ValidatorUtils.tryValidate(JSON.parseObject(properties.getTemplate(), AliyunSmsTemplate.class)); + public Template createTemplate(TemplateProperties properties) { return JSON.parseObject(properties.getTemplate(), AliyunSmsTemplate.class); } diff --git a/notify-sms/src/main/java/com/cicdi/notify/sms/telecom/TelecomSmsNotifier.java b/notify-sms/src/main/java/com/cicdi/notify/sms/telecom/TelecomSmsNotifier.java index be5233b..d5aae85 100644 --- a/notify-sms/src/main/java/com/cicdi/notify/sms/telecom/TelecomSmsNotifier.java +++ b/notify-sms/src/main/java/com/cicdi/notify/sms/telecom/TelecomSmsNotifier.java @@ -1,40 +1,46 @@ package com.cicdi.notify.sms.telecom; +import com.alibaba.fastjson.JSONObject; import com.cicdi.notify.*; import com.cicdi.notify.sms.SmsProvider; import com.cicdi.notify.template.TemplateManager; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.utils.URIBuilder; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.util.EntityUtils; -import java.io.BufferedReader; -import java.io.DataOutputStream; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.net.URL; +import java.io.IOException; +import java.net.URI; +import java.util.HashMap; import java.util.Map; -import java.util.Objects; /** + * 云信通短信通知平台通知器 + * * @author xueye */ public class TelecomSmsNotifier extends AbstractNotifier { - private String serviceUrl; - private String userId; - private String password; + private final String notifyApi = "http://www.js139.com.cn:8022/hysms/SendMsg"; - private String notifierId; + private final TelecomSmsNotifierConfiguration configuration; + + private final String notifierId; + + private final CloseableHttpClient httpClient; public TelecomSmsNotifier(NotifierProperties properties, TemplateManager templateManager) { super(templateManager); - Map configuration = properties.getConfiguration(); - this.serviceUrl = (String) Objects.requireNonNull(configuration.get("serviceUrl"), "serviceUrl不能为空"); - this.userId = (String) Objects.requireNonNull(configuration.get("userId"), "userId不能为空"); - this.password = (String) Objects.requireNonNull(configuration.get("password"), "password不能为空"); + this.httpClient = HttpClientBuilder.create().build(); this.notifierId = properties.getId(); + this.configuration = new JSONObject(properties.getConfiguration()).toJavaObject(TelecomSmsNotifierConfiguration.class); } @Override public String getNotifierId() { - return null; + return notifierId; } @Override @@ -44,60 +50,57 @@ public class TelecomSmsNotifier extends AbstractNotifier { @Override public Provider getProvider() { - return SmsProvider.telecom; + return SmsProvider.js139; } @Override public void send(TelecomSmsTemplate template, Map context) { try { - URL obj = new URL(serviceUrl); - HttpURLConnection con = (HttpURLConnection) obj.openConnection(); - - //添加请求头 - con.setRequestMethod("POST"); -// con.setRequestProperty("User-Agent", USER_AGENT); - con.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); - - String urlParameters = "userId=" + - userId + - "&password=" + - password + - "&content=" + - template.getText() + - "&mobile=" + - template.getMobile(); - - //发送Post请求 - con.setDoOutput(true); - DataOutputStream wr = new DataOutputStream(con.getOutputStream()); - wr.writeBytes(urlParameters); - wr.flush(); - wr.close(); - - int responseCode = con.getResponseCode(); - System.out.println("\nSending 'POST' request to URL : " + serviceUrl); - System.out.println("Post parameters : " + urlParameters); - System.out.println("Response Code : " + responseCode); - - BufferedReader in = new BufferedReader( - new InputStreamReader(con.getInputStream())); - String inputLine; - StringBuffer response = new StringBuffer(); - - while ((inputLine = in.readLine()) != null) { - response.append(inputLine); + URI sendMsgURI = new URIBuilder(notifyApi).addParameter("userId", configuration.getUserId()) + .addParameter("password", configuration.getPassword()) + .addParameter("content", template.getContent()) + .addParameter("mobile", template.getMobile()) + .build(); + HttpPost httpPost = new HttpPost(sendMsgURI); + CloseableHttpResponse response = httpClient.execute(httpPost); + String responseString = EntityUtils.toString(response.getEntity()); + Map resultMap = handleResponse(responseString); + String resultCodeKey = "rspCode"; + if (resultMap.containsKey(resultCodeKey)) { + if (!"0".equals(resultMap.get(resultCodeKey)) && !"DELIVRD".equalsIgnoreCase(resultMap.get(resultCodeKey))) { + throw new RuntimeException("短信发送失败:" + resultMap.get("rspDesc")); + } } - in.close(); - - //打印结果 - System.out.println(response.toString()); } catch (Exception e) { - + e.printStackTrace(); } } @Override public void close() { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + /** + * 处理HTTP请求响应信息 + *

将URL参数转换成键值对

+ * + * @param response 响应字符串 + * @return 处理过的响应信息 + */ + private Map handleResponse(String response) { + Map map = new HashMap<>(); + String[] param = response.split("&"); + for (String key : param) { + String[] pair = key.split("="); + if (pair.length == 2) { + map.put(pair[0], pair[1]); + } + } + return map; } } diff --git a/notify-sms/src/main/java/com/cicdi/notify/sms/telecom/TelecomSmsNotifierConfiguration.java b/notify-sms/src/main/java/com/cicdi/notify/sms/telecom/TelecomSmsNotifierConfiguration.java new file mode 100644 index 0000000..0367e82 --- /dev/null +++ b/notify-sms/src/main/java/com/cicdi/notify/sms/telecom/TelecomSmsNotifierConfiguration.java @@ -0,0 +1,35 @@ +package com.cicdi.notify.sms.telecom; + +/** + * 云信通短信通知平台配置信息 + * + * @author xueye + */ +public class TelecomSmsNotifierConfiguration { + + /** + * 用户账户 + */ + private String userId; + + /** + * 用户密码32位MD5加密值 + */ + private String password; + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/notify-sms/src/main/java/com/cicdi/notify/sms/telecom/TelecomSmsNotifierProvider.java b/notify-sms/src/main/java/com/cicdi/notify/sms/telecom/TelecomSmsNotifierProvider.java index e18ce96..bbb2b15 100644 --- a/notify-sms/src/main/java/com/cicdi/notify/sms/telecom/TelecomSmsNotifierProvider.java +++ b/notify-sms/src/main/java/com/cicdi/notify/sms/telecom/TelecomSmsNotifierProvider.java @@ -3,7 +3,6 @@ package com.cicdi.notify.sms.telecom; import com.alibaba.fastjson.JSON; import com.cicdi.notify.*; import com.cicdi.notify.sms.SmsProvider; -import com.cicdi.notify.sms.aliyun.AliyunSmsNotifier; import com.cicdi.notify.template.Template; import com.cicdi.notify.template.TemplateManager; import com.cicdi.notify.template.TemplateProperties; @@ -27,7 +26,7 @@ public class TelecomSmsNotifierProvider implements NotifierProvider, TemplatePro @Override public Provider getProvider() { - return SmsProvider.telecom; + return SmsProvider.js139; } @Override diff --git a/notify-sms/src/main/java/com/cicdi/notify/sms/telecom/TelecomSmsTemplate.java b/notify-sms/src/main/java/com/cicdi/notify/sms/telecom/TelecomSmsTemplate.java index eb81dc8..edafc0c 100644 --- a/notify-sms/src/main/java/com/cicdi/notify/sms/telecom/TelecomSmsTemplate.java +++ b/notify-sms/src/main/java/com/cicdi/notify/sms/telecom/TelecomSmsTemplate.java @@ -9,19 +9,20 @@ public class TelecomSmsTemplate implements Template { /** * 短信文本 */ - private String text; + private String content; /** * 手机号码 + *

多个手机号使用半角逗号分隔

*/ private String mobile; - public String getText() { - return text; + public String getContent() { + return content; } - public void setText(String text) { - this.text = text; + public void setContent(String content) { + this.content = content; } public String getMobile() { diff --git a/notify-sms/src/test/java/com/cicdi/notify/sms/AliyunSmsTest.java b/notify-sms/src/test/java/com/cicdi/notify/sms/AliyunSmsTest.java index e547907..ad1e05b 100644 --- a/notify-sms/src/test/java/com/cicdi/notify/sms/AliyunSmsTest.java +++ b/notify-sms/src/test/java/com/cicdi/notify/sms/AliyunSmsTest.java @@ -24,7 +24,7 @@ public class AliyunSmsTest { public NotifierProperties getNotifyConfig(NotifyType notifyType, String configId) { NotifierProperties notifierProperties = new NotifierProperties(); notifierProperties.setType(DefaultNotifyType.sms.getId()); - notifierProperties.setProvider(SmsProvider.aliyunSms.getId()); + notifierProperties.setProvider(SmsProvider.aliyun.getId()); notifierProperties.setId("12"); Map config = new HashMap<>(); @@ -44,7 +44,7 @@ public class AliyunSmsTest { protected TemplateProperties getProperties(NotifyType type, String id) { TemplateProperties templateProperties = new TemplateProperties(); templateProperties.setType(DefaultNotifyType.sms.getId()); - templateProperties.setProvider(SmsProvider.aliyunSms.getId()); + templateProperties.setProvider(SmsProvider.aliyun.getId()); templateProperties.setTemplate("{\"signName\":\"Hello\",\"phoneNumber\":[\"xueye404@qq.com\"],\"code\":\"1322\"}"); diff --git a/notify-sms/src/test/java/com/cicdi/notify/sms/TelecomSmsTest.java b/notify-sms/src/test/java/com/cicdi/notify/sms/TelecomSmsTest.java index dc78cfe..e51fcd6 100644 --- a/notify-sms/src/test/java/com/cicdi/notify/sms/TelecomSmsTest.java +++ b/notify-sms/src/test/java/com/cicdi/notify/sms/TelecomSmsTest.java @@ -23,11 +23,10 @@ public class TelecomSmsTest { NotifyConfigManager notifyConfigManager = (notifyType, configId) -> { NotifierProperties notifierProperties = new NotifierProperties(); notifierProperties.setType(DefaultNotifyType.sms.getId()); - notifierProperties.setProvider(SmsProvider.telecom.getId()); + notifierProperties.setProvider(SmsProvider.js139.getId()); notifierProperties.setId("12"); Map config = new HashMap<>(); - config.put("serviceUrl", "http://www.js139.com.cn:8022/hysms/SendMsg"); config.put("userId", "HYjlzx"); config.put("password", "5CA45EA4944D2C32567E8DBBDDBD65DD"); @@ -42,11 +41,11 @@ public class TelecomSmsTest { protected TemplateProperties getProperties(NotifyType type, String id) { TemplateProperties templateProperties = new TemplateProperties(); templateProperties.setType(DefaultNotifyType.sms.getId()); - templateProperties.setProvider(SmsProvider.telecom.getId()); + templateProperties.setProvider(SmsProvider.js139.getId()); TelecomSmsTemplate template = new TelecomSmsTemplate(); - template.setText("Hello World!"); - template.setMobile("18605120786"); + template.setContent("Hello World!"); + template.setMobile("13047689449,18605120786"); templateProperties.setTemplate(JSON.toJSONString(template));