公司要在項目上添加短信驗證碼,實現修改密碼功能。要求是比較便宜,方便介接入,且平台不能太小(怕不夠持久,突然倒閉)。在進行了幾個公司的對比后最后選擇了阿里雲短信平台,原因是:
1、相對來說倒閉是暫時不可能的了(逗比)
2、與騰訊比10到30萬條短信稍微便宜一丟丟,(一丟丟也是錢,一分錢難倒英雄漢)
3、公司服務器使用的是阿里的,不用重新注冊,只需認證即可
4、接入相對簡單(單從導包數量就少了一半,阿里2個jar ;騰訊4個jar)
在進行操作之前閱讀了阿里整個操作文檔,阿里也提供了很多資料,並且提供了demo,使用時下載需要的demo然后進行其他操作。
下面介紹一下我的操作流程:
先登陸阿里雲----》控制台 ----》產品服務----》短信服務
進入短信使用頁面
然后按照文檔進行開通操作即可
接下來
、首先看下你需要准備哪些參數
-
/**********需要准備的參數**************/
-
public static String accessKey="";//需要修改
-
public static String accessSecret="";//需要修改
-
public static String code="SMS_41635111";//需要修改
-
public static String signName="測試99";//需要修改
創建和查看Access Key
https://ak-console.aliyun.com/#/accesskey/
3、開通短信服務成功后,需要配置短信簽名和短信模板,配置完后,需要審核,審核過后就拿了code和signName兩個參數
4、創建短信簽名
注意
審核成功
5、創建短信模板
審核成功
這里面有一個不成功,原因是我想用短信通知來發驗證碼
sms01: ${name},哈哈,現在時間是${time}
sms02: ${name},我用短信通知發送驗證碼不行啊,驗證碼為${code},時間${time},祝生活愉快。
6、短信簽名和短信模板審核通過后就可以開發了
主要代碼是
package com.kp.sms; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.exceptions.ServerException; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; import com.aliyuncs.sms.model.v20160927.SingleSendSmsRequest; import com.aliyuncs.sms.model.v20160927.SingleSendSmsResponse; /** * @author: py * @version:2017年1月13日 下午2:40:28 * com.kp.sms.TestSms.java * @Desc */ public class TestSms { public static String regionId="cn-hangzhou";//機房信息,可以不用更改 /**********需要准備的參數**************/ public static String accessKey="";//需要修改 public static String accessSecret="";//需要修改 public static String code="SMS_41635111";//需要修改 public static String signName="測試99";//需要修改 /**********************************/ public static void main(String[] args) { String phone="15589895656"; String time =getChinaDateByMM(System.currentTimeMillis()); //根據自己定義的短信模板,修改 String jsonStr="{\"name\":\"小明\",\"code\":\"12312\",\"time\":\""+time +"\"}"; test(phone, jsonStr,code,signName); } public static void test(String phone, String jsonStr, String code, String signName) { try { IClientProfile profile = DefaultProfile.getProfile(regionId, accessKey, accessSecret); DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", "Sms", "sms.aliyuncs.com"); IAcsClient client = new DefaultAcsClient(profile); SingleSendSmsRequest request = new SingleSendSmsRequest(); //管理控制台中配置的短信簽名(狀態必須是驗證通過) request.setSignName(signName); //管理控制台中配置的審核通過的短信模板的模板CODE(狀態必須是驗證通過) request.setTemplateCode(code); // 短信模板中的變量;數字需要轉換為字符串;個人用戶每個變量長度必須小於15個字符。 // 例如:短信模板為:“接受短信驗證碼${no}”,此參數傳遞{“no”:”123456”},用戶將接收到[短信簽名]接受短信驗證碼123456 request.setParamString(jsonStr); //目標手機號,多個手機號可以逗號分隔 request.setRecNum(phone); // request.setVersion(version); SingleSendSmsResponse httpResponse = client.getAcsResponse(request); String requestId = httpResponse.getRequestId(); System.err.println("requestId:"+requestId); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } } /** * 使用毫秒轉換為中文日期 * @param tmpDateInt * @return */ public static String getChinaDateByMM(long time){ String ret_date = ""; java.text.SimpleDateFormat formatter = new java.text.SimpleDateFormat("yyyy年MM月dd日"); ret_date = formatter.format(time); return ret_date; } }
參考鏈接:
https://blog.csdn.net/u014520797/article/details/54411392
我在參考阿里文檔和本連接內容后開始動手操作:
1、下載對應的java版demo,把兩個jar包從java demo中取出放到項目的lib中
2、把java demo 中的SmsDemo.java中的內容復制到項目的util文件夾里的SmsUtil.java中
SmsDemo.java路徑
SmsUtil.java所在文件目錄
這幾個文件的代碼如下:
package com.xxxx.util.index; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest; import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse; import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; import java.text.SimpleDateFormat; import java.util.Date; public class SmsUtil { //產品名稱:雲通信短信API產品,開發者無需替換 static final String product = "Dysmsapi"; //產品域名,開發者無需替換 static final String domain = "dysmsapi.aliyuncs.com"; // TODO 此處需要替換成開發者自己的AK(在阿里雲訪問控制台尋找) static final String accessKeyId = "LTAILlPgh5mWKmRm"; static final String accessKeySecret = "HU9qWuoWOzqnvrmczOP2FOfgE07poi"; public static SendSmsResponse sendSms(Note note) throws ClientException { //可自助調整超時時間 System.setProperty("sun.net.client.defaultConnectTimeout", "10000"); System.setProperty("sun.net.client.defaultReadTimeout", "10000"); //初始化acsClient,暫不支持region化 IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret); DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain); IAcsClient acsClient = new DefaultAcsClient(profile); //組裝請求對象-具體描述見控制台-文檔部分內容 SendSmsRequest request = new SendSmsRequest(); //必填:待發送手機號 request.setPhoneNumbers(note.getPhoneNumber()); //必填:短信簽名-可在短信控制台中找到 request.setSignName("中國青年網"); //必填:短信模板-可在短信控制台中找到 request.setTemplateCode("SMS_140727456"); //可選:模板中的變量替換JSON串,如模板內容為"親愛的${name},您的驗證碼為${code}"時,此處的值為 request.setTemplateParam("{\"code\":\""+note.getCode()+"\"}"); //選填-上行短信擴展碼(無特殊需求用戶請忽略此字段) //request.setSmsUpExtendCode("90997"); //可選:outId為提供給業務方擴展字段,最終在短信回執消息中將此值帶回給調用者 request.setOutId("123456789"); //hint 此處可能會拋出異常,注意catch SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request); return sendSmsResponse; } public static QuerySendDetailsResponse querySendDetails(String bizId) throws ClientException { //可自助調整超時時間 System.setProperty("sun.net.client.defaultConnectTimeout", "10000"); System.setProperty("sun.net.client.defaultReadTimeout", "10000"); //初始化acsClient,暫不支持region化 IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret); DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain); IAcsClient acsClient = new DefaultAcsClient(profile); //組裝請求對象 QuerySendDetailsRequest request = new QuerySendDetailsRequest(); //必填-號碼 request.setPhoneNumber("13164334652"); //可選-流水號 request.setBizId("111"); //必填-發送日期 支持30天內記錄查詢,格式yyyyMMdd SimpleDateFormat ft = new SimpleDateFormat("yyyyMMdd"); request.setSendDate(ft.format(new Date())); //必填-頁大小 request.setPageSize(10L); //必填-當前頁碼從1開始計數 request.setCurrentPage(1L); //hint 此處可能會拋出異常,注意catch QuerySendDetailsResponse querySendDetailsResponse = acsClient.getAcsResponse(request); return querySendDetailsResponse; } /* public static void main(String[] args) throws ClientException, InterruptedException { Note note=new Note(); note.setPhoneNumber("13164363646"); note.setTemplateCode("SMS_140715144"); note.setCode("90999"); note.setProduct("中國普法網"); note.setId("123456"); SendSmsResponse response = sendSms(note); System.out.println("短信接口返回的數據----------------"); System.out.println("Code=" + response.getCode()); System.out.println("Message=" + response.getMessage()); System.out.println("RequestId=" + response.getRequestId()); System.out.println("BizId=" + response.getBizId()); //發短信 // SendSmsResponse response = sendSms(); *//* System.out.println("短信接口返回的數據----------------"); System.out.println("Code=" + response.getCode()); System.out.println("Message=" + response.getMessage()); System.out.println("RequestId=" + response.getRequestId()); System.out.println("BizId=" + response.getBizId());*//* Thread.sleep(3000L); //查明細 if(response.getCode() != null && response.getCode().equals("OK")) { QuerySendDetailsResponse querySendDetailsResponse = querySendDetails(response.getBizId()); System.out.println("短信明細查詢接口返回數據----------------"); System.out.println("Code=" + querySendDetailsResponse.getCode()); System.out.println("Message=" + querySendDetailsResponse.getMessage()); int i = 0; for(QuerySendDetailsResponse.SmsSendDetailDTO smsSendDetailDTO : querySendDetailsResponse.getSmsSendDetailDTOs()) { System.out.println("SmsSendDetailDTO["+i+"]:"); System.out.println("Content=" + smsSendDetailDTO.getContent()); System.out.println("ErrCode=" + smsSendDetailDTO.getErrCode()); System.out.println("OutId=" + smsSendDetailDTO.getOutId()); System.out.println("PhoneNum=" + smsSendDetailDTO.getPhoneNum()); System.out.println("ReceiveDate=" + smsSendDetailDTO.getReceiveDate()); System.out.println("SendDate=" + smsSendDetailDTO.getSendDate()); System.out.println("SendStatus=" + smsSendDetailDTO.getSendStatus()); System.out.println("Template=" + smsSendDetailDTO.getTemplateCode()); } System.out.println("TotalCount=" + querySendDetailsResponse.getTotalCount()); System.out.println("RequestId=" + querySendDetailsResponse.getRequestId()); } }*/ }
package com.xxxx.util.index; public class Note { private String id; private String phoneNumber; private String templateCode; private String product; private String code; private String templateParam; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getPhoneNumber() { return phoneNumber; } public void setPhoneNumber(String phoneNumber) { this.phoneNumber = phoneNumber; } public String getTemplateCode() { return templateCode; } public void setTemplateCode(String templateCode) { this.templateCode = templateCode; } public String getProduct() { return product; } public void setProduct(String product) { this.product = product; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getTemplateParam(){ return templateCode; } public void setTemplateParam(String templateParam){ this.templateParam=templateParam; } }
package com.xxxx.util.index; public class CheckCode { private Integer Id;//id private String Userid;//memberid private String code;//驗證碼 private String creatTime;//驗證碼創建時間 private String phone; private String username; public Integer getId() { return Id; } public void setId(Integer id) { Id = id; } public String getUserid() { return Userid; } public void setUserid(String userid) { Userid = userid; } public String getCode() { return code; } public void setCode(String code) { this.code = code; } public String getCreatTime() { return creatTime; } public void setCreatTime(String creatTime) { this.creatTime = creatTime; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public String getUsername(){ return username; } public void setUsername(String username){ this.username=username; } }
以上便是主要獲取短信的核心代碼
如果只獲取代碼的話只需SmsUtil這個類中的代碼,略微修改一下信息就可在main函數中獲得短信,其他兩個類是我們在后台操作 時保存信息用的實體類。