Spring Boot 集成阿里雲 SMS服務

之前做過網易雲信和無極限提供的SMS服務,有需要可以參考下:Java使用網易雲信短信驗證 demo(完整教程)

因項目需要,需利用阿里雲SMS服務實現短信服務。下面給初次使用的朋友們分享記錄一下。

幫助文檔 


操作實現

1、開通短信服務

2、創建AccessKey

3、AccessKey ID 和 AccessKeySecret

注意:保存AccessKeySecret,頁面關閉後將無法再次獲取信息 !

 4、添加簽名

5、添加模板

 審覈通過基本上就配置好了,接下來看下如何實現

 6、Maven導入jar包

<dependency>
        <groupId>aliyun.java.sdk</groupId>
        <artifactId>core</artifactId>
        <version>3.3.1</version>
        <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/aliyun-java-sdk-core-3.3.1.jar</systemPath>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>aliyun.java.sdk</groupId>
        <artifactId>dysmsapi</artifactId> 
        <version>1.0.0</version>
        <systemPath>${project.basedir}/src/main/webapp/WEB-INF/lib/aliyun-java-sdk-dysmsapi-1.0.0.jar</systemPath>
        <scope>compile</scope> 
    </dependency>

7、封裝工具類

package com.giantfind.common.util;

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;
import java.util.HashMap;
import java.util.Map;

/**
 * @Package: com.giantfind.common.util
 * @ClassName: SmsUtils
 * @Author: liuyaolong
 * @Description: 短信API
 * @Date: 2019/11/9 0009上午 10:49
 * @Version: 1.0
 */
public class SmsUtils {

        static final String system_name = "xxx系統";

        //產品名稱:雲通信短信API產品,開發者無需替換
        static final String product = "Dysmsapi";
        //產品域名,開發者無需替換
        static final String domain = "dysmsapi.aliyuncs.com";

        static final String accessKeyId = "生成的accessKeyId";
        static final String accessKeySecret = "生成的accessKeySecret";

        private static int newcode;
        public static int getNewcode() {
            return newcode;
        }
        public static void setNewcode() {
            newcode = (int) (Math.random() * 9999) + 100;
        }

    /**
     * 發送手機驗證碼
     * @param telephone
     * @return
     * @throws ClientException
     */
        public static Map<String,String> sendSms(String telephone) throws ClientException {

            Map<String,String> map = new HashMap<>();
            map.put("telephone",telephone);
            setNewcode();
            String code = Integer.toString(getNewcode());
            map.put("code",code);

            //可自助調整超時時間
            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(telephone);
            //必填:短信簽名-可在短信控制檯中找到
            request.setSignName("輸入簽名名稱");
            //必填:短信模板-可在短信控制檯中找到
            request.setTemplateCode("輸入短信模板CODE");
            //可選:模板中的變量替換JSON串,如模板內容爲"您的驗證碼爲${code}"時,您正在登錄${product}。此處的值爲
            request.setTemplateParam("{\"code\":\""+code+"\",\"product\":\""+system_name+"\"}");

            //選填-上行短信擴展碼(無特殊需求用戶請忽略此字段)
            //request.setSmsUpExtendCode("90997");

            //可選:outId爲提供給業務方擴展字段,最終在短信回執消息中將此值帶回給調用者
            //request.setOutId("yourOutId");

            //hint 此處可能會拋出異常,注意catch
            SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request);
            map.put("result",sendSmsResponse.getCode());
            return map;
        }


    /**
     * "短信明細查詢接口
     * @param bizId (sendSms 返回 sendSmsResponse 裏)
     * @return
     * @throws ClientException
     */
        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("15000000000");
            //可選-流水號
            request.setBizId(bizId);
            //必填-發送日期 支持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;
        }

}

8、調用測試

package com.giantfind.business.web;

import com.aliyuncs.exceptions.ClientException;
import com.giantfind.business.model.sms.TelephoneInfo;
import com.giantfind.common.message.RequestMsg;
import com.giantfind.common.message.ResponseHead;
import com.giantfind.common.message.ResponseMsg;
import com.giantfind.common.util.SmsUtils;
import com.giantfind.common.util.ValidationUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

/**
 * @Package: com.giantfind.business.web
 * @ClassName: SmsController
 * @Author: liuyaolong
 * @Description: 短信消息推送
 * @Date: 2019/11/9 0009下午 2:38
 * @Version: 1.0
 */
@RestController
@RequestMapping("sms")
public class SmsController {

    private static final Logger logger = Logger.getLogger(SmsController.class);

    /**
     * 發送手機短信驗證碼
     * @param in
     * @return
     */
    @PostMapping("sendSms")
    public ResponseMsg<Map<String,String>> sendSms(@RequestBody RequestMsg<TelephoneInfo> in) throws ClientException {

        ResponseMsg<Map<String,String>> response = new ResponseMsg<>();

        //自定義效驗手機號
        if(StringUtils.isBlank(in.getData().getTelephone())){
            response.setHead(ResponseHead.buildFailedHead("手機號碼不能爲空!"));
            return response;
        }

        if(in.getData().getTelephone().length() != 11){
            response.setHead(ResponseHead.buildFailedHead("手機號碼應爲11位數!"));
            return response;
        }

        if(ValidationUtils.isPhone(in.getData().getTelephone()) == false){
            response.setHead(ResponseHead.buildFailedHead("手機號碼有誤!"));
            return response;
        }
        Map<String,String> map = SmsUtils.sendSms(in.getData().getTelephone());
        String code = map.get("result");
        if(code!= null && code.equals("OK")){
            response.setHead(ResponseHead.buildSuccessHead());
        }else {
            response.setHead(ResponseHead.buildFailedHead("短信發送失敗!"));
        }
        response.setData(map);
        return response;
    }

}

9、PostMan測試結果

"data": {
        "result": "OK",
        "code": "5165",
        "telephone": "13302943855"
    }

以上就是本文的全部內容,希望對大家的學習有所幫助,歡迎評論交流。能get到知識點不要忘了關注點個贊~ 拒絕白嫖從我們做起hh~ 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章