SpringBoot項(xiàng)目中使用騰訊云發(fā)送短信的實(shí)現(xiàn)
在一些項(xiàng)目中總會(huì)不可避免的要用到短信服務(wù),比如發(fā)送驗(yàn)證碼等,那么如何進(jìn)行短信的發(fā)送呢,我們這就來捋一捋,我這里采用的是騰訊云的短信服務(wù)。其他的云服務(wù)也大致一樣。
第一步、申請(qǐng)騰訊云的短信服務(wù)并配置基本信息
首先進(jìn)入騰訊云的短信服務(wù)界面?zhèn)魉烷T
https://console.cloud.tencent.com/smsv2
如上圖所示,我們會(huì)看到要我們申請(qǐng)開通短信服務(wù),開通后它會(huì)免費(fèi)送我們100條國(guó)內(nèi)短信。
接下來我們就要進(jìn)行相關(guān)的配置,首先進(jìn)行創(chuàng)建簽名,按照要求填寫就行。
這步之后創(chuàng)建短信正文的模板
創(chuàng)建正文模板我們可以選擇使用標(biāo)準(zhǔn)模板。
配置完畢后就等待審核,審核完成后我們就可以使用接口發(fā)送短信了。
第二步、我們可以在API Explore中進(jìn)行一下測(cè)試
測(cè)試前我們要首先找一下短信應(yīng)用的APPID,如下圖
填寫完信息后點(diǎn)擊發(fā)起調(diào)用即可將短信發(fā)送到對(duì)應(yīng)的手機(jī)上。
之后在程序代碼中進(jìn)行調(diào)用,我們進(jìn)行配置的參數(shù)和表單中的參數(shù)是一樣的,只是多了secretID,secretKey。
第三步、安裝java的SDK
在項(xiàng)目添加 Maven 依賴項(xiàng),只需在 pom.xml 中找到<dependencies>
標(biāo)簽,在里面添加以下依賴項(xiàng)即可。
<dependency> <groupId>com.tencentcloudapi</groupId> <artifactId>tencentcloud-sdk-java</artifactId> <!-- go to https://search.maven.org/search?q=tencentcloud-sdk-java and get the latest version. --> <!-- 請(qǐng)到https://search.maven.org/search?q=tencentcloud-sdk-java查詢所有版本,最新版本如下 --> <version>3.1.322</version> </dependency>
若是用其他語(yǔ)言進(jìn)行配置,可進(jìn)入網(wǎng)站查看詳細(xì)說明:傳送
第四步、在項(xiàng)目中編寫代碼,調(diào)用接口
以下是一些必要步驟
首先在項(xiàng)目yml文件中配置一些必要的參數(shù)信息,避免硬編碼,便于維護(hù)。
sms: sdkAppId: 這里輸入短信應(yīng)用id secretId: 這里輸入secretID secretKey: 這里輸入key signName: 這里輸入短信簽名 templateCodeId: 驗(yàn)證碼模板id,有多個(gè)模板可以配置多個(gè)參數(shù) timeout: 配置RedisCache過期時(shí)間
配置好參數(shù)后,我們就要在程序中編寫代碼進(jìn)行操作。
首先可以編寫一個(gè)發(fā)送短息的組件代碼SmsComponent,在里面完成獲取SmsClient客戶端,以及對(duì)表單參數(shù)進(jìn)行設(shè)置內(nèi)容和發(fā)送短信代碼的封裝。
import com.tencentcloudapi.common.Credential; import com.tencentcloudapi.common.exception.TencentCloudSDKException; import com.tencentcloudapi.common.profile.ClientProfile; import com.tencentcloudapi.common.profile.HttpProfile; import com.tencentcloudapi.sms.v20210111.SmsClient; import com.tencentcloudapi.sms.v20210111.models.SendSmsRequest; import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse; import lombok.Data; import lombok.ToString; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @ToString @Data @Component @Slf4j public class SmsComponent { @Value("${sms.sdkAppId}") // 注入?yún)?shù)值 private String sdkAppId; @Value("${sms.secretId}") private String secretId; @Value("${sms.secretKey}") private String secretKey; @Value("${sms.signName}") private String signName; @Value("${sms.templateCodeId}") private String templateCodeId; @Value("${sms.timeout}") private Integer timeout; /** * 獲取SmsClient客戶端 * @return */ public SmsClient getClient() { // 實(shí)例化一個(gè)認(rèn)證對(duì)象,入?yún)⑿枰獋魅腧v訊云賬戶secretId,secretKey,此處還需注意密鑰對(duì)的保密 // 密鑰可前往https://console.cloud.tencent.com/cam/capi網(wǎng)站進(jìn)行獲取 Credential cred = new Credential(secretId, secretKey); // 實(shí)例化一個(gè)http選項(xiàng),可選的,沒有特殊需求可以跳過 HttpProfile httpProfile = new HttpProfile(); //這個(gè)setEndpoint可以省略的 httpProfile.setEndpoint("sms.tencentcloudapi.com"); // 實(shí)例化一個(gè)client選項(xiàng),可選的,沒有特殊需求可以跳過 ClientProfile clientProfile = new ClientProfile(); clientProfile.setHttpProfile(httpProfile); // 實(shí)例化要請(qǐng)求產(chǎn)品的client對(duì)象,clientProfile是可選的 return new SmsClient(cred, "ap-beijing", clientProfile); } /** * 獲取req請(qǐng)求 2個(gè)參數(shù),就是短息模板是兩個(gè)參數(shù),根據(jù)具體情況改變 * * @param phone * @param code 參數(shù)1,這里是驗(yàn)證碼,param2為參數(shù)2這里為分鐘 * @param templateId 短息模板id * @return */ public SendSmsRequest getReqTwo(String phone, String code, String param2, String templateId) { SendSmsRequest req = new SendSmsRequest(); String[] phoneNumberSet = {"+86" + phone}; req.setSmsSdkAppId(sdkAppId); // 設(shè)置參數(shù) req.setPhoneNumberSet(phoneNumberSet); req.setSignName(signName); req.setTemplateId(templateId); //模板內(nèi)容的參數(shù)有幾個(gè)就設(shè)置幾個(gè),我這里是兩個(gè) String[] templateParamSet = {code,param2}; req.setTemplateParamSet(templateParamSet); return req; // 返回請(qǐng)求參數(shù)內(nèi)容 } /** * 發(fā)送驗(yàn)證碼 * * @param phone * @param code * @param * @return */ public void sendCode(String phone, String code, String param2) { // 返回的resp是一個(gè)SendSmsResponse的實(shí)例,與請(qǐng)求對(duì)象對(duì)應(yīng) SendSmsResponse resp; try { resp = getClient().SendSms(getReqTwo(phone, code,param2 ,templateCodeId)); // 模板id是自己設(shè)置好的 log.info(SendSmsResponse.toJsonString(resp)); // 把返回信息輸入到日志中 } catch (TencentCloudSDKException e) { e.printStackTrace(); } } }
然后可以在service層創(chuàng)建發(fā)送短信的接口
public interface ISmsService { /** * @param phone 給手機(jī)號(hào)發(fā)送驗(yàn)證碼 * @param leastTime 短信有效時(shí)間 * @return */ public String sendCode( String phone,int leastTime); /** * 校驗(yàn)驗(yàn)證碼 */ boolean checkCode(String phone, String code); }
然后實(shí)現(xiàn)發(fā)送短信的接口,同時(shí)我們要自己寫生成驗(yàn)證碼的函數(shù)來確保每次發(fā)送的6位數(shù)字是隨機(jī)的,并且實(shí)現(xiàn)校驗(yàn)驗(yàn)證碼的函數(shù),如果只是發(fā)送信息,那么只需要完成發(fā)送信息的那部分代碼就行。
import java.util.Random; import java.util.concurrent.TimeUnit; @Service public class ISmsServiceImpl implements ISmsService { @Autowired SmsComponent smsComponent; @Autowired RedisCache redisCache; /** * @param phone 給手機(jī)號(hào)發(fā)送驗(yàn)證碼 * @param leastTime 短信有效時(shí)間 * @return */ public String sendCode(String phone, int leastTime) { if (phone == null || phone.length() == 0) { throw new ServiceException("手機(jī)號(hào)為空"); } // 判斷是否已經(jīng)發(fā)送過 String redisCode = redisCache.getCacheObject(Constants.HEAD + phone); if (!StringUtils.isEmpty(redisCode)) { long time = Long.parseLong(redisCode.split("_")[1]); if (System.currentTimeMillis() - time < leastTime) { throw new ServiceException("發(fā)送頻率過高"); } } String code = getSixBitCode(); // 生成新的驗(yàn)證碼 //存儲(chǔ) phone->code redisCache.setCacheObject(Constants.HEAD + phone, code + "_" + System.currentTimeMillis(), smsComponent.getTimeout(), TimeUnit.MINUTES); Integer minute = leastTime / 60 / 1000; //分鐘 smsComponent.sendCode(phone, code, minute.toString()); return "已發(fā)送驗(yàn)證碼 " + phone; } /** * 獲取6位驗(yàn)證碼 */ private String getSixBitCode() { //隨機(jī)數(shù) StringBuilder sb = new StringBuilder(); Random rand = new Random(); for (int i = 0; i < 6; i++) { sb.append(rand.nextInt(10)); } return sb.toString(); } /** * 校驗(yàn)驗(yàn)證碼 */ @Override public boolean checkCode(String phone, String code) { String redisCode = redisCache.getCacheObject(Constants.HEAD + phone); if (StringUtils.isEmpty(redisCode)) { throw new ServiceException("驗(yàn)證碼失效"); } if (!StringUtils.equals(redisCode.split("_")[0], code)) { throw new ServiceException("驗(yàn)證碼錯(cuò)誤"); } else { redisCache.deleteObject(Constants.HEAD + phone); return true; } } }
其中Constant.HEAD為自己定義的前綴,便于進(jìn)行區(qū)分,自行設(shè)置
public static final String HEAD = "sms:code:";
最后根據(jù)具體情況編寫編寫Controller層代碼實(shí)現(xiàn)調(diào)用。
調(diào)用時(shí),我們只需要獲取用戶輸入的電話參數(shù)即可,模板中的第二個(gè)參數(shù)時(shí)間范圍,我們自己設(shè)置好就行。
// 獲取用戶電話,調(diào)用發(fā)送短信接口 String msg = smsService.sendCode(sysUser.getPhonenumber(), 5 * 60 * 1000);
至此就可以在前端界面的表單中填寫數(shù)據(jù),或者在微信小程序里面發(fā)送短信了 ,在微信小程序中使用短信服務(wù)的話,要在后端代碼中把微信小程序的appid,Secret等參數(shù)配置好才能正常調(diào)用。
到此這篇關(guān)于SpringBoot項(xiàng)目中使用騰訊云發(fā)送短信的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot 騰訊云發(fā)送短信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解java中反射機(jī)制(含數(shù)組參數(shù))
這篇文章主要介紹了詳解java中反射機(jī)制(含數(shù)組參數(shù))的相關(guān)資料,希望通過本文能幫助到大家,讓大家理解掌握這部分內(nèi)容,需要的朋友可以參考下2017-10-10springmvc下實(shí)現(xiàn)登錄驗(yàn)證碼功能示例
本篇文章主要介紹了springmvc下實(shí)現(xiàn)登錄驗(yàn)證碼功能示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-02-02IDEA配置MAVEN本地倉(cāng)庫(kù)的實(shí)現(xiàn)步驟
本文主要介紹了IDEA配置MAVEN本地倉(cāng)庫(kù)的實(shí)現(xiàn)步驟,將詳細(xì)介紹如何配置Maven環(huán)境變量,Maven配置文件,可以輕松地設(shè)置和配置MAVEN本地倉(cāng)庫(kù),以便在IDEA中享受更高效的開發(fā)體驗(yàn)2023-08-08Java的Hibernate框架數(shù)據(jù)庫(kù)操作中鎖的使用和查詢類型
這篇文章主要介紹了Java的Hibernate框架數(shù)據(jù)庫(kù)操作中鎖的使用和查詢類型,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2016-01-01詳解Java中IO字節(jié)流基本操作(復(fù)制文件)并測(cè)試性能
這篇文章主要介紹了Java中IO字節(jié)流基本操作(復(fù)制文件)并測(cè)試性能,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04MyBatis-Plus?updateById更新不了空字符串或null的解決方法
本文主要介紹了MyBatis-Plus?updateById更新不了空字符串或null的解決方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03