老司机午夜精品视频播放-老司机午夜精品视频观看-老司机午夜精品视频在线观看免费-老司机午夜精品网站在线观看-亚洲综合精品成人-亚洲综合精品成人啪啪

您所在的位置:主頁 > 行業(yè)資訊 >

spring boot是干嘛的(怎么使用sms短信)

2021-11-20 15:04
[spring boot是干嘛的(怎么使用sms短信)]。

“短信發(fā)送”功能在企業(yè)應(yīng)用系統(tǒng)開發(fā)中應(yīng)該說算是很常見的了,典型的案例 如 “用戶登錄時可以通過手機(jī)號接收平臺發(fā)送的驗(yàn)證碼進(jìn)行登錄”、“用戶通過手機(jī)號接收平臺發(fā)送的短信驗(yàn)證碼從而找回密碼”、“雙重驗(yàn)證用戶身份時需要用手機(jī)號接收平臺發(fā)送的驗(yàn)證碼已確認(rèn)用戶身份”等等都是比較常見的,本文將基于阿里云SMS短信發(fā)送服務(wù) 在Java Spring Boot應(yīng)用系統(tǒng)實(shí)現(xiàn)短信發(fā)送功能

移動互聯(lián)網(wǎng)時代,幾乎人人都有部智能手機(jī),每天的收、發(fā)短信操作想必已成常態(tài),在使用各種APP或者網(wǎng)站應(yīng)用系統(tǒng)時相比也應(yīng)該經(jīng)常都能有所見聞;而作為一名Java開發(fā)者,不知諸位在實(shí)際項(xiàng)目、實(shí)際應(yīng)用系統(tǒng)中是否有真正地實(shí)現(xiàn)過短信發(fā)送以及對短信驗(yàn)證碼進(jìn)行驗(yàn)證的功能?今天debug將帶大家一起實(shí)戰(zhàn)落地該功能!

順帶提下,我們將基于Spring Boot2.x進(jìn)行代碼實(shí)戰(zhàn),別問為什么哈!作為一名Java開發(fā)者,如果都不知道Spring Boot,debug都不知道該怎么說你了!另外,我們將基于阿里云SMS短信發(fā)送服務(wù)功能,其官網(wǎng)如下所示:
https://www.aliyun.com/product/sms,可以點(diǎn)擊購買或者免費(fèi)開通,如果人品好的話,估計(jì)還真的可以免費(fèi)開通(免費(fèi)試用幾條);

在這里,debug就假設(shè)諸位已經(jīng)成功開通了阿里云SMS短信發(fā)送服務(wù)了哈(如果沒有開通成功也沒關(guān)系,收藏下文章吧,以后總有用得著的),OK,話不多說,咱們直接開干!

(1)首先,需要加入阿里云短信SMS服務(wù)的SDK,即對于我們Java后端而言,其實(shí)就是一個Jar包,如下所示:

<!--阿里云短信服務(wù)-->
<dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-core</artifactId>
    <version>4.5.0</version>
</dependency>

(2)緊接著是進(jìn)入阿里云短信服務(wù)管理控制臺,獲取AccessKey ID 、AccessKey Secret并創(chuàng)建“短信簽名”以及“短信發(fā)送模板”,如下圖所示:

拿到這些信息之后,接下來需要將這些信息項(xiàng)配置起來,如下所示:

#阿里云sms配置
ali.sms.accessKeyId=這里是你的AccessKey ID
ali.sms.accessSecret=這里是你的AccessKey Secret
ali.sms.regionId=cn-hangzhou
ali.sms.sysDomain=dysmsapi.aliyuncs.com
ali.sms.sysVersion=2017-05-25
ali.sms.sysAction=SendSms
ali.sms.enabled=true


ali.sms.phone.sendCode.bu=申請的短信簽名
ali.sms.phone.sendCode.temp=申請的短信模板編碼
ali.sms.phone.sendCode.msg=備注信息

之后便可以基于SpringBoot自動注入配置的功能特性將以上配置項(xiàng)加入到一個實(shí)體類中,以方便后續(xù)開發(fā)實(shí)際業(yè)務(wù)代碼時使用,其定義如下所示:

@Configuration
@ConfigurationProperties(prefix = "ali.sms")
@Data
public class AliSmsProperty {
    private String accessKeyId;


    private String accessSecret;


    private String regionId;


    private String sysDomain;


    private String sysVersion;


    private String sysAction;


    private Boolean enabled;
}

(3)緊接著,開發(fā)調(diào)用阿里云短信服務(wù)SMS的SDK提供的發(fā)送短信功能 的代碼,如下所示:

@Service
public class AliSmsService {
    private static final Logger log= LoggerFactory.getLogger(AliSmsService.class);


    private static final String Channel="aliyun";


    @Autowired
    private AliSmsProperty aliSmsProperty;


    @Autowired
    private ObjectMapper objectMapper;


    //發(fā)送通用消息
    public void sendMsg(AliSmsRequest smsRequest,final Long sendId) throws Exception{
        if (!aliSmsProperty.getEnabled()){
            return;
        }


        //參數(shù)校驗(yàn)


        //短信配置初始化
        DefaultProfile profile=DefaultProfile.getProfile(aliSmsProperty.getRegionId(),aliSmsProperty.getAccessKeyId(),aliSmsProperty.getAccessSecret());
        IAcsClient client=new DefaultAcsClient(profile);
        //構(gòu)造短信發(fā)送請求
        CommonRequest request=new CommonRequest();
        request.setSysMethod(MethodType.POST);
        request.setSysDomain(aliSmsProperty.getSysDomain());
        request.setSysVersion(aliSmsProperty.getSysVersion());
        request.setSysAction(aliSmsProperty.getSysAction());


        request.putQueryParameter("RegionId", aliSmsProperty.getRegionId());
        request.putQueryParameter("PhoneNumbers", smsRequest.getPhoneNumbers());
        request.putQueryParameter("SignName", smsRequest.getSignName());
        request.putQueryParameter("TemplateCode", smsRequest.getTemplateCode());
        request.putQueryParameter("TemplateParam", smsRequest.getTemplateParam());


        request.putQueryParameter("SmsUpExtendCode", RandomStringUtils.randomNumeric(4));
        request.putQueryParameter("OutId", smsRequest.getTemplateCode()+"_"+RandomStringUtils.randomAlphanumeric(8));


        //發(fā)送短信
        CommonResponse response = client.getCommonResponse(request);
        log.info("--阿里云短信發(fā)送結(jié)果:{},{},{}----",response.getHttpStatus(),response.getHttpResponse(),response.getData());


        if (response!=null && StringUtils.isNotBlank(response.getData())){
            AliSmsResponse smsResponse=objectMapper.readValue(response.getData(),AliSmsResponse.class);
            if (smsResponse!=null && "OK".equals(smsResponse.getCode())){
                //創(chuàng)建一條短信發(fā)送成功的記錄(記錄到數(shù)據(jù)庫DB,以用于后續(xù)的驗(yàn)證碼驗(yàn)證)
                
            }else{
                //創(chuàng)建一條短信發(fā)送失敗的記錄
            }
        }
    }
}

其中,AliSmsRequest為開放給客戶端調(diào)用的參數(shù),其定義如下所示:

@Data
public class AliSmsRequest implements Serializable{
    //要接受短信的手機(jī)號
    private String phoneNumbers;


    //申請的短信簽名
    private String signName;


    //申請的模板編碼
    private String templateCode;


    //短信發(fā)送參數(shù)-json格式的字符串,如{"code":123456}
    private String templateParam;


    //短信發(fā)送上行編碼-按照官方建議的填就行
    private String smsUpExtendCode;
    //序列id-按照官方建議的填就行
    private String outId;


    public AliSmsRequest(String phoneNumbers, String signName, String templateCode, String templateParam) {
        this.phoneNumbers = phoneNumbers;
        this.signName = signName;
        this.templateCode = templateCode;
        this.templateParam = templateParam;
    }


    public AliSmsRequest() {
    }
}

至此,我們已經(jīng)將發(fā)送短信的核心代碼擼完了,其中傳遞給服務(wù)端的參數(shù)的格式為(以發(fā)送短信驗(yàn)證碼為例):

{
    "phoneNumbers":"15812490898",
    "signName":"申請的短信簽名",
    "tempCode":"申請的短信模板編碼",
    "templateParam":"{"code":"708946"}",
    "smsUpExtendCode":"12345678",
    "outId":"12345678"      
}

如果過程沒有報(bào)錯,不出5秒應(yīng)該會收到一條短信,如下圖所示:

 

OK,打完收工,咱們下期再見!




圖片展示