记录移动云MAS短信平台发送模板短信+获取回执状态


直接上代码,清晰明了(所有发送短信代码是写在一个工具类),也参考了网上一些博主的文章,非常感谢,以下内容只是记录平时做东西的内容,如有不正确的地方,欢迎指正。

PS:(写在前面)需要注意的几个点:

(1)需要先在mas平台上配置相关信息和接口(主页-管理-接口管理),https请求需要将短信平台上的短信接口创建为http协议模式,否则请求失败;http请求同理,只要短信接口的用户名、密码和协议对应正确,一般没有太大问题;

(2)如果是发送模板短信需要先申请短信模板,且传入参数必须和模板中变量所包含的类型一致,否则mas平台上数据校验无法通过(有条件还是获取一下回执报告,因为有时候即使响应状态返回success,最后没有收到短信,进入平台查看可以看到其实回执状态报错,并没有发送成功);

(3)如果短信模板中的变量长度不能满足需要,可以联系客户经理申请特殊变量,特殊变量一个模板中可以使用两次;

  (4)https短信接口文档中写得很清楚:【请客户侧忽略证书校验,移动侧不提供证书秘钥】,所以在做post请求的时候一定要记得【忽略证书校验】,否则请求失败,返回值为空;http请求不用管。

(5)短信响应状态成功返回的是:{"msgGroup":"0906163415000000332084","rspcod":"success","success":true},有错误的时候是:{ "msgGroup": "",    "rspcod": "InvalidUsrOrPwd",    "success": false}

(6)短信发送成功回执状态返回的是“[]”,有错误的时候是:[{"errorCode":"CM:2007","mobile":"13888888888","msgGroup":"0906144506000001364223","receiveDate":"20210906244506","reportStatus":"CM:2007","submitDate":"20210906144506"}]

(7)上面说的其实平台上和提供的文档中基本都有说明,多看提供的接口文档,对实现自己想要的功能有帮助!!!

 

 

1.SMSUtil.java

a.通过https请求发送模板短信(网上很多的都是用http方式请求,只不过获取回执状态需要自己搭建http服务,太菜了感觉比较麻烦就采用了https请求,可以自己主动获取回执报告,这个因人而异)

  1     /**
  2      * 云MAS-发送模板短信(https)
  3      *
  4      * @param mobiles 手机号
  5      * @param templateId 模板id
  6      * @param param 参数列表
  7      * @return
  8      * @throws UnsupportedEncodingException
  9      */
 10     public static  AjaxResult sendTemplateSms(String mobiles, String templateId, List<String> param) throws UnsupportedEncodingException {
 11         apId="xxx";//用户名
 12         secretKey="xxx";//密码
 13         ecName = "xxx";    //集团名称
 14         sign = "xxx";    //网关签名编码
 15         addSerial = "";    //拓展码 填空
 16         templateurl = "https://112.35.10.201:28888/sms/tmpsubmit";//和http请求地址不一样  http://112.35.1.155:1992/sms/tmpsubmit
 17  
 18         //发送短信--start--
 19         String params = null;
 20         if(param != null){
 21             params = JSON.toJSONString(param.toArray());
 22         }else{
 23             params = "[]";
 24         }
 25         SendRequest submitReq = new SendRequest();
 26         submitReq.setApId(apId);
 27         submitReq.setEcName(ecName);
 28         submitReq.setSecretKey(secretKey);
 29         submitReq.setParams(params);
 30         submitReq.setMobiles(mobiles);
 31         submitReq.setSign(sign);
 32         submitReq.setAddSerial(addSerial);
 33         submitReq.setTemplateId(templateId);
 34 
 35         StringBuffer stringBuffer = new StringBuffer();
 36         stringBuffer.append(submitReq.getEcName());
 37         stringBuffer.append(submitReq.getApId());
 38         stringBuffer.append(submitReq.getSecretKey());
 39         stringBuffer.append(submitReq.getTemplateId());
 40         stringBuffer.append(submitReq.getMobiles());
 41         stringBuffer.append(submitReq.getParams());
 42         stringBuffer.append(submitReq.getSign());
 43         stringBuffer.append(submitReq.getAddSerial());
 44         String encode = "";
 45         try {
 46             //接口要求参数为MD5加密后的值
 47             submitReq.setMac(Md5Utils.hash(stringBuffer.toString()));
 48             String reqText = JSON.toJSONString(submitReq);
 49             //base64编码
 50             encode =new String(Base64.encodeBase64Chunked(reqText.getBytes("UTF-8")));  //有中文时使用UTF-8
 51         } catch (UnsupportedEncodingException e1) {
 52             e1.printStackTrace();
 53         }
 54         String resStr = "";
 55         try {
 56             resStr = new String(HttpUtils.sendPostTrust(templateurl,encode,"utf-8","POST"));//https链接
 57         } catch (Exception e) {
 58             e.printStackTrace();
 59         }
 60         //发送短信--end--
 61 
 62         //响应状态、回执状态处理--start--
 63         SendResponse sendRes = JSON.parseObject(resStr,SendResponse.class);//响应状态
 64         String receiptReport=getReport(apId,secretKey,ecName);//回执状态
 66         String errorCode="";
 67         if(receiptReport!="[]"){
 68             JSONArray jsonArray= JSONArray.parseArray(receiptReport);
 69             if(receiptReport.contains("errorCode")){
 70                 for(int index=0;index<jsonArray.size();index++){
 71                     JSONObject jsonObject = jsonArray.getJSONObject(index);
 72                     if(jsonObject.getString("mobile").equals(mobiles)) {
 73                         errorCode=jsonObject.get("errorCode").toString();
 74                     }
 75                 }
 76             }
 77         }
 78         else{
 79            errorCode="";
 80         }
 81         if(sendRes.getSuccess() && !"".equals(sendRes.getMsgGroup()) && "success".equals(sendRes.getRspcod())){
 82             switch (sendRes.getRspcod()) {
 83                 case "success":
 84                     if (errorCode != null && errorCode != "") {
 85                         return AjaxResult.error(11, "其他错误:" + errorCode+",请联系管理员!");
 86                     } else {
 87                         return AjaxResult.error(0, "发送成功");
 88                     }
 89                 case "IllegalMac ":
 90                     return AjaxResult.error(1, "mac校验不通过");
 91                 case "IllegalSignId ":
 92                     return AjaxResult.error(2, "无效的签名编码");
 93                 case "InvalidMessage ":
 94                     return AjaxResult.error(3, "非法消息,请求数据解析失败");
 95                 case "InvalidUsrOrPwd ":
 96                     return AjaxResult.error(4, "非法用户名/密码");
 97                 case "NoSignId ":
 98                     return AjaxResult.error(5, "未匹配到对应的签名信息");
 99                 case "TooManyMobiles ":
100                     return AjaxResult.error(6, "手机号数量超限,应≤5000");
101                 default:
102                     return AjaxResult.error(-1, "系统异常");
103             }
104         }
105         else{
106             return AjaxResult.error(-2,"请求异常");
107         }
108         //响应状态、回执状态处理--end--
109     }
110 
111     //获取状态报告
112     public static String getReport(String apId,String secretKey,String ecName){
113         String reporturl = "https://112.35.10.201:28888/sms/report";
114 
115         SendRequest submitReq = new SendRequest();
116         submitReq.setApId(apId);
117         submitReq.setEcName(ecName);
118         submitReq.setSecretKey(secretKey);
119 
120         StringBuffer stringBuffer = new StringBuffer();
121         stringBuffer.append(submitReq.getEcName());
122         stringBuffer.append(submitReq.getApId());
123         stringBuffer.append(submitReq.getSecretKey());
124         stringBuffer.append(submitReq.getTemplateId());
125         String encode = "";
126         try {
127             //接口要求参数为MD5加密后的值
128             submitReq.setMac(Md5Utils.hash(stringBuffer.toString()));
129             String reqText = JSON.toJSONString(submitReq);
130             //base64编码
131             encode =new String(Base64.encodeBase64Chunked(reqText.getBytes("UTF-8")));  //有中文时使用UTF-8
132         } catch (UnsupportedEncodingException e1) {
133             e1.printStackTrace();
134         }
135         String receiptReport = "";
136         try {
137             receiptReport = new String(HttpUtils.sendPostTrust(reporturl,encode,"utf-8","POST"));//https链接
138 
139         } catch (Exception e) {
140             e.printStackTrace();
141         }
142         return receiptReport;
143     }

 

2.HttpUtils.java---->sendPostTrust

  1    //添加信任主机
  2     private static void trustAllHosts() {
  3         // 创建不验证证书链的信任管理器 这里使用的是x509证书
  4         TrustManager[] trustAllCerts = new TrustManager[]{new TrustAnyTrustManager() {
  5             public java.security.cert.X509Certificate[] getAcceptedIssuers() {
  6                 return new java.security.cert.X509Certificate[]{};
  7             }
  8 
  9             public void checkClientTrusted(X509Certificate[] chain, String authType) {
 10             }
 11 
 12             public void checkServerTrusted(X509Certificate[] chain, String authType) {
 13             }
 14         }};
 15         // 安装所有信任的信任管理器
 16         try {
 17             SSLContext sc = SSLContext.getInstance("TLS");
 18             sc.init(null, trustAllCerts, new java.security.SecureRandom());
 19             //HttpsURLConnection通过SSLSocket来建立与HTTPS的安全连接,SSLSocket对象是由SSLSocketFactory生成的。
 20             HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
 21         } catch (Exception e) {
 22             e.printStackTrace();
 23         }
 24     }
 25 
 26     /**
 27      *  发送post 数据并忽略证书校验
 28      * @param urls
 29      * @return
 30      */
 31     public static String sendPostTrust(String urls, String param, String contentType, String method) {
 32         StringBuffer sb=new StringBuffer();
 33         DataOutputStream out = null;
 34         BufferedReader responseReader = null;
 35         InputStream in1 = null;
 36         try {
 37             trustAllHosts();
 38             // 创建url资源
 39             URL url = new URL(urls);
 40             // 建立http连接
 41             HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
 42             conn.setHostnameVerifier(DO_NOT_VERIFY);
 43             // 设置不用缓存
 44             conn.setUseCaches(false);
 45             // 设置允许输出
 46             conn.setDoOutput(true);
 47             // 设置允许输入
 48             conn.setDoInput(true);
 49             // 设置传递方式
 50             conn.setRequestMethod(method);
 51             //System.out.println(conn.getRequestMethod());
 52             // 设置维持长连接
 53             conn.setRequestProperty("Connection", "Keep-Alive");
 54             // 设置文件字符集:
 55             conn.setRequestProperty("Charset", "UTF-8");
 56             // 转换为字节数组
 57 //            byte[] data = (param).getBytes();
 58 //            // 设置文件长度
 59 //            conn.setRequestProperty("Content-Length", String.valueOf(data.length));
 60             // 设置文件类型:
 61             conn.setRequestProperty("Content-Type", contentType);
 62             // 开始连接请求
 63             conn.connect();
 64             out = new DataOutputStream(conn.getOutputStream());
 65             // 写入请求的字符串
 66             out.writeBytes(param);
 67             out.flush();
 68 
 69             //System.out.println(conn.getResponseCode());
 70 
 71             // 请求返回的状态
 72             if (HttpURLConnection.HTTP_OK == conn.getResponseCode()) {
 73                 System.out.println("连接成功");
 74                 // 请求返回的数据
 75                 in1 = conn.getInputStream();
 76                 String readLine;
 77                 responseReader = new BufferedReader(new InputStreamReader(in1));
 78                 while((readLine=responseReader.readLine()) != null){
 79                     sb.append(readLine).append("\n");
 80                 }
 81             } else {
 82                 System.out.println("error++");
 83             }
 84         } catch (Exception e) {
 85 
 86         } finally {
 87             try {
 88                 if (null != responseReader)
 89                     responseReader.close();
 90                 if (null != in1)
 91                     in1.close();
 92             } catch(Exception e) {}
 93             try {
 94                 out.close();
 95             } catch(Exception e) {}
 96         }
 97 
 98         return sb.toString();
 99 
100     }

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM