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

一、总结简述

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微服务框架,记录了关于微服务开发的一些最佳应用,欢迎大家学习指导。


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

如何设计一个短信发送功能相关推荐

  1. php 短信验证 云之讯,python3.7实现云之讯、聚合短信平台的短信发送功能

    1.云之讯平台数据返回Json格式: {'reason': '操作成功', 'result': {'sid': '17209241456456455454', 'fee': 1, 'count': 1 ...

  2. 手机网站实现一键拨号及html5短信发送功能JS代码(微信适用)

    手机网站实现一键拨号及html5短信发送功能JS代码(微信适用) 来源:本站原创    作者:温州中网网络营销机构    发布时间:2014-1-10 10:45:44    点击数:3069 微信微 ...

  3. 安卓之实现一个简单的短信发送功能

    1.首先,新建一个安卓项目,打开项目下的res下的layout,里面有个activity_main.xml布局文件,打开来,修改里面的代码,其中第一个EditText下的android:inputTy ...

  4. android短信功能裁剪,Android短信发送功能实现技巧分享

    如现在启动一模拟器id 号为5554,运行cmd telnet localhost 5554 输入help 可以看到很多用于模拟器中的功能命令 gsm call 134343434   // 便是呼叫 ...

  5. 阿里云短信服务(完整指南),短信发送功能实现。

    本篇文章是根据阿里云短信接口,为什么选择阿里呢,首先,名气大,然后,对其他云不熟,最后,阿里云短信开通后只需要充十块钱,就够你用好久,一条四分钱,其他短信不太清楚,不过有的必须要你一次性买多少万条才能 ...

  6. 微信开发之移动手机WEB页面(HTML5)Javascript实现一键拨号及短信发送功能

    在做一个微信的微网站中的一个便民服务电话功能的应用,用到移动web页面中列出的电话号码,点击需要实现调用通讯录,网页一键拨号的拨打电话功能. 如果需要在移动浏览器中实现拨打电话,发送email,美国服 ...

  7. PHP 实现 阿里云 短信发送 功能步骤

    1.创建签名 (记住签名名称,后面代码配置中需要),2小时以内会审核通过. 2.创建模板 (记住模板CODE ,后面代码配置中需要) 3. 生成AccessKey ID 和 Access Key Se ...

  8. 快速实现短信发送功能(SpringBoot)

    Springboot集成短信发送 准备工作:确定要使用的第三方容联云通讯接口因为是免费测试送8元礼包才选择的,首先注册一个账户,主界面的账户信息是我们所需的,复制代码后,包名.位置自己解决; 一.导入 ...

  9. 【日常记录】接入短信发送功能,为实现完整的注册功能做准备

    接入阿里短信发送接口: 1.直接去阿里云[云市场]搜索[短信]随便选一个试用测试就行 打开后有相应的api说明 调用地址以及请求参数,可以自己去postman调试或者使用自带的[调试工具:去调试]. ...

最新文章

  1. [机器学习] Boosting算法1 --- AdaBoost
  2. linux shell 编程
  3. MySQL 可重复读,差点就让我背上了一个 P0 事故!
  4. 返回结果的HTTP状态码——《图解http》第四章
  5. 录像带转存电脑的方法_《波西亚时光》录像带使用方法介绍
  6. HTML5 列表和表格
  7. mysql意外关机_MySQL服务器意外关机-无法启动多实例
  8. LOJ 2339 「WC2018」通道——边分治+虚树
  9. linux之解决lib***.so.*: cannot open shared object file
  10. 关于字符集和字符编码格式
  11. Java反射库jOOR简介
  12. html中字体 楷体_css怎么设置字体为楷体?
  13. 如何设置PPT,演示者能看到备注而观众看不到
  14. matlab里excel汉字怎么显示,[求助]matlab如何导入excel中的汉字,求助~~~
  15. 计算机在欢迎进不到桌面,win10系统一直在欢迎界面进不去桌面的解决教程
  16. Python基础详解(十四):2022-Pycharm最新版社区版安装教程
  17. 关于petitfatfs的移植问题
  18. 谷歌文本转语音(gtts)批量转换
  19. Cesium常用知识及学习
  20. mockcpp 介绍与使用示例

热门文章

  1. VUE删除数组指定的元素
  2. 2 申请GAE的AppId与Google SVN代码托管
  3. 雷霆王机器人_科幻的日本机器人动画,六神合体雷霆王,超魔性的洗脑神曲
  4. alsa-lib之snd_pcm_open
  5. 【嵌入式模块】TCS3200D颜色识别模块
  6. python 爬取直播_python爬虫,轻快爬取直播平台热度排行
  7. 手把手教你用JSP+Servlet+Tomcat实现一个最简单的Web应用
  8. qdialog 返回值_qt - QDialog :: exec()的返回值始终是QDialog :: Rejected - 堆栈内存溢出...
  9. 【Oracle 数据库】奶妈式教程 day12 字符函数
  10. 用C语言制作Web服务器