SpringBoot集成阿里云短信的實戰(zhàn)指南
在SpringBoot項目中集成阿里云短信服務(wù),核心是完成一系列前置申請,并調(diào)用其官方SDK發(fā)送短信。整個流程從前置準(zhǔn)備到代碼集成,步驟清晰。
阿里云短信服務(wù)概述
阿里云短信服務(wù)提供高并發(fā)、安全的全球短信發(fā)送能力,支持驗證碼、通知、營銷等場景。其主要特點如下:
| 特性維度 | 具體說明 |
|---|---|
| 核心能力 | 提供三網(wǎng)合一通道,秒級可達(dá),支持國內(nèi)及全球200多個國家/地區(qū)。 |
| 安全與管控 | 基于阿里云賬戶與RAM權(quán)限管理,支持設(shè)置日發(fā)送量上限、單用戶頻次閾值,并具備驗證碼防盜刷監(jiān)控。 |
| 計費模式 | 采用短信套餐包優(yōu)先抵扣,超出后按量計費的模式。國內(nèi)驗證碼/通知短信低至0.045元/條起。 |
| 使用限制 | 僅支持企業(yè)認(rèn)證賬號;發(fā)送前需完成資質(zhì)、簽名、模板的申請與審核;對發(fā)送頻率有嚴(yán)格限制(例如驗證碼同一號碼最多1條/分鐘)。 |
集成前必須完成的控制臺配置
編寫代碼前,你必須在阿里云控制臺 完成一系列配置,這是短信發(fā)送的前提。
1.開通服務(wù)與購買資源包
- 完成企業(yè)實名認(rèn)證并登錄短信服務(wù)控制臺開通服務(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。切勿直接使用主賬號的AccessKey。
3.申請短信簽名與模板
- 簽名:在“國內(nèi)消息”或“國際/港澳臺消息”菜單下申請。簽名是顯示在短信開頭的標(biāo)識,如
【企業(yè)名稱】,用于標(biāo)識發(fā)送方。審核通常需2小時。 - 模板:短信內(nèi)容模板,支持變量。例如驗證碼模板:“您的驗證碼為:$[code],5分鐘內(nèi)有效。”模板審核同樣約需2小時。
- 重要提示:簽名和模板均審核通過后方可使用。國內(nèi)簽名還需完成運營商實名報備(需7-15個工作日),報備成功前發(fā)送可能失敗。
SpringBoot項目集成詳細(xì)步驟
完成控制臺配置后,即可在SpringBoot項目中集成。
第1步:添加Maven依賴 在項目的pom.xml中添加阿里云短信服務(wù)SDK的依賴。
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>dysmsapi20180501</artifactId>
<version>2.0.24</version> <!-- 請使用Maven倉庫中的最新版本 -->
</dependency>
第2步:配置應(yīng)用參數(shù) 在application.yml或application.properties中配置必要的參數(shù)。
# application.yml 配置示例
aliyun:
sms:
# 從控制臺獲取的AccessKey信息
access-key-id: your-access-key-id
access-key-secret: your-access-key-secret
# 短信服務(wù)接入點(Endpoint),國內(nèi)一般為 dysmsapi.aliyuncs.com
endpoint: dysmsapi.aliyuncs.com
# 控制臺申請并通過審核的簽名名稱(無需加【】)
sign-name: 你的簽名
# 控制臺申請并通過審核的模板CODE
template-code: SMS_123456789
第3步:創(chuàng)建配置類與Service 創(chuàng)建一個配置類來初始化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實例。
* 該Bean可用于整個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ā)送短信驗證碼
* @param phoneNumber 目標(biāo)手機號(國內(nèi)號碼需帶國際區(qū)號86)
* @param templateParam 模板變量對應(yīng)的JSON字符串,如:{"code":"123456"}
* @return 是否發(fā)送成功
*/
public boolean sendSms(String phoneNumber, String templateParam) {
try {
SendMessageWithTemplateRequest request = new SendMessageWithTemplateRequest()
.setTo(phoneNumber) // 接收方手機號
.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)建一個簡單的控制器來提供發(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) {
// 生成隨機驗證碼(示例)
String code = String.valueOf((int)((Math.random() * 9 + 1) * 100000));
// 構(gòu)造模板參數(shù)(必須與申請模板時的變量名一致)
String templateParam = "{\"code\":\"" + code + "\"}";
boolean isSuccess = smsService.sendSms(phone, templateParam);
if (isSuccess) {
// 在實際業(yè)務(wù)中,此處應(yīng)將驗證碼與手機號關(guān)聯(lián)并存入緩存(如Redis),設(shè)置有效期
return "驗證碼發(fā)送成功!";
} else {
return "驗證碼發(fā)送失敗,請稍后重試。";
}
}
}
總結(jié)
按照上述步驟,即可在SpringBoot項目中集成阿里云短信。最后,有幾個關(guān)鍵點需要注意:
- 資質(zhì)與審核是關(guān)鍵前提:務(wù)必確保使用企業(yè)認(rèn)證賬號,并提前完成簽名、模板的申請和審核。國內(nèi)簽名還需要等待運營商報備成功,否則發(fā)送會失敗。
- 安全第一:AccessKey相當(dāng)于賬號密碼,務(wù)必通過環(huán)境變量或配置服務(wù)器管理,切忌硬編碼在代碼中提交至版本庫。
- 關(guān)注限制與成本:嚴(yán)格遵守發(fā)送頻率限制(如1條/分鐘/號)。發(fā)送測試短信也會產(chǎn)生費用,請注意賬戶余額。
- 生產(chǎn)環(huán)境建議:應(yīng)考慮異步發(fā)送、失敗重試、發(fā)送狀態(tài)回執(zhí)(SmsReport)接收等機制以提升穩(wěn)定性和可靠性。
到此這篇關(guān)于SpringBoot集成阿里云短信的實戰(zhàn)指南的文章就介紹到這了,更多相關(guān)SpringBoot集成阿里云短信內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Java在Excel中創(chuàng)建數(shù)據(jù)透視表
在處理銷售數(shù)據(jù)、財務(wù)報表或運營指標(biāo)時,數(shù)據(jù)透視表是快速匯總和分析大量數(shù)據(jù)的強大工具,通過 Java 自動化這個過程可以實現(xiàn)定期報告的自動生成,大幅提高工作效率,本文將詳細(xì)介紹如何使用 Java 在 Excel 工作簿中創(chuàng)建數(shù)據(jù)透視表,需要的朋友可以參考下2026-03-03
JavaMail發(fā)送(帶圖片和附件)和接收郵件實現(xiàn)詳解(四)
這篇文章主要為大家詳細(xì)介紹了JavaMail帶圖片和附件的發(fā)送和接收郵件實現(xiàn),具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-10-10
springboot整合Mybatis-plus的實現(xiàn)
這篇文章主要介紹了springboot整合Mybatis-plus的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09

