阿里雲短信平臺,能夠提供三種短信模板形式(一、驗證碼模板;二、通知類消息模板;三、推廣短信模板)html
驗證碼模板形式:驗證碼${code},您正在進行身份驗證,打死不要告訴別人哦!java
通知類消息模板:尊敬的${name}用戶,恭喜您成功註冊爲本商城的會員用戶,相信本商城會爲您帶來良好的體驗效果,祝您生活愉快!數據庫
推廣短信模板:短信測試,短信測試,短信測試,短信測試,短信測試,短信測試api
(注:推廣短信模板無需參數,其餘兩個均須要)緩存
(注意:如下方法基本放在service層)dom
一、下載SDK工具包異步
SDK工具包中一共包含了2個類庫,一個aliyun-java-sdk-core包,另一個是alicom-dysms-api包,將這兩個包執行mvn package命令或者mvn deploy命令打包出相應的jar包,添加到工程類庫中依賴使用。async
SDK&DEMO[下載地址]ide
一、編寫短信統一處理函數函數
SendSmsResponse send(String mobiles, String content, String TemplateCode);
返回值:SendSmsResponse (用於肯定是否發送短信成功),判斷條件:
if(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) { System.out.print("success"); }
參數:mobiles須要發送的電話號碼,如果多個,用 "," 隔開,形式:"13472266942,17600693094"
content是模板中的變量及變量值,若變量爲name,code,則content形式{"name":"Tom", "code":"SUMY"},
當不發送推廣短信的時候,須要逐條發送,由於每條短信內容的變量值不一樣,只有推廣短信能夠批量發送
TemplateCode是阿里雲短信模板中的模板CODE,用於接口判斷模板內容,至關於數據庫中的id
/** * @desc: 阿里短信發送 * @return: SendSmsResponse * @author: gxl * @datetime 2017年12月1日, 下午9:32:12 */ private SendSmsResponse send(String mobiles, String content, String TemplateCode) throws ClientException, InterruptedException {
//mobiles爲要發送的電話號碼,content模板變量的替換,TemplateCode爲模板CODE(能夠在阿里雲平臺上找到) SendSmsResponse sendSmsResponse; //可自助調整超時時間 System.setProperty("sun.net.client.defaultConnectTimeout", "10000"); System.setProperty("sun.net.client.defaultReadTimeout", "10000"); //初始化ascClient須要的幾個參數 final String product = "Dysmsapi";//短信API產品名稱(短信產品名固定,無需修改) final String domain = "dysmsapi.aliyuncs.com";//短信API產品域名(接口地址固定,無需修改) //替換成你的AK final String accessKeyId = "accessKeyId"; final String accessKeySecret = "accessKeySecret "; //初始化ascClient,暫時不支持多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(); //使用post提交 request.setMethod(MethodType.POST); //必填:待發送手機號。支持以逗號分隔的形式進行批量調用,批量上限爲1000個手機號碼,批量調用相對於單條調用及時性稍有延遲,驗證碼類型的短信推薦使用單條調用的方式;發送國際/港澳臺消息時,接收號碼格式爲00+國際區號+號碼,如「0085200000000」 request.setPhoneNumbers(mobiles); //必填:短信簽名-可在短信控制檯中找到-填寫本身的短信簽名 request.setSignName("Tom"); //必填:短信模板-可在短信控制檯中找到 request.setTemplateCode(TemplateCode); //可選:模板中的變量替換JSON串,如模板內容爲"親愛的${name},您的驗證碼爲${code}"時,此處的值爲{"name":"Tom", "code":"SMKU"} //友情提示:若是JSON中須要帶換行符,請參照標準的JSON協議對換行符的要求,好比短信內容中包含\r\n的狀況在JSON中須要表示成\\r\\n,不然會致使JSON在服務端解析失敗
//若是短信爲推廣短信,則無需使用request.setTemplateParam(content); if (!content.equals("")) { request.setTemplateParam(content); } //可選-上行短信擴展碼(擴展碼字段控制在7位或如下,無特殊需求用戶請忽略此字段) //request.setSmsUpExtendCode("90997"); //可選:outId爲提供給業務方擴展字段,最終在短信回執消息中將此值帶回給調用者 //request.setOutId("yourOutId"); // 請求失敗這裏會拋ClientException異常 sendSmsResponse = acsClient.getAcsResponse(request); //判斷是否發送成功 if(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK")) { System.out.print("success"); } return sendSmsResponse; }
二、發送驗證碼(須要調用上面的方法)
/** * @desc: 發送驗證碼 * @return: SendSmsResponse * @author: gxl * @datetime 2017年12月1日, 下午9:33:52 */ @Override public SendSmsResponse sendCaptcha(String mobeiles, Long id) { //獲取一個驗證碼 String captcha = captchaProducer.createText();
//將驗證碼和模板變量組合成content String content = "{\"code\":\"" + captcha + "\"}"; try {
//調用上面所寫的函數,注意「SMS_130820049」是本身申請的模板CODE SendSmsResponse send = send(string, content, "SMS_130820049");
//將驗證碼加入緩存,send.getBizId()爲緩存中的key值,captcha爲緩存中的value值,目的是爲了後面對驗證碼進行校驗 Ehcache cache = cacheManager.getEhcache("smsCaptcha"); cache.put(new Element(send.getBizId(), captcha)); return send; } catch (ClientException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } return null; }
短信驗證:
public boolean isValid(String smsCaptchaId, String smsCaptcha) { if (StringUtils.isEmpty(smsCaptchaId) || StringUtils.isEmpty(smsCaptcha)) { return false; } Ehcache cache = cacheManager.getEhcache(SMS_CAPTCHA_CACHE_NAME); Element element = cache.get(smsCaptchaId); if (element != null) { String value = (String) element.getObjectValue(); Boolean flag = StringUtils.equalsIgnoreCase(smsCaptcha, value); if(flag){ cache.remove(smsCaptchaId); } return flag; } return false; }
三、發送通知類短信或推廣短信
此處使用List<String> mobileList 目的是爲了方便推廣短信編寫手機號碼,使其批量發送,最多每次只能夠發送1000條,固然發送通知類短信的時候,List裏面只有一條電話號碼,注意在調用的時候不要寫錯
同步發送的時候,須要等待發送完短信再進行下一步操做;異步發送短信,不須要等待將短信發送完就能夠進行下一步操做
/** * 發送短信 * * @param mobiles * 手機號碼 * @param content * 內容 * @param templateCode * 模板 * @param async * 是否異步 */ public void send(List<String> mobileList, String content, String templateCode, boolean async) { Assert.notEmpty(mobileList); //每次批量發送最多1000條 for (int j = 0;; j += 1000) { Integer k = j; String mobiles = ""; for(Integer i=j; i<j+1000 && i<mobileList.size();i++, k++){ mobiles = mobiles + mobileList.get(i) + ","; } //判斷同步發送短信,仍是異步 if (async) { //注意更改 addSendTask(mobiles, content, templateCode); } else { try {
//調用1中的方法,發送短信 send(mobiles, content, templateCode); } catch (ClientException | InterruptedException e) { e.printStackTrace(); } } if (k >= mobileList.size()) { break; } } }
異步發送短信(即,新建一個進程)
/** * 添加短信發送任務 * * @param mobiles 手機號碼 * @param content 內容 * @param templateCode 模板CODE */ private void addSendTask(final String mobiles, final String content,final String templateCode) { taskExecutor.execute(new Runnable() { @Override public void run() { try {
//發送短信 send(mobiles, content, templateCode); } catch (ClientException | InterruptedException e) { e.printStackTrace(); } } }); }
(注意:若是無需同步、異步,根據自身的需求更改代碼)