記錄移動雲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