最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot項目中使用騰訊云發(fā)送短信的實現(xiàn)

 更新時間:2023年04月19日 09:06:10   作者:onlywishes  
本文主要介紹了SpringBoot項目中使用騰訊云發(fā)送短信的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

在一些項目中總會不可避免的要用到短信服務(wù),比如發(fā)送驗證碼等,那么如何進行短信的發(fā)送呢,我們這就來捋一捋,我這里采用的是騰訊云的短信服務(wù)。其他的云服務(wù)也大致一樣。

第一步、申請騰訊云的短信服務(wù)并配置基本信息

首先進入騰訊云的短信服務(wù)界面?zhèn)魉烷T

https://console.cloud.tencent.com/smsv2

如上圖所示,我們會看到要我們申請開通短信服務(wù),開通后它會免費送我們100條國內(nèi)短信。

接下來我們就要進行相關(guān)的配置,首先進行創(chuàng)建簽名,按照要求填寫就行。

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

創(chuàng)建正文模板我們可以選擇使用標(biāo)準(zhǔn)模板。

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

第二步、我們可以在API Explore中進行一下測試

測試前我們要首先找一下短信應(yīng)用的APPID,如下圖

填寫完信息后點擊發(fā)起調(diào)用即可將短信發(fā)送到對應(yīng)的手機上。

之后在程序代碼中進行調(diào)用,我們進行配置的參數(shù)和表單中的參數(shù)是一樣的,只是多了secretID,secretKey。

第三步、安裝java的SDK

在項目添加 Maven 依賴項,只需在 pom.xml 中找到<dependencies>標(biāo)簽,在里面添加以下依賴項即可。

<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)站查看詳細(xì)說明:傳送

第四步、在項目中編寫代碼,調(diào)用接口

以下是一些必要步驟

首先在項目yml文件中配置一些必要的參數(shù)信息,避免硬編碼,便于維護。

sms:
  sdkAppId: 這里輸入短信應(yīng)用id
  secretId: 這里輸入secretID
  secretKey: 這里輸入key
  signName: 這里輸入短信簽名
  templateCodeId: 驗證碼模板id,有多個模板可以配置多個參數(shù)
  timeout: 配置RedisCache過期時間

配置好參數(shù)后,我們就要在程序中編寫代碼進行操作。

首先可以編寫一個發(fā)送短息的組件代碼SmsComponent,在里面完成獲取SmsClient客戶端,以及對表單參數(shù)進行設(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() {
 
        // 實例化一個認(rèn)證對象,入?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è)置參數(shù)
        req.setPhoneNumberSet(phoneNumberSet);    
        req.setSignName(signName);
        req.setTemplateId(templateId);
        //模板內(nèi)容的參數(shù)有幾個就設(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的實例,與請求對象對應(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  給手機號發(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ū)分,自行設(shè)置

public static final String HEAD = "sms:code:";

最后根據(jù)具體情況編寫編寫Controller層代碼實現(xiàn)調(diào)用。

調(diào)用時,我們只需要獲取用戶輸入的電話參數(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項目中使用騰訊云發(fā)送短信的實現(xiàn)的文章就介紹到這了,更多相關(guān)SpringBoot 騰訊云發(fā)送短信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java虛擬機原理:Class字節(jié)碼二進制文件分析

    java虛擬機原理:Class字節(jié)碼二進制文件分析

    class文件全名稱為Java class文件,主要在平臺無關(guān)性和網(wǎng)絡(luò)移動性方面使Java更適合網(wǎng)絡(luò)。它在平臺無關(guān)性方面的任務(wù)是:為Java程序提供獨立于底層主機平臺的二進制形式的服務(wù)。下面我們來詳細(xì)解讀下它吧
    2021-09-09
  • Mybatis逆向工程運行代碼實例

    Mybatis逆向工程運行代碼實例

    這篇文章主要介紹了Mybatis逆向工程運行代碼實例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • 用SpringMVC編寫一個HelloWorld的詳細(xì)過程

    用SpringMVC編寫一個HelloWorld的詳細(xì)過程

    SpringMVC是Spring的一個后續(xù)產(chǎn)品,是Spring的一個子項目<BR>SpringMVC?是?Spring?為表述層開發(fā)提供的一整套完備的解決方案,本文我們將用SpringMVC編寫一個HelloWorld,文中有詳細(xì)的編寫過程,需要的朋友可以參考下
    2023-08-08
  • Java的Spring框架下的AOP編程模式示例

    Java的Spring框架下的AOP編程模式示例

    這篇文章主要介紹了Java的Spring框架下的AOP編程模式示例,文中分別講到了基于XML和基于@AspectJ的自定義方式,需要的朋友可以參考下
    2015-12-12
  • JAVA隨機打亂數(shù)組順序的方法

    JAVA隨機打亂數(shù)組順序的方法

    這篇文章主要介紹了JAVA隨機打亂數(shù)組順序的方法,包含了隨機數(shù)的應(yīng)用及數(shù)組的排序等操作,是Java操作數(shù)組的典型應(yīng)用,需要的朋友可以參考下
    2014-11-11
  • Java中的@Builder注解問題詳解

    Java中的@Builder注解問題詳解

    這篇文章主要介紹了Java中的@Builder注解詳解,@Builder 注解的其中一個大坑會導(dǎo)致默認(rèn)值失效,這是使用此注解出現(xiàn)的一個問題,總的來說,不推薦再使用 @Builder 注解,接下來講重點介紹其原因和替代方案,需要的朋友可以參考下
    2023-10-10
  • maven打包zip包含bin下啟動腳本的完整代碼

    maven打包zip包含bin下啟動腳本的完整代碼

    這篇文章主要介紹了maven打包zip包含bin下啟動腳本,本文給大家講解的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10
  • Java源碼角度分析HashMap用法

    Java源碼角度分析HashMap用法

    這篇文章主要介紹了Java源碼角度分析HashMap用法,具有一定借鑒價值,需要的朋友可以參考下
    2018-01-01
  • java生成圖片驗證碼功能

    java生成圖片驗證碼功能

    最近在用ssm框架做一個管理系統(tǒng),做到登錄驗證時,需要實現(xiàn)圖片驗證碼功能,今天小編給大家分享基于java制作的圖片驗證碼功能,感興趣的朋友一起看看吧
    2019-12-12
  • MyBatis-Plus中實現(xiàn)自定義復(fù)雜排序邏輯的詳細(xì)步驟

    MyBatis-Plus中實現(xiàn)自定義復(fù)雜排序邏輯的詳細(xì)步驟

    這篇文章主要介紹了MyBatis-Plus中實現(xiàn)自定義復(fù)雜排序邏輯,通過使用MyBatis-Plus的QueryWrapper和SQL原始片段,我們可以靈活地實現(xiàn)復(fù)雜的數(shù)據(jù)排序邏輯,這種方法尤其適用于需要對數(shù)據(jù)進行特定規(guī)則排序的場景,需要的朋友可以參考下
    2024-07-07

最新評論

涟水县| 沅陵县| 葵青区| 民乐县| 扬中市| 波密县| 略阳县| 新巴尔虎右旗| 西峡县| 海原县| 涞源县| 邮箱| 五河县| 锡林浩特市| 曲麻莱县| 马公市| 治多县| 金山区| 岢岚县| 通道| 太和县| 九龙城区| 石首市| 新疆| 西乡县| 伊春市| 西乡县| 怀来县| 濮阳市| 理塘县| 容城县| 鸡西市| 浏阳市| 遵义县| 定襄县| 墨脱县| 梁平县| 平南县| 海原县| 巴中市| 孝感市|