做后端业务开发,短信发送是绕不开的基础功能,但直接对接各家云厂商短信sdk,不仅配置繁琐、业务耦合度高,换个服务商就要重构大半代码,纯纯费力不讨好。而且日常项目里,除了短信验证码,oa系统消息通知也是高频需求,单独对接oa接口又要额外写一套逻辑。最近用springboot3做项目,直接上手了sms4j这个开源工具,不仅适配springboot3.x、一键切换多厂商短信,还能同步集成oa消息通知,一套工具搞定双渠道发送。
一、项目环境与核心依赖
先确认基础环境,我这边用的是springboot 3.2.5、jdk17。
第一步先引入maven核心依赖,直接在pom.xml中添加官方starter。
<!-- sms4j springboot3启动器 官方最新稳定版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一体化配置
接下来是核心配置环节,不用写自定义配置类,直接在application.yml中同时配置短信和oa消息,一份配置文件管理双渠道,切换厂商和oa地址只改配置,业务代码零改动。我以阿里云短信+通用oa通知为例,配置逻辑清晰易懂。
提前准备好阿里云短信参数:accesskey、secret、短信签名、模板id;oa相关参数:oa接口地址、应用密钥、审批人/接收人标识,都是后台可直接获取的基础参数。
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 # 表示该配置是否生效(默认生效,false表示不生效)
supplier: ding_ding # 厂商标识
tokenid: 您的accesskey # webhook 中的 access_token
sign: 您的sign # 安全设置在验签模式下才的秘钥,非验签模式没有此值不管是新增腾讯云、华为云短信,还是调整oa对接参数,都只需要在blends下新增或修改配置块,业务逻辑完全不用动,多渠道切换和扩展极其灵活,这也是sms4j的核心优势。
三、代码实现:短信+oa双发送接口
配置完成后直接写业务代码,sms4j通过工厂类统一管理渠道实例,短信和oa发送调用逻辑高度一致,代码极度简洁,适配登录验证码、业务审批通知等场景。
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 {
/**
* 通用短信验证码发送接口
* @param phone 接收短信的手机号
* @return 发送结果反馈
*/
@getmapping("/send/{phone}")
public string sendsmscode(@pathvariable string phone) {
// 获取对应厂商标识的短信实例,和yml配置一一对应
smsblend smsblend = smsfactory.getsmsblend("aliyun");
// 生成6位纯数字验证码,适配绝大多数验证码场景
string code = randomutil.randomnumbers(6);
// 执行短信发送,参数顺序严格匹配短信模板变量顺序
smsresponse response = smsblend.sendmessage(phone, code);
// 结果返回,开发阶段可直接返回验证码调试,生产环境建议隐藏
if (response.issuccess()) {
return "短信发送成功,验证码:" + code;
}
return "短信发送失败,失败原因:" + response.getdata().tostring();
}
/**
* 通用oa通知发送接口
* @param phone 接收通知的手机号
* @return 发送结果反馈
*/
@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);
// 支持通过手机号@
request.setphonelist(phones);
// 支持@all
// request.setisnoticeall(true);
request.setcontent("测试消息");
response response = alarm.sender(request, messagetype.ding_talk_text);
// 结果返回
if (response.issuccess()) {
return "oa通知消息发送成功";
}
return "oa通知消息发送失败,失败原因:" + response.getdata().tostring();
}
}注意:模板变量顺序要和配置、后台模板完全匹配,oa消息可根据内部需求调整模板内容,支持文本、审批提醒等多种格式,调用方式和短信完全一致,学习成本极低。
四、核心避坑提示
- 参数一致性:短信和oa的密钥、地址、模板id必须和后台完全一致,空格、字符错误会直接导致发送失败;
- 渠道标识对应:smsfactory获取实例的标识,必须和yml中blends下的配置名一一对应,不可写错;
- 生产环境规范:敏感密钥切勿硬编码,建议放到nacos、apollo配置中心,oa内网地址做好权限管控;
- 单渠道 fallback:可加判断逻辑,某一渠道失败时,另一渠道兜底,提升消息送达率。
五、总结
整体集成全程不到10分钟,依托sms4j 3.3.5最新版本,springboot3集成零兼容问题,不仅搞定了多厂商短信的解耦对接,还顺带实现了oa消息通知,一套框架管理双渠道消息,代码简洁、扩展灵活。不管是中小型项目的基础消息功能,还是需要多渠道灾备的业务场景,都能快速落地。
到此这篇关于springboot3集成sms4j实现短信+oa双渠道消息发送的文章就介绍到这了,更多相关springboot3集成sms4j双渠道消息发送内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论