0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Java应中如何发送短信

OSC开源社区 来源:OSC开源社区 2023-11-09 10:46 次阅读

很多业务场景里,我们都需要发送短信,比如登陆验证码、告警、营销通知、节日祝福等等。

这篇文章,我们聊聊 Java 应用中如何优雅的发送短信。

dc9e41ae-7ea8-11ee-939d-92fbcf53809c.png

1 客户端/服务端两种模式

Java 应用中发送短信通常需要使用短信服务提供商提供的短信 API

我们经常使用的短信渠道有:阿里云、腾讯云、华为云、亿美等。

发送短信模式分为两种:

1、客户端模式

客户端模式是指应用系统直接调用短信服务提供商提供的短信 API 发送短信。

dcc042a4-7ea8-11ee-939d-92fbcf53809c.png

2、服务端模式

服务端模式是独立创建一个短信平台服务,应用系统直接使用短信平台服务提供的 SDK 发送短信。

dcd5d966-7ea8-11ee-939d-92fbcf53809c.png

核心流程如下:

前端调用应用服务接口发送短信 ;

应用服务收到短信请求后,调用 SDK 方法根据模版发送短信;

短信平台服务收到请求,根据路由算法选择配置的渠道(比如阿里云、腾讯云)发送短信;

短信成功发送到用户手机

2 客户端模式

1、使用三方短信渠道 SDK

客户端模式是非常简单的模式,很多短信服务提供商会提供成熟的 SDK ,业务系统只需要添加 SDK 依赖以及相关配置,就可以调用 SDK 提供的方法发送短信。

我们以阿里云短信服务为例, 调用 API 发送短信的全流程如下所示:

dcee7778-7ea8-11ee-939d-92fbcf53809c.png

使用 SDK 示例如下:

dd040eb2-7ea8-11ee-939d-92fbcf53809c.png

国内云厂商阿里云、腾讯云、华为云的短信服务,都需要依次申请签名申请模版,审核通过之后才能发送短信。

2、封装多个三方渠道接口

虽然使用三方短信渠道 SDK 非常简单,但是在实际项目中,可能会存在多个三方渠道,也就是说:可能有的短信是通过腾讯云发送,有的是通过阿里云发送。这样就需要在工程中配置不同渠道的 SDK 依赖。

但这种方式会有两个明显的问题 :

不同渠道的发送短信代码不一致,业务代码偏混乱。

工程中引入到 SDK 包比较多,不同的 SDK 依赖并不相同,可能存在冲突问题 。

为了解决这个问题,有一种方法是摈弃三方渠道 SDK ,自己实现 SDK 的发送短信方法,这样可以统一发送短信代码,易于管理。

笔者发现一个开源项目 SMS4J,该项目为短信聚合框架,旨在集成多家短信服务,解决接入多个短信 SDK 的繁琐流程。

下面我们展示在 SpringBoot 环境如何集成。

maven 引入


org.dromara.sms4j
sms4j-spring-boot-starter
3.0.2

设置配置文件

sms:

alibaba:
#阿里云的accessKey
accessKeyId:您的accessKey
#阿里云的accessKeySecret
accessKeySecret:您的accessKeySecret
#短信签名
signature:测试签名
#模板ID用于发送固定模板短信使用
templateId:SMS_215125134
#模板变量上述模板的变量
templateName:code
#请求地址默认为dysmsapi.aliyuncs.com如无特殊改变可以不用设置
requestUrl:dysmsapi.aliyuncs.com
huawei:
#华为短信appKey
appKey:5N6fvXXXX920HaWhVXXXXXX7fYa
#华为短信appSecret
app-secret:Wujt7EYzZTBXXXXXXEhSP6XXXX
#短信签名
signature:华为短信测试
#通道号
sender:8823040504797
#模板ID如果使用自定义模板发送方法可不设定
template-id:acXXXXXXXXc274b2a8263479b954c1ab5
#华为回调地址,如不需要可不设置或为空
statusCallBack:
#华为分配的app请求地址
url:https://XXXXX.cn-north-4.XXXXXXXX.com:443
zhutong:
#助通短信
#助通终端用户管理的用户名 username 必填;非登录账号密码,请登录后台管理地址进行查看:http://mix2.zthysms.com/login
accessKeyId:tushu1122XXX
#助通终端用户管理的用户名 passwrod 必填;
accessKeySecret:UbXXX4SL
#短信签名,可选;可选的时候,只能使用自定义短信不能使用模板短信;具体在这里查看审核过的短信签名:https://mix2.zthysms.com/index.html#/SignatureManagement
signature:上海千XXXX

方法使用

@RestController
@RequestMapping("/test/")
publicclassDemoController{
//测试发送固定模板短信
@RequestMapping("/")
publicvoiddoLogin(Stringusername,Stringpassword){
//阿里云向此手机号发送短信
SmsFactory.createSmsBlend(SupplierType.ALIBABA).
sendMessage("18888888888","123456");
//华为短信向此手机号发送短信
SmsFactory.createSmsBlend(SupplierType.HUAWEI).
sendMessage("16666666666","000000");
}
}

客户端模式是简单实用的模式,我们可以直接引入三方渠道的 SDK 发送短信,但当存在多种渠道短信时,可能代码会比较混乱。

虽然我们可以封装多个三方渠道接口来解决问题,但研发成本还是比较高的。

另外,当研发小组分散,发送短信各自自成体系时,当某一个渠道由于某种原因被弃用时,大部分研发小组都可能会受影响。

3 服务端模式

服务端模式是独立创建一个短信平台服务,应用服务直接使用短信平台提供的 SDK 发送短信。

短信平台的设计有如下要点:

1、应用管理

短信平台为每一个接入的应用分配单独的 appKey 和 appSecret ,每一个应用可以配置独立的限流策略。

2、精简的 SDK 提供按照模版单发/群发的功能

publicSmsSenderResultsendSmsByTemplateId(

Stringmobile,
StringtemplateId,
MaptemplateParam);

3、签名、模版管理

每个应用服务涉及到的签名、模版的管理都中心化 ,我们可以让一个模板绑定多个渠道。

当某条短信通过渠道 A 发送失败时,可以通过另一个渠道 B 发送,如此可以达到高可用的效果。

4、多渠道适配

服务端要加载多个渠道的 SDK ,那么可能导致依赖冲突,可以采取 SPI 机制加载渠道插件。

5、扩展功能

我们可以根据业务需求灵活定制短信平台的功能,比如批量发送、延迟发送、路由策略、灵活的接口限流等。

服务端的设计可以非常灵活,笔者曾经重构过一个短信平台服务,架构图如下:

dd41ca22-7ea8-11ee-939d-92fbcf53809c.jpg

模仿腾讯云的 SDK 设计,提供简单易用的短信接口;

设计短信服务 API 端,接收发短信请求,发送短信信息到消息队列;

worker 服务消费消息,按照负载均衡的算法,调用不同渠道商的短信接口;

Dashboard 可以配置渠道、管理应用、查看短信发送记录等。

编辑:黄飞

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4456

    浏览量

    90759
  • JAVA
    +关注

    关注

    19

    文章

    2904

    浏览量

    102996
  • 客户端
    +关注

    关注

    1

    文章

    282

    浏览量

    16340
  • SDK
    SDK
    +关注

    关注

    3

    文章

    966

    浏览量

    44709
  • 服务端
    +关注

    关注

    0

    文章

    62

    浏览量

    6871

原文标题:聊聊如何在Java应用中发送短信

文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    WAVECOM CDMA MODEM开发包 C#CDMA短信开发包 长短信

    控件VB版,DELPHI,ASP短信开发控件JAVA版,wavecom m1206 wavecom m1206b gsm/gprs modem GSM模块,短信猫,短信模块 长
    发表于 07-23 09:08

    使用LabVIEW发送短信

    相关课程推荐:《8周LabVIEW视觉项目编程实战特训营》现在使用的连接库,您可以发送短信。这个库,帮助你使用任何报警和事件条件的LabVIEW发送短信。2010版本:[hide] [
    发表于 03-15 10:52

    简单实现gsm发送中文短信

    ` 本帖最后由 ruihuan 于 2012-8-15 09:38 编辑 例如发送中文短信内容“你好!”到手机号码“***”(这个号码是我乱写的)1、设置发送方式为PDU格式发送
    发表于 08-15 09:37

    串口通信短信发送

    最近某省移动公司中层领导有个需求:通过手机卡发送短信来实现和类似1065****、1069****等短信网关的下发短信速度。这类网关大概下发短信
    发表于 05-17 16:17

    如何用阿里大于发送短信

    SendSmsRequest();try{ //必填:待发送手机号。支持以逗号分隔的形式进行批量调用,批量上限为1000个手机号码,批量调用相对于单条调用及时性稍有延迟,验证码类型的短信推荐使用单条调用
    发表于 02-03 16:08

    AT命令发送不了短信

    使用AT命令发送PDU中文短信,为什么总是返回错误?我是按照教程一步一步来的,为什么不行呢?但是我用text就可以发送英文短信
    发表于 05-15 17:05

    JAVA开发的短信收发程序

    JAVA开发的短信收发程序:Microsoft Visual Studio Solution File, Format Version 9.00# Visual Studio 2005Project
    发表于 02-08 17:21 28次下载

    酷博短信发送软件

    酷博短信发送软件支持各种短信Modem和Modem 池发送短信,适用于政府机关、企事业单位短信
    发表于 06-30 13:45 506次阅读

    短信息群组发送

    短信息群组发送   短信息群发功能即可将一条信息同时发给多个用
    发表于 12-19 11:58 784次阅读

    JAVA教程之组播组中发送和接受数据

    JAVA教程之组播组中发送和接受数据,很好的JAVA的资料,快来学习吧
    发表于 04-11 17:28 5次下载

    sim900a中英文短信发送步骤

    sim900a中英文短信发送步骤介绍。
    发表于 11-06 11:57 1.6w次阅读
    sim900a中英文<b class='flag-5'>短信</b><b class='flag-5'>发送</b>步骤

    一种基于JAVA的多业务综合短信平台设计

    传统的短信功能已无法满足电力行业生产类短信的特殊要求,针对这种情况,提出了一种基于JAVA的多业务综合短信平台设计方案,将国电大渡河流域梯级电站集控中心各生产系统的
    发表于 11-16 10:32 9次下载
    一种基于<b class='flag-5'>JAVA</b>的多业务综合<b class='flag-5'>短信</b>平台设计

    如何使用GPRS模块发送短信详细资料说明

    本文档的主要内容详细介绍的是如何使用GPRS模块发送短信详细资料说明包括了:pdu发短信问答,pdu格式发送短信息例子集,
    发表于 12-03 17:06 16次下载
    如何使用GPRS模块<b class='flag-5'>发送</b><b class='flag-5'>短信</b>详细资料说明

    gsm模块发送短信程序

    本文主要介绍了gsm模块发送短信程序。
    发表于 04-27 08:49 7211次阅读

    我的警报和传感器向我发送短信

    电子发烧友网站提供《我的警报和传感器向我发送短信.zip》资料免费下载
    发表于 11-28 10:17 0次下载
    我的警报和传感器向我<b class='flag-5'>发送</b><b class='flag-5'>短信</b>