SpringBoot3集成SMS4J實(shí)現(xiàn)短信+OA雙渠道消息發(fā)送
做后端業(yè)務(wù)開發(fā),短信發(fā)送是繞不開的基礎(chǔ)功能,但直接對(duì)接各家云廠商短信SDK,不僅配置繁瑣、業(yè)務(wù)耦合度高,換個(gè)服務(wù)商就要重構(gòu)大半代碼,純純費(fèi)力不討好。而且日常項(xiàng)目里,除了短信驗(yàn)證碼,OA系統(tǒng)消息通知也是高頻需求,單獨(dú)對(duì)接OA接口又要額外寫一套邏輯。最近用SpringBoot3做項(xiàng)目,直接上手了SMS4J這個(gè)開源工具,不僅適配SpringBoot3.x、一鍵切換多廠商短信,還能同步集成OA消息通知,一套工具搞定雙渠道發(fā)送。
一、項(xiàng)目環(huán)境與核心依賴
先確認(rèn)基礎(chǔ)環(huán)境,我這邊用的是SpringBoot 3.2.5、JDK17。
第一步先引入Maven核心依賴,直接在pom.xml中添加官方starter。
<!-- SMS4J SpringBoot3啟動(dòng)器 官方最新穩(wěn)定版3.3.5 -->
<dependency>
<groupId>org.dromara.sms4j</groupId>
<artifactId>sms4j-spring-boot-starter</artifactId>
<version>3.3.5</version>
</dependency>
<!-- SMS4J OA消息通知 -->
<dependency>
<groupId>org.dromara.sms4j</groupId>
<artifactId>sms4j-oa-core</artifactId>
<version>3.3.5</version>
</dependency>依賴引入后刷新Maven,等待下載完成即可,不用額外做依賴排除。
二、核心配置:短信+OA一體化配置
接下來是核心配置環(huán)節(jié),不用寫自定義配置類,直接在application.yml中同時(shí)配置短信和OA消息,一份配置文件管理雙渠道,切換廠商和OA地址只改配置,業(yè)務(wù)代碼零改動(dòng)。我以阿里云短信+通用OA通知為例,配置邏輯清晰易懂。
提前準(zhǔn)備好阿里云短信參數(shù):AccessKey、Secret、短信簽名、模板ID;OA相關(guān)參數(shù):OA接口地址、應(yīng)用密鑰、審批人/接收人標(biāo)識(shí),都是后臺(tái)可直接獲取的基礎(chǔ)參數(shù)。
spring:
application:
name: sms4j-demo
# SMS4J核心配置,3.3.5版本支持短信+OA雙配置
sms:
config-type: yaml
blends:
# 阿里云短信配置
aliyun:
supplier: alibaba
accessKeyId: 您的阿里云AccessKey
accessKeySecret: 您的阿里云Secret
signature: 短信簽名
templateId: SMS_215125134
templateName: code
requestUrl: dysmsapi.aliyuncs.com
oas:
oaDingTalkByYaml: # configId
isEnable: true # 表示該配置是否生效(默認(rèn)生效,false表示不生效)
supplier: ding_ding # 廠商標(biāo)識(shí)
tokenId: 您的accessKey # webhook 中的 access_token
sign: 您的sign # 安全設(shè)置在驗(yàn)簽?zāi)J较虏诺拿罔€,非驗(yàn)簽?zāi)J經(jīng)]有此值不管是新增騰訊云、華為云短信,還是調(diào)整OA對(duì)接參數(shù),都只需要在blends下新增或修改配置塊,業(yè)務(wù)邏輯完全不用動(dòng),多渠道切換和擴(kuò)展極其靈活,這也是SMS4J的核心優(yōu)勢(shì)。
三、代碼實(shí)現(xiàn):短信+OA雙發(fā)送接口
配置完成后直接寫業(yè)務(wù)代碼,SMS4J通過工廠類統(tǒng)一管理渠道實(shí)例,短信和OA發(fā)送調(diào)用邏輯高度一致,代碼極度簡(jiǎn)潔,適配登錄驗(yàn)證碼、業(yè)務(wù)審批通知等場(chǎng)景。
import cn.hutool.core.util.RandomUtil;
import org.dromara.oa.api.OaSender;
import org.dromara.oa.comm.entity.Request;
import org.dromara.oa.comm.entity.Response;
import org.dromara.oa.comm.enums.MessageType;
import org.dromara.oa.core.provider.factory.OaFactory;
import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.api.entity.SmsResponse;
import org.dromara.sms4j.core.factory.SmsFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
@RestController
@RequestMapping("/sms")
public class SmsController {
/**
* 通用短信驗(yàn)證碼發(fā)送接口
* @param phone 接收短信的手機(jī)號(hào)
* @return 發(fā)送結(jié)果反饋
*/
@GetMapping("/send/{phone}")
public String sendSmsCode(@PathVariable String phone) {
// 獲取對(duì)應(yīng)廠商標(biāo)識(shí)的短信實(shí)例,和yml配置一一對(duì)應(yīng)
SmsBlend smsBlend = SmsFactory.getSmsBlend("aliyun");
// 生成6位純數(shù)字驗(yàn)證碼,適配絕大多數(shù)驗(yàn)證碼場(chǎng)景
String code = RandomUtil.randomNumbers(6);
// 執(zhí)行短信發(fā)送,參數(shù)順序嚴(yán)格匹配短信模板變量順序
SmsResponse response = smsBlend.sendMessage(phone, code);
// 結(jié)果返回,開發(fā)階段可直接返回驗(yàn)證碼調(diào)試,生產(chǎn)環(huán)境建議隱藏
if (response.isSuccess()) {
return "短信發(fā)送成功,驗(yàn)證碼:" + code;
}
return "短信發(fā)送失敗,失敗原因:" + response.getData().toString();
}
/**
* 通用OA通知發(fā)送接口
* @param phone 接收通知的手機(jī)號(hào)
* @return 發(fā)送結(jié)果反饋
*/
@GetMapping("/send/oa/notice/{phone}")
public String sendOANotice(@PathVariable String phone) {
String configId = "oaDingTalkByYaml";
OaSender alarm = OaFactory.getSmsOaBlend(configId);
Request request = new Request();
ArrayList<String> phones = new ArrayList<>();
phones.add(phone);
// 支持通過手機(jī)號(hào)@
request.setPhoneList(phones);
// 支持@all
// request.setIsNoticeAll(true);
request.setContent("測(cè)試消息");
Response response = alarm.sender(request, MessageType.DING_TALK_TEXT);
// 結(jié)果返回
if (response.isSuccess()) {
return "OA通知消息發(fā)送成功";
}
return "OA通知消息發(fā)送失敗,失敗原因:" + response.getData().toString();
}
}注意:模板變量順序要和配置、后臺(tái)模板完全匹配,OA消息可根據(jù)內(nèi)部需求調(diào)整模板內(nèi)容,支持文本、審批提醒等多種格式,調(diào)用方式和短信完全一致,學(xué)習(xí)成本極低。
四、核心避坑提示
- 參數(shù)一致性:短信和OA的密鑰、地址、模板ID必須和后臺(tái)完全一致,空格、字符錯(cuò)誤會(huì)直接導(dǎo)致發(fā)送失??;
- 渠道標(biāo)識(shí)對(duì)應(yīng):SmsFactory獲取實(shí)例的標(biāo)識(shí),必須和yml中blends下的配置名一一對(duì)應(yīng),不可寫錯(cuò);
- 生產(chǎn)環(huán)境規(guī)范:敏感密鑰切勿硬編碼,建議放到Nacos、Apollo配置中心,OA內(nèi)網(wǎng)地址做好權(quán)限管控;
- 單渠道 fallback:可加判斷邏輯,某一渠道失敗時(shí),另一渠道兜底,提升消息送達(dá)率。
五、總結(jié)
整體集成全程不到10分鐘,依托SMS4J 3.3.5最新版本,SpringBoot3集成零兼容問題,不僅搞定了多廠商短信的解耦對(duì)接,還順帶實(shí)現(xiàn)了OA消息通知,一套框架管理雙渠道消息,代碼簡(jiǎn)潔、擴(kuò)展靈活。不管是中小型項(xiàng)目的基礎(chǔ)消息功能,還是需要多渠道災(zāi)備的業(yè)務(wù)場(chǎng)景,都能快速落地。
到此這篇關(guān)于SpringBoot3集成SMS4J實(shí)現(xiàn)短信+OA雙渠道消息發(fā)送的文章就介紹到這了,更多相關(guān)SpringBoot3集成SMS4J雙渠道消息發(fā)送內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用IDEA創(chuàng)建maven父子工程項(xiàng)目 (圖文)
本文主要介紹了使用IDEA創(chuàng)建maven父子工程項(xiàng)目,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
SSL證書部署+SpringBoot實(shí)現(xiàn)HTTPS安全訪問的操作方法
文章介紹了SSL和HTTPS的工作原理,包括握手階段和安全數(shù)據(jù)傳輸階段,通過模擬HTTPS請(qǐng)求,展示了如何生成自簽名證書并配置Spring Boot應(yīng)用程序以支持HTTPS,總結(jié)指出,SSL和HTTPS對(duì)于保護(hù)網(wǎng)絡(luò)安全至關(guān)重要,感興趣的朋友一起看看吧2025-02-02
Spring MVC+mybatis實(shí)現(xiàn)注冊(cè)登錄功能
這篇文章主要為大家詳細(xì)介紹了Spring MVC+mybatis實(shí)現(xiàn)注冊(cè)登錄功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
如何用注解的方式實(shí)現(xiàn)Mybatis插入數(shù)據(jù)時(shí)返回自增的主鍵Id
這篇文章主要介紹了如何用注解的方式實(shí)現(xiàn)Mybatis插入數(shù)據(jù)時(shí)返回自增的主鍵Id,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
java token生成和校驗(yàn)的實(shí)例代碼
這篇文章主要介紹了java token生成和校驗(yàn)的實(shí)例代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-09-09
Java通過JNI 調(diào)用動(dòng)態(tài)鏈接庫DLL操作
這篇文章主要介紹了Java通過JNI 調(diào)用動(dòng)態(tài)鏈接庫DLL操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-11-11
Java案例使用比較排序器comparator實(shí)現(xiàn)成績(jī)排序
這篇文章主要介紹了Java案例使用比較排序器comparator實(shí)現(xiàn)成績(jī)排序,主要通過案例用TreeSet集合存儲(chǔ)多個(gè)學(xué)生信息,并遍歷該集合,要按照總分從高到低進(jìn)行排序,下文介紹需要的朋友可以參考一下2022-04-04
SpringCloud連接不上遠(yuǎn)程N(yùn)acos問題排查
本文主要介紹了SpringCloud連接不上遠(yuǎn)程N(yùn)acos問題排查,可能是因?yàn)槲撮_放端口,或集群內(nèi)部通信異常等,下面就來介紹一下問題解決,感興趣的可以了解一下2024-06-06

