SpringBoot項目中使用騰訊云發(fā)送短信的實現(xiàn)
在一些項目中總會不可避免的要用到短信服務,比如發(fā)送驗證碼等,那么如何進行短信的發(fā)送呢,我們這就來捋一捋,我這里采用的是騰訊云的短信服務。其他的云服務也大致一樣。
第一步、申請騰訊云的短信服務并配置基本信息
首先進入騰訊云的短信服務界面?zhèn)魉烷T
https://console.cloud.tencent.com/smsv2


如上圖所示,我們會看到要我們申請開通短信服務,開通后它會免費送我們100條國內(nèi)短信。
接下來我們就要進行相關的配置,首先進行創(chuàng)建簽名,按照要求填寫就行。


這步之后創(chuàng)建短信正文的模板

創(chuàng)建正文模板我們可以選擇使用標準模板。

配置完畢后就等待審核,審核完成后我們就可以使用接口發(fā)送短信了。

第二步、我們可以在API Explore中進行一下測試
測試前我們要首先找一下短信應用的APPID,如下圖




填寫完信息后點擊發(fā)起調(diào)用即可將短信發(fā)送到對應的手機上。
之后在程序代碼中進行調(diào)用,我們進行配置的參數(shù)和表單中的參數(shù)是一樣的,只是多了secretID,secretKey。
第三步、安裝java的SDK
在項目添加 Maven 依賴項,只需在 pom.xml 中找到<dependencies>標簽,在里面添加以下依賴項即可。
<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. -->
<!-- 請到https://search.maven.org/search?q=tencentcloud-sdk-java查詢所有版本,最新版本如下 -->
<version>3.1.322</version>
</dependency>若是用其他語言進行配置,可進入網(wǎng)站查看詳細說明:傳送
第四步、在項目中編寫代碼,調(diào)用接口
以下是一些必要步驟
首先在項目yml文件中配置一些必要的參數(shù)信息,避免硬編碼,便于維護。
sms: sdkAppId: 這里輸入短信應用id secretId: 這里輸入secretID secretKey: 這里輸入key signName: 這里輸入短信簽名 templateCodeId: 驗證碼模板id,有多個模板可以配置多個參數(shù) timeout: 配置RedisCache過期時間

配置好參數(shù)后,我們就要在程序中編寫代碼進行操作。
首先可以編寫一個發(fā)送短息的組件代碼SmsComponent,在里面完成獲取SmsClient客戶端,以及對表單參數(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() {
// 實例化一個認證對象,入?yún)⑿枰獋魅腧v訊云賬戶secretId,secretKey,此處還需注意密鑰對的保密
// 密鑰可前往https://console.cloud.tencent.com/cam/capi網(wǎng)站進行獲取
Credential cred = new Credential(secretId, secretKey);
// 實例化一個http選項,可選的,沒有特殊需求可以跳過
HttpProfile httpProfile = new HttpProfile();
//這個setEndpoint可以省略的
httpProfile.setEndpoint("sms.tencentcloudapi.com");
// 實例化一個client選項,可選的,沒有特殊需求可以跳過
ClientProfile clientProfile = new ClientProfile();
clientProfile.setHttpProfile(httpProfile);
// 實例化要請求產(chǎn)品的client對象,clientProfile是可選的
return new SmsClient(cred, "ap-beijing", clientProfile);
}
/**
* 獲取req請求 2個參數(shù),就是短息模板是兩個參數(shù),根據(jù)具體情況改變
*
* @param phone
* @param code 參數(shù)1,這里是驗證碼,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ù)
req.setPhoneNumberSet(phoneNumberSet);
req.setSignName(signName);
req.setTemplateId(templateId);
//模板內(nèi)容的參數(shù)有幾個就設置幾個,我這里是兩個
String[] templateParamSet = {code,param2};
req.setTemplateParamSet(templateParamSet);
return req; // 返回請求參數(shù)內(nèi)容
}
/**
* 發(fā)送驗證碼
*
* @param phone
* @param code
* @param
* @return
*/
public void sendCode(String phone, String code, String param2) {
// 返回的resp是一個SendSmsResponse的實例,與請求對象對應
SendSmsResponse resp;
try {
resp = getClient().SendSms(getReqTwo(phone, code,param2 ,templateCodeId)); // 模板id是自己設置好的
log.info(SendSmsResponse.toJsonString(resp)); // 把返回信息輸入到日志中
} catch (TencentCloudSDKException e) {
e.printStackTrace();
}
}
}然后可以在service層創(chuàng)建發(fā)送短信的接口
public interface ISmsService {
/**
* @param phone 給手機號發(fā)送驗證碼
* @param leastTime 短信有效時間
* @return
*/
public String sendCode( String phone,int leastTime);
/**
* 校驗驗證碼
*/
boolean checkCode(String phone, String code);
}然后實現(xiàn)發(fā)送短信的接口,同時我們要自己寫生成驗證碼的函數(shù)來確保每次發(fā)送的6位數(shù)字是隨機的,并且實現(xià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 給手機號發(fā)送驗證碼
* @param leastTime 短信有效時間
* @return
*/
public String sendCode(String phone, int leastTime) {
if (phone == null || phone.length() == 0) {
throw new ServiceException("手機號為空");
}
// 判斷是否已經(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(); // 生成新的驗證碼
//存儲 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ā)送驗證碼 " + phone;
}
/**
* 獲取6位驗證碼
*/
private String getSixBitCode() {
//隨機數(shù)
StringBuilder sb = new StringBuilder();
Random rand = new Random();
for (int i = 0; i < 6; i++) {
sb.append(rand.nextInt(10));
}
return sb.toString();
}
/**
* 校驗驗證碼
*/
@Override
public boolean checkCode(String phone, String code) {
String redisCode = redisCache.getCacheObject(Constants.HEAD + phone);
if (StringUtils.isEmpty(redisCode)) {
throw new ServiceException("驗證碼失效");
}
if (!StringUtils.equals(redisCode.split("_")[0], code)) {
throw new ServiceException("驗證碼錯誤");
} else {
redisCache.deleteObject(Constants.HEAD + phone);
return true;
}
}
}其中Constant.HEAD為自己定義的前綴,便于進行區(qū)分,自行設置
public static final String HEAD = "sms:code:";
最后根據(jù)具體情況編寫編寫Controller層代碼實現(xiàn)調(diào)用。
調(diào)用時,我們只需要獲取用戶輸入的電話參數(shù)即可,模板中的第二個參數(shù)時間范圍,我們自己設置好就行。
// 獲取用戶電話,調(diào)用發(fā)送短信接口 String msg = smsService.sendCode(sysUser.getPhonenumber(), 5 * 60 * 1000);
至此就可以在前端界面的表單中填寫數(shù)據(jù),或者在微信小程序里面發(fā)送短信了 ,在微信小程序中使用短信服務的話,要在后端代碼中把微信小程序的appid,Secret等參數(shù)配置好才能正常調(diào)用。
到此這篇關于SpringBoot項目中使用騰訊云發(fā)送短信的實現(xiàn)的文章就介紹到這了,更多相關SpringBoot 騰訊云發(fā)送短信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Java的Hibernate框架數(shù)據(jù)庫操作中鎖的使用和查詢類型
這篇文章主要介紹了Java的Hibernate框架數(shù)據(jù)庫操作中鎖的使用和查詢類型,Hibernate是Java的SSH三大web開發(fā)框架之一,需要的朋友可以參考下2016-01-01
詳解Java中IO字節(jié)流基本操作(復制文件)并測試性能
這篇文章主要介紹了Java中IO字節(jié)流基本操作(復制文件)并測試性能,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-04-04
MyBatis-Plus?updateById更新不了空字符串或null的解決方法
本文主要介紹了MyBatis-Plus?updateById更新不了空字符串或null的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2023-03-03

