阿里雲短信發送

    阿里雲短信平臺,能夠提供三種短信模板形式(一、驗證碼模板;二、通知類消息模板;三、推廣短信模板)html

    驗證碼模板形式:驗證碼${code},您正在進行身份驗證,打死不要告訴別人哦!java

    通知類消息模板:尊敬的${name}用戶,恭喜您成功註冊爲本商城的會員用戶,相信本商城會爲您帶來良好的體驗效果,祝您生活愉快!數據庫

    推廣短信模板:短信測試,短信測試,短信測試,短信測試,短信測試,短信測試api

    (注:推廣短信模板無需參數,其餘兩個均須要)緩存

    (注意:如下方法基本放在service層)dom

1、開發前準備

    一、下載SDK工具包異步

    SDK工具包中一共包含了2個類庫,一個aliyun-java-sdk-core包,另一個是alicom-dysms-api包,將這兩個包執行mvn package命令或者mvn deploy命令打包出相應的jar包,添加到工程類庫中依賴使用。async

    SDK&DEMO[下載地址]ide

2、編寫代碼

    一、編寫短信統一處理函數函數

    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(); } } }); }

    (注意:若是無需同步、異步,根據自身的需求更改代碼)

相關文章
相關標籤/搜索