<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在專案開發中,簡訊傳送功能在很多地方都用得到,例如:通知簡訊、驗證碼、行銷簡訊、推廣簡訊等等,近期阿里雲等雲服務商的簡訊服務針對個人使用者不友好(需求企業資質),現在給大家介紹一款的產品:樂訊通,針對個人使用者較為友好,可以很便捷的進行開發測試。
樂訊通官網:http://yun.loktong.com/
使用手機號註冊即可。
注意:註冊成功後,預設密碼就是手機號。
可在 “系統管理”->"密碼管理"中進行密碼的修改 。
平時比較常見的驗證碼簡訊格式為:【碼賽客1024】:註冊驗證碼為312562,請勿洩露給他人。
前面括號中的就是簡訊簽名,後邊部分就是簡訊模板,因此可以分析出格式為:【簡訊簽名】:簡訊模板。
API檔案 -> 開發引導 -> 程式碼範例 -> Java ,程式碼如下
package com.ljs; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.Console; import java.io.File; import java.io.FileInputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.lang.reflect.MalformedParameterizedTypeException; import java.net.URL; import java.net.URLConnection; import java.security.MessageDigest; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.ListIterator; import java.util.Map; import java.util.Set; import java.util.TreeMap; import javax.lang.model.element.VariableElement; import javax.management.monitor.MonitorSettingException; import javax.print.attribute.standard.DateTimeAtCompleted; import org.junit.Test; public class MyTest { public static void main(String[] args) throws ParseException { //時間戳 long timestamp = System.currentTimeMillis(); System.out.println(timestamp); //url String url = "http://www.lokapi.cn/smsUTF8.aspx"; //簽名,在傳送時使用md5加密 String beforSign = "action=sendtemplate&username=18586975869&password="+getMD5String("18586975869")+"&token=389c1a49×tamp="+timestamp; //引數串 String postData = "action=sendtemplate&username=18586975869&password="+getMD5String("18586975869")+"&token=389c1a49&templateid=CF2D56FC¶m=18586975869|666666&rece=json×tamp="+timestamp+"&sign="+getMD5String(beforSign); //呼叫其提供的傳送簡訊方法 String result = sendPost(url,postData); System.out.println(result); } //傳送簡訊的方法 public static String sendPost(String url, String param) { PrintWriter out = null; BufferedReader in = null; String result = ""; try { URL realUrl = new URL(url); // 開啟和URL之間的連線 URLConnection conn = realUrl.openConnection(); // 設定通用的請求屬性 conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); // 傳送POST請求必須設定如下兩行 conn.setDoOutput(true); conn.setDoInput(true); // 獲取URLConnection物件對應的輸出流 out = new PrintWriter(conn.getOutputStream()); // 傳送請求引數 out.print(param); // flush輸出流的緩衝 out.flush(); // 定義BufferedReader輸入流來讀取URL的響應 in = new BufferedReader( new InputStreamReader(conn.getInputStream())); String line; while ((line = in.readLine()) != null) { result += line; } } catch (Exception e) { System.out.println("傳送 POST 請求出現異常!"+e); e.printStackTrace(); }finally{ //使用finally塊來關閉輸出流、輸入流 try{ if(out!=null){ out.close(); } if(in!=null){ in.close(); } } catch(IOException ex){ ex.printStackTrace(); } } return result; } //用來計算MD5的函數 public static String getMD5String(String rawString){ String[] hexArray = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"}; try{ MessageDigest md = MessageDigest.getInstance("MD5"); md.update(rawString.getBytes()); byte[] rawBit = md.digest(); String outputMD5 = " "; for(int i = 0; i<16; i++){ outputMD5 = outputMD5+hexArray[rawBit[i]>>>4& 0x0f]; outputMD5 = outputMD5+hexArray[rawBit[i]& 0x0f]; } return outputMD5.trim(); }catch(Exception e){ System.out.println("計算MD5值發生錯誤"); e.printStackTrace(); } return null; } /** * 生成祕鑰 * * @param tm * @param key * @return */ public static String createSign(TreeMap<String, String> tm, String key) { StringBuffer buf = new StringBuffer(key); for (Map.Entry<String, String> en : tm.entrySet()) { String name = en.getKey(); String value = en.getValue(); if (!"sign".equals(name) && !"param".equals(name) && value != null && value.length() > 0 && !"null".equals(value)) { buf.append(name).append('=').append(value).append('&'); } } String _buf = buf.toString(); return _buf.substring(0, _buf.length() - 1); } /** * 將檔案轉成base64 字串 * @param path檔案路徑 * @return * * @throws Exception */ public static String encodeBase64File(String path) throws Exception { File file = new File(path);; FileInputStream inputFile = new FileInputStream(file); byte[] buffer = new byte[(int) file.length()]; inputFile.read(buffer); inputFile.close(); //return new BASE64Encoder().encode(buffer); return ""; } }
1.請求地址,UTF8編碼請求地址:http://www.lokapi.cn/smsUTF8.aspx
2.請求協定:http
3.請求方式:採用post方式
提交請求
4.請求報文:action=sendtemplate&username=zhangsan&password=E10ADC3949BA59ABBE56E057F20F883E&token=894gbhy&templateid=638fgths¶m=手機號1|引數1|引數2@手機號2|引數1|引數2&rece=json×tamp=636949832321055780&sign=96E79218965EB72C92A54
5.引數說明
引數名稱 | 是否必須 | 描述 | 範例 |
action | 是 | 操作型別 | (固定值)action=sendtemplate |
username | 是 | 賬戶名 | username=zhangsan |
password | 是 | 賬戶密碼,密碼必須MD5加密並且取32位元大寫 | password=E10ADC3949BA59ABBE56E057F20F883E |
token | 是 | 產品總覽頁面對應產品的Token | token=894gbhy |
templateid | 是 | 模板管理報備的模板ID | templateid=638fgths |
param | 是 | 傳送引數,可傳送一個或多個手機號,建議單次提交最多5000個號碼 | 17712345678|張三|2541@13825254141|李四|2536 |
dstime | 否 | 設定要傳送簡訊的時間,精確到秒(yyyy-MM-dd HH:mm:ss) | 2017-01-05 16:23:23 |
rece | 否 | 返回型別json、xml,預設(json) | rece=json |
timestamp | 是 | 時間戳,13位時間戳,單位(毫秒) | timestamp=636949832321055780 |
sign | 是 | 簽名校驗 | sign=96E79218965EB72C92A54 |
param引數詳細說明
傳送一個手機號模板為【手機號1|引數1|引數2】
傳送多個手機號模板為【手機號1|引數1|引數2@手機號2|引數3|引數4@…】
第一列必須為手機號,引數1,引數2對應簡訊模板裡的引數順序,英文豎線隔開, 比如簡訊模板為【簽名】您好,{s6},您的驗證碼是:{s6},引數1就對應您好後邊的{s6},引數2對應驗證碼是後邊的{s6}, 多個手機號以@隔開。
若模板內沒有引數則只輸入手機號即可。
sign引數詳細說明
簽名由引數action,username,password,token,timestamp進行MD5加密組成
比如這些值拼接後為action=sendtemplate&username=zhangsan&password=E10ADC3949BA59ABBE56E057F20F883E&token=588aaaaa×tamp=636949832321055780,那麼就MD5加密這個引數字串得到結果後作為sign的值sign=96E79218965EB72C92A54
基於官方java程式碼和引數說明,替換自己的值,即可實現傳送。
6.返回結果
//成功返回 { "returnstatus":"success", "code":"0", "taskID":[ { "tel_17712345678":"15913494519502337" } ] } //失敗返回 { "returnstatus":"error", "code":"-51", "remark":"存取超時!" }
<dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.75</version> </dependency>
public class SendSMSUtil { /** * 封裝的發驗證碼的方法 * @param account 平臺賬戶 * @param password 平臺密碼 * @param token 平臺token * @param templateid 簡訊模板id * @param phone 簡訊接收方手機號 * @param code 驗證碼 * @return */ public static MsgResult sendMsgPost(String account,String password,String token,String templateid,String phone,String code){ //時間戳 long timestamp = System.currentTimeMillis(); //System.out.println(timestamp); //url String url = "http://www.lokapi.cn/smsUTF8.aspx"; //簽名 String beforSign = "action=sendtemplate&username="+account+"&password="+getMD5String(password)+"&token="+token+"×tamp="+timestamp; //引數串 String postData = "action=sendtemplate&username="+account+"&password="+getMD5String(password)+"&token="+token+"&templateid="+templateid+"¶m="+phone+"|"+code+"&rece=json×tamp="+timestamp+"&sign="+getMD5String(beforSign); //傳送請求 String result = sendPost(url,postData); //將json結果轉為物件,方便判斷 MsgResult msgResult = JSON.parseObject(result, MsgResult.class); return msgResult; } //原本的傳送方法 public static String sendPost(String url, String param) { PrintWriter out = null; BufferedReader in = null; String result = ""; try { URL realUrl = new URL(url); // 開啟和URL之間的連線 URLConnection conn = realUrl.openConnection(); // 設定通用的請求屬性 conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); // 傳送POST請求必須設定如下兩行 conn.setDoOutput(true); conn.setDoInput(true); // 獲取URLConnection物件對應的輸出流 out = new PrintWriter(conn.getOutputStream()); // 傳送請求引數 out.print(param); // flush輸出流的緩衝 out.flush(); // 定義BufferedReader輸入流來讀取URL的響應 in = new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; while ((line = in.readLine()) != null) { result += line; } } catch (Exception e) { System.out.println("傳送 POST 請求出現異常!"+e); e.printStackTrace(); } finally{ //使用finally塊來關閉輸出流、輸入流 try{ if(out!=null){ out.close(); } if(in!=null){ in.close(); } } catch(IOException ex){ ex.printStackTrace(); } } return result; } //用來計算MD5的函數 public static String getMD5String(String rawString){ String[] hexArray = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"}; try{ MessageDigest md = MessageDigest.getInstance("MD5"); md.update(rawString.getBytes()); byte[] rawBit = md.digest(); String outputMD5 = " "; for(int i = 0; i<16; i++){ outputMD5 = outputMD5+hexArray[rawBit[i]>>>4& 0x0f]; outputMD5 = outputMD5+hexArray[rawBit[i]& 0x0f]; } return outputMD5.trim(); }catch(Exception e){ System.out.println("計算MD5值發生錯誤"); e.printStackTrace(); } return null; } }
用於接收返回值的物件
public class MsgResult{ //返回描述 private String returnstatus; //返回狀態碼 private Integer code; //錯誤訊息 private String remark; public String getReturnstatus() { return returnstatus; } public void setReturnstatus(String returnstatus) { this.returnstatus = returnstatus; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getRemark() { return remark; } public void setRemark(String remark) { this.remark = remark; } @Override public String toString() { return "MsgResult{" + "returnstatus='" + returnstatus + ''' + ", code=" + code + ", remark='" + remark + ''' + '}'; } }
public class SendSMSTest { public static void main(String[] args) throws ParseException { //使用工具類傳送簡訊,返回封裝的物件 MsgResult msgResult = SendSMSUtil.sendMsgPost("平臺賬號","平臺密碼","token","簡訊模板id","接受方手機號","驗證碼"); //進行判斷 if("success".equals(msgResult.getReturnstatus()) && msgResult.getCode()==0){ System.out.println("傳送成功"); }else{ System.out.println("傳送失敗,原因是:"+msgResult.getRemark()); } } }
到此這篇關於使用Java第三方實現傳送簡訊功能的文章就介紹到這了,更多相關Java實現傳簡訊內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45