如何设计一个短信发送功能

这篇具有很好参考价值的文章主要介绍了如何设计一个短信发送功能。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文主要分享了如何设计一个发送短信功能。

一、总结简述

1.梳理多个平台短信API的发送参数,集成封装提供统一的API,支持多个短信平台(阿里云、腾讯云、百度云、京东云、七牛云)灵活切换

2.提供存储方案,表结构设计

3.提供真实生产项目代码案例,实现异步机制、定时发送、超时取消发送等功能

4.文末提供代码仓库,有兴趣的小伙伴可以fork代码

二、架构图

如何设计一个短信发送功能

三、代码实现(渠道SDK封装)

1.短信抽象核心代码(项目:sms-sender-core)

如何设计一个短信发送功能

1)抽象短信发送器,定义一个接口

如何设计一个短信发送功能

2)以阿里云短信对接实现类为demo的代码展示,其他渠道代码类似,当然也可以增加自定义渠道实现,实现SmsSender的接口即可(可通过gitee查看源码)

如何设计一个短信发送功能

3)阿里云短信封装SmsClient核心代码

如何设计一个短信发送功能

2.简化项目sms-sender-core的引用,springboot自动装配(项目:sms-sender-spring-boot-starter)

如何设计一个短信发送功能

1)这里就只展示SmsSenderAutoConfiguration的代码,其他的可以通过gitee查看源码

如何设计一个短信发送功能

简单的短信代码SDK封装到此结束,但在我们实际项目开发是远不够的。实际项目中还需要考虑存储方案、异步机制、定时发送、超时取消发送、失败重试机制、渠道切换等。

四、代码实现(项目实际应用)

1.数据库表结构设计

CREATE TABLE `sms_type_template_config` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
  `type` varchar(16) NOT NULL COMMENT '业务类型(verifycode:验证码,market:营销活动,tips:提示信息)',
  `channel` varchar(16) NOT NULL COMMENT '发送渠道(log:打印日志(测试),ali:阿里云,tencent:腾讯云)',
  `template_code` varchar(32) NOT NULL COMMENT '模板编码',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `uniq_type_channel` (`type`,`channel`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短信业务-模板配置';

CREATE TABLE `sms_template` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
  `channel` varchar(16) NOT NULL COMMENT '发送渠道(log:打印日志(测试),ali:阿里云,tencent:腾讯云)',
  `template_code` varchar(32) NOT NULL COMMENT '模板编码',
  `template_content` varchar(255) DEFAULT NULL COMMENT '模板内容',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `uniq_channel_templatecode` (`channel`,`template_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短信模板';

CREATE TABLE `sms_task` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
  `type` varchar(16) NOT NULL COMMENT '业务类型(verifycode:验证码,market:营销活动,tips:提示信息)',
  `plan_send_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '计划发送时间',
  `over_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '超时取消发送时间',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_type` (`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短信发送任务';

CREATE TABLE `sms_task_detail` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
  `task_id` int(11) unsigned NOT NULL COMMENT 'sms_task.id',
  `mobile` varchar(11) NOT NULL COMMENT '手机号码',
  `template_param_json` varchar(255) DEFAULT NULL COMMENT '模板参数json',
  `plan_send_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '计划发送时间',
  `actual_send_time` datetime DEFAULT NULL COMMENT '实际发送时间',
  `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '状态(1:待发送,2:待定时发送,11:发送MQ成功,12:MQ消费成功,21:请求成功,22:请求失败,31:取消发送)',
  `content` varchar(255) DEFAULT NULL COMMENT '短信内容',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_taskid` (`task_id`),
  KEY `idx_mobile` (`mobile`),
  KEY `idx_plansendtime_status` (plan_send_time,`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短信发送任务明细';

CREATE TABLE `sms_record` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
  `channel` varchar(16) NOT NULL COMMENT '发送渠道(log:打印日志(测试),ali:阿里云,tencent:腾讯云)',
  `mobile` varchar(11) NOT NULL COMMENT '手机号码',
  `sign_name` varchar(12) NOT NULL COMMENT '短信签名(2~12个字符),如:【XX公司】,【】不用填写',
  `template_code` varchar(32) NOT NULL COMMENT '模板编码',
  `template_param_json` varchar(255) DEFAULT NULL COMMENT '模板参数json',
  `content` varchar(255) DEFAULT NULL COMMENT '短信内容',
  `result` varchar(8) NOT NULL COMMENT '结果(success:成功,fail:失败)',
  `message` varchar(255) DEFAULT NULL COMMENT '信息',
  `request_id` varchar(64) DEFAULT NULL COMMENT '请求ID',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE,
  KEY `idx_mobile` (`mobile`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短信发送记录';

表说明:

sms_type_template_config:主要是记录业务类型与模板编码的关系,这样可以避免在代码中写死模板编码,因为不同的渠道模板编码也会不一致

sms_template:配置不同渠道的短信模板

sms_task、sms_task_detail:短信任务,可以理解为每次发送短信都是1个短信任务,每个短信任务可以给多个用户发送短信,营销短信常用,支持即时发送和定时发送

sms_record:短信发送记录,最终调用完发送短信API记录(不代表一定发送成功,部分渠道平台还提供了查询发送状态的API,如果需要了解最终状态需要增加状态API的查询

数据样例说明:

短信业务-模板配置

如何设计一个短信发送功能

1)代码中会写死type,跟据type+channel查询到template_code

短信模板

如何设计一个短信发送功能

1)跟据channel+template_code查询到template_content

为什么要记录模板内容?

1)其实template_content一般是不需要传递给第三方API的,大部分都是通过“模板编码+短信参数”的方式来发送短信,但也有部分渠道API有特殊情况,直接通过“短信内容”来发送

2)运营人员在发送营销短信时需要在管理后台能看到短信模板

3)短信的实际内容是需要保留存储的,而渠道API一般都不会返回实际发送内容,只能由程序拼凑

短信发送记录

如何设计一个短信发送功能

2.将sms_type_template_config、sms_template都做成后台配置功能,这里就不细讲了

3.核心代码展示

1)项目结构

如何设计一个短信发送功能

2)生产者核心代码

如何设计一个短信发送功能

3)消费者核心代码

如何设计一个短信发送功能

如何设计一个短信发送功能

补充:失败重试机制(可利用template-tool下的innercallback代码实现)、渠道切换尚未实现,后续有时间再补充!!!

怎么样?如果你觉得有用的话,还不快快收藏起来!!!

附:涉及的代码目录

github: GitHub - 897665787/sms-sender: 一个封装了短信发送的框架,支持阿里云短信、腾讯云短信等。、GitHub - 897665787/springcloud-template: 一个基于springcloud netflix微服务框架,记录了关于微服务开发的一些最佳应用,欢迎大家学习指导。

gitee:sms-sender: 一个封装了短信发送的框架,支持阿里云短信、腾讯云短信等。、springcloud-template: 一个基于springcloud netflix微服务框架,记录了关于微服务开发的一些最佳应用,欢迎大家学习指导。文章来源地址https://www.toymoban.com/news/detail-501003.html


sms-sender
├── sms-sender-core -- 核心代码
     └── ali -- 阿里云
     └── baidu -- 百度云
     └── jingdong -- 京东云
     └── log -- 测试渠道(一般用于测试环境不想真正的发送短信,短信可是要收费的)
     └── qiniu-- 七牛云
     └── tencent -- 腾讯云
└── sms-sender-boot-starter -- 整合springboot代码
└── sms-sender-jdbc-spring-boot-starter -- 整合springboot代码,增加了jdbc存储方案,自动创建表短信模板(sms_template)、短信发送记录(sms_record)2张表
     └── processor
          └── SqlSendPostProcessor -- jdbc存储实现
└── sms-sender-springboot-demo -- 在springboot中使用sms-sender的demo代码

springcloud-template
└── template-tool
     └──controller
          └── SmsController -- 短信任务轮询API
          └── VerifyCodeController -- 验证码短信发送demo
     └── sms
          └── AsyncSmsSender -- 异步发送短信,MQ生产者逻辑
          └── MysqlSendPostProcessor -- 记录短信发送记录
          └── SmsSenderConsumer -- 异步发送短信,MQ消费者逻辑
└── sql
     └── tool
          └── 短信设计相关表.sql

到了这里,关于如何设计一个短信发送功能的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (短信服务)java SpringBoot 阿里云短信功能实现发送手机验证码

    阿里云官网: https://www.aliyun.com/ 点击官网首页注册按钮。 注册成功后,点击登录按钮进行登录。登录后进入短信服务管理页面,选择国内消息菜单: 短信签名是短信发送者的署名,表示发送方的身份。 切换到【模板管理】标签页: 短信模板包含短信发送内容、场景、变量信息

    2024年02月02日
    浏览(52)
  • 手机短信验证码登录功能的开发实录(机器识别码、短信限流、错误提示、发送验证码倒计时60秒)

    短信验证码是通过发送验证码到手机的一种有效的验证码系统,作为比较准确和安全地保证购物的安全性,验证用户的正确性的一种手段,几乎网站登录都会使用该方式。 其特点是依据某些验证码接入商提供手机短信验证码服务,各网站通过接口发送请求到接入商的服务器,

    2024年02月02日
    浏览(44)
  • 【python】如何通过python来发送短信

    ✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,

    2024年04月27日
    浏览(32)
  • 【script】15行Python代码实现免费发送手机短信推送消息功能(twilio)

    通过代码定时给手机推送短信,短信内容可以自定义文字,当然你也可以去别的网站爬取每日心灵鸡汤,天气预报或其它信息进行推送。 本文主要讲如何实现发送短信的功能,全部代码只用15行。 首先贴出实现的效果图,后面再分两步详细描述实现过程,第一步免费注册ap

    2023年04月09日
    浏览(85)
  • 如何通过python来给手机发送一条短信?

    要通过Python发送短信到手机,您可以使用不同的短信服务提供商的API。以下是一个使用Twilio和Sinch服务提供商的示例,您可以根据自己的选择来决定使用哪个。 使用Twilio发送短信: 首先,注册一个Twilio账户并获取您的账户SID、认证令牌和Twilio号码。 安装 twilio 包,如果您还没

    2024年02月12日
    浏览(44)
  • 单片机毕业设计 stm32发送短信消息(GMS模块)

    Hi,大家好,学长今天向大家介绍如何使用GMS模块,达到单片机发送短信的效果,应用场景非常广泛 ** 单片机发送短信消息(GMS模块)** 大家可用于 课程设计 或 毕业设计 GSM模块使用上海SIMcom公司的SIM900高精度无线GSM/GPRS完全四频芯片,使用SMT封装且融 合了高性能的ARM926EJ

    2024年02月07日
    浏览(51)
  • 【账号系统之(手机验证码登录)】使用阿里云短信服务,实现服务商给手机发送验证码功能。

    目录 一、前言 二、前期准备 三、购买短信服务 四、申请签名和模板 (1) 进入阿里云短信服务控制台 (2) 添加签名 (3) 添加模板 五、RAM申请及权限配置 (1) 进入RAM访问控制界面 (2) 创建用户 (3) 分配权限 (4) 创建角色 (5) 记录段的值 六、阿里云.NET SDK身份验证接入 (1) 了解

    2024年02月04日
    浏览(52)
  • 【毕业设计教程】单片机发送短信消息(GMS模块) - 物联网 嵌入式 stm32

    Hi,大家好,这里是丹成学长,今天向大家介绍如何使用GMS模块,达到单片机发送短信的效果,应用场景非常广泛 ** 单片机发送短信消息(GMS模块)** 大家可用于 课程设计 或 毕业设计 单片机-嵌入式毕设选题大全及项目分享: https://blog.csdn.net/m0_71572576/article/details/125409052 GS

    2024年02月02日
    浏览(51)
  • 短信发送系统后台搭建,源码基础版短信系统

    短信版本基础版本记录 因是基础版本,客户端功能和后台功能尽量简洁,方便实用。 一:后台和客户端的呈现方式 1.1后台采用软件版本,后台不通过URL地址打开。通过安装在使用的电脑上进行连接短信服务器进行操作。 1.2:客户端采用通过URL的方式打开方便使用 WEB短信客

    2024年02月07日
    浏览(34)
  • 最近项目上需要发送短信整理了一篇文章 SpringBoot整合阿里云发送短信

    阿里云短信服务网址:阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台 第一步:申请签名(一般申请时长在1-2小时之间)特别注意:场景说明不要乱填以免申请不通过  第二步:申请短信模板(一般申请时长在1-2小时之间)特别注意:场景说明不要乱填以免申请不

    2024年02月06日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包