SpringBoot集成阿里云短信的實(shí)戰(zhàn)指南
在SpringBoot項(xiàng)目中集成阿里云短信服務(wù),核心是完成一系列前置申請(qǐng),并調(diào)用其官方SDK發(fā)送短信。整個(gè)流程從前置準(zhǔn)備到代碼集成,步驟清晰。
阿里云短信服務(wù)概述
阿里云短信服務(wù)提供高并發(fā)、安全的全球短信發(fā)送能力,支持驗(yàn)證碼、通知、營銷等場景。其主要特點(diǎn)如下:
| 特性維度 | 具體說明 |
|---|---|
| 核心能力 | 提供三網(wǎng)合一通道,秒級(jí)可達(dá),支持國內(nèi)及全球200多個(gè)國家/地區(qū)。 |
| 安全與管控 | 基于阿里云賬戶與RAM權(quán)限管理,支持設(shè)置日發(fā)送量上限、單用戶頻次閾值,并具備驗(yàn)證碼防盜刷監(jiān)控。 |
| 計(jì)費(fèi)模式 | 采用短信套餐包優(yōu)先抵扣,超出后按量計(jì)費(fèi)的模式。國內(nèi)驗(yàn)證碼/通知短信低至0.045元/條起。 |
| 使用限制 | 僅支持企業(yè)認(rèn)證賬號(hào);發(fā)送前需完成資質(zhì)、簽名、模板的申請(qǐng)與審核;對(duì)發(fā)送頻率有嚴(yán)格限制(例如驗(yàn)證碼同一號(hào)碼最多1條/分鐘)。 |
集成前必須完成的控制臺(tái)配置
編寫代碼前,你必須在阿里云控制臺(tái) 完成一系列配置,這是短信發(fā)送的前提。
1.開通服務(wù)與購買資源包
- 完成企業(yè)實(shí)名認(rèn)證并登錄短信服務(wù)控制臺(tái)開通服務(wù)。
- 根據(jù)業(yè)務(wù)需要(國內(nèi)或國際)購買短信套餐包。
2.創(chuàng)建AccessKey
- 為安全起見,建議為應(yīng)用創(chuàng)建RAM子用戶并授權(quán)
AliyunDysmsFullAccess策略。 - 為該子用戶創(chuàng)建AccessKey(AccessKey ID和AccessKey Secret),后續(xù)代碼將使用它調(diào)用API。切勿直接使用主賬號(hào)的AccessKey。
3.申請(qǐng)短信簽名與模板
- 簽名:在“國內(nèi)消息”或“國際/港澳臺(tái)消息”菜單下申請(qǐng)。簽名是顯示在短信開頭的標(biāo)識(shí),如
【企業(yè)名稱】,用于標(biāo)識(shí)發(fā)送方。審核通常需2小時(shí)。 - 模板:短信內(nèi)容模板,支持變量。例如驗(yàn)證碼模板:“您的驗(yàn)證碼為:$[code],5分鐘內(nèi)有效。”模板審核同樣約需2小時(shí)。
- 重要提示:簽名和模板均審核通過后方可使用。國內(nèi)簽名還需完成運(yùn)營商實(shí)名報(bào)備(需7-15個(gè)工作日),報(bào)備成功前發(fā)送可能失敗。
SpringBoot項(xiàng)目集成詳細(xì)步驟
完成控制臺(tái)配置后,即可在SpringBoot項(xiàng)目中集成。
第1步:添加Maven依賴 在項(xiàng)目的pom.xml中添加阿里云短信服務(wù)SDK的依賴。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20180501</artifactId>
<version>2.0.24</version> <!-- 請(qǐng)使用Maven倉庫中的最新版本 -->
</dependency>
第2步:配置應(yīng)用參數(shù) 在application.yml或application.properties中配置必要的參數(shù)。
# application.yml 配置示例
aliyun:
sms:
# 從控制臺(tái)獲取的AccessKey信息
access-key-id: your-access-key-id
access-key-secret: your-access-key-secret
# 短信服務(wù)接入點(diǎn)(Endpoint),國內(nèi)一般為 dysmsapi.aliyuncs.com
endpoint: dysmsapi.aliyuncs.com
# 控制臺(tái)申請(qǐng)并通過審核的簽名名稱(無需加【】)
sign-name: 你的簽名
# 控制臺(tái)申請(qǐng)并通過審核的模板CODE
template-code: SMS_123456789
第3步:創(chuàng)建配置類與Service 創(chuàng)建一個(gè)配置類來初始化SDK客戶端,并編寫發(fā)送短信的服務(wù)類。
import com.aliyun.dysmsapi20180501.Client;
import com.aliyun.teaopenapi.models.Config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;
@Configuration
public class AliyunSmsConfig {
@Value("${aliyun.sms.access-key-id}")
private String accessKeyId;
@Value("${aliyun.sms.access-key-secret}")
private String accessKeySecret;
@Value("${aliyun.sms.endpoint}")
private String endpoint;
/**
* 創(chuàng)建并返回阿里云短信服務(wù)的Client實(shí)例。
* 該Bean可用于整個(gè)Spring容器。
*/
@Bean
public Client createClient() throws Exception {
Config config = new Config()
.setAccessKeyId(accessKeyId)
.setAccessKeySecret(accessKeySecret);
config.endpoint = endpoint;
return new Client(config);
}
}
import com.aliyun.dysmsapi20180501.Client;
import com.aliyun.dysmsapi20180501.models.SendMessageWithTemplateRequest;
import com.aliyun.dysmsapi20180501.models.SendMessageWithTemplateResponse;
import com.aliyun.teautil.models.RuntimeOptions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@Service
public class SmsService {
@Autowired
private Client smsClient;
@Value("${aliyun.sms.sign-name}")
private String signName;
@Value("${aliyun.sms.template-code}")
private String templateCode;
/**
* 發(fā)送短信驗(yàn)證碼
* @param phoneNumber 目標(biāo)手機(jī)號(hào)(國內(nèi)號(hào)碼需帶國際區(qū)號(hào)86)
* @param templateParam 模板變量對(duì)應(yīng)的JSON字符串,如:{"code":"123456"}
* @return 是否發(fā)送成功
*/
public boolean sendSms(String phoneNumber, String templateParam) {
try {
SendMessageWithTemplateRequest request = new SendMessageWithTemplateRequest()
.setTo(phoneNumber) // 接收方手機(jī)號(hào)
.setSignName(signName) // 短信簽名
.setTemplateCode(templateCode) // 短信模板CODE
.setTemplateParam(templateParam); // 模板變量JSON
RuntimeOptions runtime = new RuntimeOptions();
SendMessageWithTemplateResponse response = smsClient.sendMessageWithTemplateWithOptions(request, runtime);
// 根據(jù)響應(yīng)判斷是否成功,"OK"表示成功[citation:4]
return "OK".equals(response.getBody().getResponseCode());
} catch (Exception e) {
// 此處應(yīng)記錄日志,并根據(jù)業(yè)務(wù)需要進(jìn)行異常處理
e.printStackTrace();
return false;
}
}
}
第4步:在Controller中調(diào)用 創(chuàng)建一個(gè)簡單的控制器來提供發(fā)送短信的HTTP接口。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class SmsController {
@Autowired
private SmsService smsService;
@GetMapping("/sendCode")
public String sendVerificationCode(@RequestParam String phone) {
// 生成隨機(jī)驗(yàn)證碼(示例)
String code = String.valueOf((int)((Math.random() * 9 + 1) * 100000));
// 構(gòu)造模板參數(shù)(必須與申請(qǐng)模板時(shí)的變量名一致)
String templateParam = "{\"code\":\"" + code + "\"}";
boolean isSuccess = smsService.sendSms(phone, templateParam);
if (isSuccess) {
// 在實(shí)際業(yè)務(wù)中,此處應(yīng)將驗(yàn)證碼與手機(jī)號(hào)關(guān)聯(lián)并存入緩存(如Redis),設(shè)置有效期
return "驗(yàn)證碼發(fā)送成功!";
} else {
return "驗(yàn)證碼發(fā)送失敗,請(qǐng)稍后重試。";
}
}
}
總結(jié)
按照上述步驟,即可在SpringBoot項(xiàng)目中集成阿里云短信。最后,有幾個(gè)關(guān)鍵點(diǎn)需要注意:
- 資質(zhì)與審核是關(guān)鍵前提:務(wù)必確保使用企業(yè)認(rèn)證賬號(hào),并提前完成簽名、模板的申請(qǐng)和審核。國內(nèi)簽名還需要等待運(yùn)營商報(bào)備成功,否則發(fā)送會(huì)失敗。
- 安全第一:AccessKey相當(dāng)于賬號(hào)密碼,務(wù)必通過環(huán)境變量或配置服務(wù)器管理,切忌硬編碼在代碼中提交至版本庫。
- 關(guān)注限制與成本:嚴(yán)格遵守發(fā)送頻率限制(如1條/分鐘/號(hào))。發(fā)送測試短信也會(huì)產(chǎn)生費(fèi)用,請(qǐng)注意賬戶余額。
- 生產(chǎn)環(huán)境建議:應(yīng)考慮異步發(fā)送、失敗重試、發(fā)送狀態(tài)回執(zhí)(SmsReport)接收等機(jī)制以提升穩(wěn)定性和可靠性。
到此這篇關(guān)于SpringBoot集成阿里云短信的實(shí)戰(zhàn)指南的文章就介紹到這了,更多相關(guān)SpringBoot集成阿里云短信內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Java在Excel中創(chuàng)建數(shù)據(jù)透視表
在處理銷售數(shù)據(jù)、財(cái)務(wù)報(bào)表或運(yùn)營指標(biāo)時(shí),數(shù)據(jù)透視表是快速匯總和分析大量數(shù)據(jù)的強(qiáng)大工具,通過 Java 自動(dòng)化這個(gè)過程可以實(shí)現(xiàn)定期報(bào)告的自動(dòng)生成,大幅提高工作效率,本文將詳細(xì)介紹如何使用 Java 在 Excel 工作簿中創(chuàng)建數(shù)據(jù)透視表,需要的朋友可以參考下2026-03-03
idea沒法識(shí)別springboot項(xiàng)目的原因解決及辦法
IDEA無法識(shí)別Spring Boot項(xiàng)目可能是由于Lombok依賴未正確解析所致,原pom.xml中未指定Lombok版本號(hào),導(dǎo)致依賴下載失敗,下面就來詳細(xì)的介紹一下解決方法,感興趣的可以了解一下2025-09-09
JavaMail發(fā)送(帶圖片和附件)和接收郵件實(shí)現(xiàn)詳解(四)
這篇文章主要為大家詳細(xì)介紹了JavaMail帶圖片和附件的發(fā)送和接收郵件實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-10-10
springboot整合Mybatis-plus的實(shí)現(xiàn)
這篇文章主要介紹了springboot整合Mybatis-plus的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09
Java?pdf文件書簽承前縮放驗(yàn)證的設(shè)置方法
很多朋友不知道是什么是書簽承前縮放,簡單說就是可以任意改變當(dāng)前pdf文檔縮放比例,點(diǎn)擊書簽后不影響其縮放比率,本文給大家介紹下Java?pdf文件書簽承前縮放驗(yàn)證的設(shè)置方法,感興趣的朋友一起看看吧2022-02-02
Java邏輯運(yùn)算符短路求值的優(yōu)雅實(shí)踐指南
本文探討了Java邏輯運(yùn)算符短路求值(Short-circuit?Evaluation)的巧妙應(yīng)用,通過一個(gè)用戶日志清理場景,展示了如何利用&&運(yùn)算符的特性優(yōu)化代碼,希望對(duì)大家有所幫助2026-05-05

