Springboot實(shí)現(xiàn)阿里云通信短信服務(wù)有關(guān)短信驗(yàn)證碼的發(fā)送功能
前言
短信驗(yàn)證碼是通過(guò)發(fā)送驗(yàn)證碼到手機(jī)的一種有效的驗(yàn)證碼系統(tǒng)。主要用于驗(yàn)證用戶(hù)手機(jī)的合法性及敏感操作的身份驗(yàn)證。
現(xiàn)在市面上的短信服務(wù)平臺(tái)有很多。大家在選擇的時(shí)候未免會(huì)有些不好抉擇。本人建議選擇短信服務(wù)商應(yīng)遵循以下幾點(diǎn):
- 服務(wù)商知名度高,業(yè)務(wù)流量大。(這樣的平臺(tái)可信度高)
- 服務(wù)穩(wěn)定,不能經(jīng)常宕機(jī)。(保證自身業(yè)務(wù)的流暢運(yùn)行)
- 文檔全面詳細(xì)。(沒(méi)文檔怎么玩?)
最近的一個(gè)項(xiàng)目中,注冊(cè)和修改密碼時(shí)需要用到短信驗(yàn)證碼校驗(yàn)手機(jī)號(hào)的功能。本人也是對(duì)比幾家后,直接選擇阿里云通信的短信服務(wù)。(本身項(xiàng)目服務(wù)器也是部署在阿里云上,但之前并不知道阿里云有短信服務(wù),早知道阿里有的話(huà)就不會(huì)浪費(fèi)時(shí)間找其他平臺(tái)了)。廢話(huà)不多說(shuō),下面直接開(kāi)始短信驗(yàn)證服務(wù)教程。
準(zhǔn)備
1.登錄阿里云,開(kāi)通阿里云通信短信服務(wù)。
2.申請(qǐng)accessKey
選擇右上角accessKeys,創(chuàng)建一個(gè)access key
3.進(jìn)入控制臺(tái),申請(qǐng)短信簽名。這個(gè)作用就是用于短信前面“【】”里面的名稱(chēng)。輸入時(shí)不需要帶“【】”
注意申請(qǐng)規(guī)范,要不然審核不會(huì)過(guò)。符合規(guī)范的話(huà)一般一個(gè)小時(shí)左右就能通過(guò)了。
我這里的簽名是“喝酒不騎馬”
4.申請(qǐng)短信模版
模板類(lèi)型選擇驗(yàn)證碼。注意,選擇驗(yàn)證碼后,模板替代變量只支持驗(yàn)證碼作為變量,且變量替換值<=6位數(shù)字或字母。
我的模板如下圖
1.下載SDK包
https://help.aliyun.com/document_detail/55284.html
下載后,我們需要使用
aliyun-java-sdk-core-3.2.2.jar
aliyun-java-sdk-dysmsapi-1.0.0-SANPSHOT.jar
aliyun-sdk-mns-1.1.8.jar
這三個(gè)包
SpringBoot + Maven下的jar包配置
1.在工程的resources目錄下新建一個(gè)lib文件夾,將jar包復(fù)制進(jìn)去。
2.由于maven庫(kù)中沒(méi)有上述幾個(gè)jar包的依賴(lài),所以需要將本地lib目錄下的jar包導(dǎo)入到maven中。并在pom.xml文件中填下如下依賴(lài)。
<dependency> <groupId>aliyun-message-sdk-core</groupId> <artifactId>aliyun-message-sdk-core</artifactId> <version>3.2.3</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/resources/lib/aliyun-java-sdk-core-3.2.2.jar</systemPath> </dependency> <dependency> <groupId>aliyun-message-sdk-mns</groupId> <artifactId>aliyun-message-sdk-mns</artifactId> <version>1.1.8</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/resources/lib/aliyun-sdk-mns-1.1.8.jar</systemPath> </dependency> <dependency> <groupId>aliyun-java-sdk-dysmsapi</groupId> <artifactId>aliyun-java-sdk-dysmsapi</artifactId> <version>1.0.0</version> <scope>system</scope> <systemPath>${project.basedir}/src/main/resources/lib/aliyun-java-sdk-dysmsapi-1.0.0-SANPSHOT.jar</systemPath> </dependency>
注意, <groupId>、<artifactId>、<version>
隨意填寫(xiě)。<scope>system</scope>
必須要加,這表示導(dǎo)入本地的jar包。
${project.basedir}
為項(xiàng)目的根路徑。
建立AliyunMessageUtil工具類(lèi)
public class AliyunMessageUtil { private static final String product = "Dysmsapi"; //產(chǎn)品域名,開(kāi)發(fā)者無(wú)需替換 private static final String domain = "dysmsapi.aliyuncs.com"; // 此處需要替換成開(kāi)發(fā)者自己的AK(在阿里云訪(fǎng)問(wèn)控制臺(tái)尋找) private static final String accessKeyId = "這里替換你的accessKeyId"; private static final String accessKeySecret = "這里替換你的accessKeySecret"; public static SendSmsResponse sendSms(Map<String, String> paramMap) throws com.aliyuncs.exceptions.ClientException { //可自助調(diào)整超時(shí)時(shí)間 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); //組裝請(qǐng)求對(duì)象-具體描述見(jiàn)控制臺(tái)-文檔部分內(nèi)容 SendSmsRequest request = new SendSmsRequest(); //必填:待發(fā)送手機(jī)號(hào) request.setPhoneNumbers(paramMap.get("phoneNumber")); //必填:短信簽名-可在短信控制臺(tái)中找到 request.setSignName(paramMap.get("msgSign")); //必填:短信模板-可在短信控制臺(tái)中找到 request.setTemplateCode(paramMap.get("templateCode")); //可選:模板中的變量替換JSON串,如模板內(nèi)容為"親愛(ài)的${name},您的驗(yàn)證碼為$[code]"時(shí),此處的值為 request.setTemplateParam(paramMap.get("jsonContent")); //選填-上行短信擴(kuò)展碼(無(wú)特殊需求用戶(hù)請(qǐng)忽略此字段) // request.setSmsUpExtendCode(paramMap.get("extendCode")); //可選:outId為提供給業(yè)務(wù)方擴(kuò)展字段,最終在短信回執(zhí)消息中將此值帶回給調(diào)用者 // request.setOutId(paramMap.get("outId")); //hint 此處可能會(huì)拋出異常,注意catch SendSmsResponse sendSmsResponse = acsClient.getAcsResponse(request); return sendSmsResponse; } }
sendSms(Map<String, String> paramMap)
方法是我封裝的方法。傳入的參數(shù)是paramMap,其中包含以下屬性:
phoneNumber:接受者手機(jī)號(hào)
msgSign:短信簽名名稱(chēng)。在控制臺(tái)的短信簽名里能找到。
templateCode:短信模版的code。見(jiàn)控制臺(tái)中的模版code。
jsonContent:需要替換的變量的JSON字符串。對(duì)于驗(yàn)證碼來(lái)說(shuō),String jsonContent = "{\"number\":\"" + randomNum + "\"}";即可。其中randomNum是隨機(jī)生成的6位驗(yàn)證碼。
extendCode:上行短信模板的驗(yàn)證碼,不需要的話(huà)可以忽略
outId:擴(kuò)展字段,不需要?jiǎng)t可以忽略
調(diào)用demo
public String sendMsg() throws LgdServiceException, ClientException { String phoneNumber = "18888888888"; String randomNum = createRandomNum(6); String jsonContent = "{\"number\":\"" + randomNum + "\"}"; Map<String, String> paramMap = new HashMap<>(); paramMap.put("phoneNumber", phoneNumber); paramMap.put("msgSign", "喝酒不騎馬"); paramMap.put("templateCode", "xxxxxxxx"); paramMap.put("jsonContent", jsonContent); SendSmsResponse sendSmsResponse = AliyunMessageUtil.sendSms(paramMap); if(!(sendSmsResponse.getCode() != null && sendSmsResponse.getCode().equals("OK"))) { if(sendSmsResponse.getCode() == null) { //這里可以?huà)伋鲎远x異常 } if(!sendSmsResponse.getCode().equals("OK")) { //這里可以?huà)伋鲎远x異常 } } } /** * 生成隨機(jī)數(shù) * @param num 位數(shù) * @return */ public static String createRandomNum(int num){ String randomNumStr = ""; for(int i = 0; i < num;i ++){ int randomNum = (int)(Math.random() * 10); randomNumStr += randomNum; } return randomNumStr; }
總結(jié)
短信效果如圖所示
對(duì)于驗(yàn)證碼的校驗(yàn),可參見(jiàn)我的另一篇博文SpringBoot實(shí)現(xiàn)短信驗(yàn)證碼校驗(yàn).
以上所述是小編給大家介紹的Springboot實(shí)現(xiàn)阿里云通信短信服務(wù)有關(guān)短信驗(yàn)證碼的發(fā)送功能,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- SpringBoot發(fā)送短信驗(yàn)證碼的實(shí)例
- SpringBoot發(fā)送html郵箱驗(yàn)證碼功能
- SpringBoot使用榛子云實(shí)現(xiàn)手機(jī)短信發(fā)送驗(yàn)證碼
- SpringBoot發(fā)送郵件功能 驗(yàn)證碼5分鐘過(guò)期
- SpringBoot使用郵箱發(fā)送驗(yàn)證碼實(shí)現(xiàn)注冊(cè)功能
- SpringBoot發(fā)送郵箱驗(yàn)證碼功能
- SpringBoot+Security 發(fā)送短信驗(yàn)證碼的實(shí)現(xiàn)
- SpringBoot實(shí)現(xiàn)發(fā)送驗(yàn)證碼功能(圖片驗(yàn)證碼)
相關(guān)文章
Spring實(shí)戰(zhàn)之使用TransactionProxyFactoryBean實(shí)現(xiàn)聲明式事務(wù)操作示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之使用TransactionProxyFactoryBean實(shí)現(xiàn)聲明式事務(wù)操作,結(jié)合實(shí)例形式分析了spring使用TransactionProxyFactoryBean實(shí)現(xiàn)聲明式事務(wù)相關(guān)配置、接口設(shè)置與使用技巧,需要的朋友可以參考下2020-01-01Java學(xué)習(xí)之如何進(jìn)行JSON解析
JSON(JavaScript?Object?Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式,它算是JavaScript語(yǔ)言的一部分,與XML一樣都可以用于數(shù)據(jù)的存儲(chǔ)和傳輸,本文講給大家介紹如何進(jìn)行JSON解析,需要的朋友可以參考下2023-12-12深入Spring Boot實(shí)現(xiàn)對(duì)Fat Jar jsp的支持
這篇文章主要介紹了深入Spring Boot實(shí)現(xiàn)對(duì)Fat Jar jsp的支持,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06java中用String.Join美化代碼的實(shí)例講解
在本篇文章里小編給大家整理的是一篇關(guān)于java中用String.Join美化代碼的實(shí)例講解內(nèi)容,有需要的朋友們可以學(xué)習(xí)下。2020-12-12java判斷class子類(lèi)或父類(lèi)的實(shí)例方法
在本篇文章里小編給大家整理的是關(guān)于java判斷class子類(lèi)或父類(lèi)的實(shí)例方法,需要的朋友們可以參考學(xué)習(xí)下。2020-02-02Java多線(xiàn)程之深入理解ReentrantLock
這篇文章主要介紹了Java多線(xiàn)程之深入理解ReentrantLock,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有非常好的幫助,需要的朋友可以參考下2021-04-04Spring中使用copyProperties方法進(jìn)行對(duì)象之間的屬性賦值詳解
這篇文章主要介紹了Spring中使用copyProperties方法進(jìn)行對(duì)象之間的屬性賦值詳解,使用org.springframework.beans.BeanUtils.copyProperties方法進(jìn)行對(duì)象之間屬性的賦值,避免通過(guò)get、set方法一個(gè)一個(gè)屬性的賦值,需要的朋友可以參考下2023-12-12