Spring Boot 整合 SMS4J:高效實現短信發送功能
作者:一安
在現代應用開發中,短信服務已成為用戶驗證、消息通知等場景的核心功能。SMS4J作為一款開源的短信服務整合框架,支持多廠商適配、統一API調用,極大簡化了短信發送的開發流程。本文將詳細介紹如何在Spring Boot項目中整合SMS4J,實現高效、可擴展的短信發送功能。
引言
在現代應用開發中,短信服務已成為用戶驗證、消息通知等場景的核心功能。SMS4J作為一款開源的短信服務整合框架,支持多廠商適配、統一API調用,極大簡化了短信發送的開發流程。
本文將詳細介紹如何在Spring Boot項目中整合SMS4J,實現高效、可擴展的短信發送功能。
簡介
圖片
SMS4J是一款基于Java的短信服務整合工具,旨在解決多廠商短信接口差異問題,提供統一的發送API。其核心優勢包括:
- 多廠商支持:已集成阿里云、騰訊云、華為云、百度云等主流短信服務商;
- 統一接口:無需關注各廠商接口細節,通過標準化
API即可實現短信發送; - 動態切換:支持根據業務場景動態切換短信服務商;
- 配置靈活:支持多渠道配置、模板管理、簽名管理等功能;
- 輕量級:無冗余依賴,易于集成到
Spring Boot等主流框架。
實現
添加依賴
<dependency>
<groupId>org.dromara.sms4j</groupId>
<artifactId>sms4j-spring-boot-starter</artifactId>
<version>最新版本</version>
</dependency>多廠商多配置
sms:
config-type: yaml
blends:
ali1:
supplier: alibaba
access-key-id: 你的AccessKeyId
access-key-secret: 你的AccessKeySecret
signature: 你的短信簽名
template-id: 你的模板ID
tencent1:
supplier: tencent
access-key-id: 你的SecretId
access-key-secret: 你的SecretKey
sdk-app-id: 你的SdkAppId
signature: 騰訊短信簽名
template-id: 你的模板ID發送短信
@RestController
@RequestMapping("/sms")
public class SmsController {
@GetMapping("/send")
public String sendSms() {
SmsFactory.getSmsBlend("ali1").sendMessage("13811110000", "123456");
return "發送成功";
}
}頻率限制
@Component
public class SmsRateLimiter {
private final StringRedisTemplate redisTemplate;
// 單手機號發送間隔(秒),根據服務商限制配置(如1分鐘=60秒)
private static final long SMS_INTERVAL_SECONDS = 60;
public SmsRateLimiter(StringRedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
/**
* 檢查手機號是否允許發送短信
* @param phone 手機號
* @returntrue-允許發送,false-頻率超限
*/
public boolean allowSend(String phone) {
String key = "sms:limit:" + phone;
// 檢查是否存在緩存(存在則表示在冷卻期內)
Boolean hasKey = redisTemplate.hasKey(key);
if (Boolean.TRUE.equals(hasKey)) {
returnfalse;
}
// 不存在則設置緩存,過期時間為間隔時間
redisTemplate.opsForValue().set(key, "1", SMS_INTERVAL_SECONDS, TimeUnit.SECONDS);
returntrue;
}
}業務層集成頻率控制:
@Service
public class SmsService {
private final SmsRateLimiter rateLimiter;
public SmsService(SmsRateLimiter rateLimiter) {
this.rateLimiter = rateLimiter;
}
public boolean sendLoginCode(String phone, String code) {
// 1. 檢查頻率限制
if (!rateLimiter.allowSend(phone)) {
System.out.println("手機號 " + phone + " 發送頻率超限,請稍后再試");
returnfalse;
}
// 2. 執行短信發送(省略具體發送邏輯)
try {
SmsBlend sms = SmsFactory.getSms();
SmsResponse response = sms.send(phone, "loginCode", new String[]{code, "5"});
return response.isSuccess();
} catch (Exception e) {
e.printStackTrace();
returnfalse;
}
}
}責任編輯:武曉燕
來源:
一安未來

































