直接上代碼,清晰明了(所有發送短信代碼是寫在一個工具類),也參考了網上一些博主的文章,非常感謝,以下內容只是記錄平時做東西的內容,如有不正確的地方,歡迎指正。
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 }