1. ERP短信接口开发背景与价值
企业资源计划(ERP)系统作为现代企业管理的核心平台,其通知机制的实时性直接关系到业务流程效率。传统ERP系统主要依赖站内消息、邮件或人工通知,存在响应延迟、触达率低等问题。以某制造企业为例,其采购订单审批环节因邮件通知不及时,平均延误达6.8小时,直接导致生产线待料停工。
短信接口的集成解决了三个核心痛点:
- 即时触达:短信到达率稳定在98%以上,5秒内可完成推送
- 强提醒:震动+铃声的物理提醒机制,比软件通知更有效
- 全场景覆盖:无需联网或安装特定APP,适配所有移动设备
典型应用场景包括:
- 紧急流程审批(采购/付款/合同)
- 库存预警(安全库存阈值触发)
- 物流状态更新(发货/签收节点)
- 系统异常告警(登录异常/数据同步失败)
注意:选择短信服务商时需确认其持有《增值电信业务经营许可证》,避免使用三无平台导致法律风险。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 短信服务商技术选型要点
2.1 主流服务商对比
| 服务商 | 并发能力 | 到达率 | 单价(条) | 特色功能 |
|---|---|---|---|---|
| 阿里云 | 5000QPS | 99.2% | 0.038元 | 智能路由/失败自动重发 |
| 腾讯云 | 3000QPS | 98.7% | 0.036元 | 微信小程序通知联动 |
| 云片 | 2000QPS | 97.5% | 0.040元 | 多签名动态切换 |
| 梦网 | 1500QPS | 96.8% | 0.042元 | 国际短信支持 |
2.2 技术对接方案选择
方案A:直连模式(推荐)
- 通过HTTP/HTTPS API直接调用服务商接口
- 优势:延迟低(<200ms),可定制化程度高
- 示例代码(Java):
java复制public class SmsSender {
private static final String API_URL = "https://dysmsapi.aliyuncs.com";
public void send(String mobile, String content) {
Map<String, String> params = new HashMap<>();
params.put("PhoneNumbers", mobile);
params.put("SignName", "企业签名");
params.put("TemplateCode", "SMS_123456");
params.put("TemplateParam", "{\"code\":\""+content+"\"}");
// 签名算法实现省略...
String result = HttpClient.post(API_URL, params);
}
}
方案B:中间件模式
- 通过消息队列(如RabbitMQ)解耦
- 适用场景:高并发批量发送(>1万条/分钟)
- 架构示例:
code复制ERP系统 → RabbitMQ → 消费者服务 → 短信平台
↑
失败消息重试队列
踩坑提醒:某金融项目曾因未做短信频控,被用户投诉营销骚扰,导致通道被封。建议设置:
- 同一号码1小时内不超过5条
- 相同内容间隔需大于30分钟
3. ERP系统集成详细实现
3.1 数据库设计优化
消息发送表结构:
sql复制CREATE TABLE `erp_sms_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`biz_type` varchar(32) NOT NULL COMMENT '业务类型:ORDER_APPROVAL等',
`mobile` varchar(20) NOT NULL,
`content` text NOT NULL,
`template_id` varchar(64) DEFAULT NULL,
`status` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0-待发送 1-成功 2-失败',
`retry_count` int(11) DEFAULT '0',
`create_time` datetime NOT NULL,
`send_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_biz_type` (`biz_type`),
KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
关键优化点:
- 使用utf8mb4字符集支持Emoji
- 添加复合索引提升状态查询效率
- 分离创建时间和发送时间用于统计分析
3.2 业务逻辑层实现
采用策略模式处理不同业务场景的短信模板:
java复制public interface SmsStrategy {
String generateContent(Map<String, Object> params);
String getTemplateCode();
}
// 审批通知实现示例
public class ApprovalSmsStrategy implements SmsStrategy {
@Override
public String generateContent(Map<String, Object> params) {
return String.format("【%s】您有%s待审批,请及时处理",
params.get("company"),
params.get("bizName"));
}
@Override
public String getTemplateCode() {
return "SMS_APPROVAL_001";
}
}
3.3 性能优化方案
批量发送处理流程:
- 使用Spring Batch分页读取待发送记录(每页500条)
- 通过CompletableFuture实现异步并发发送
- 失败记录自动进入重试队列(指数退避策略)
java复制@Async
public void batchSend(List<SmsTask> tasks) {
List<CompletableFuture<Void>> futures = tasks.stream()
.map(task -> CompletableFuture.runAsync(() -> {
try {
smsSender.send(task.getMobile(), task.getContent());
task.setStatus(SEND_SUCCESS);
} catch (Exception e) {
task.setStatus(SEND_FAILED);
task.setErrorMsg(e.getMessage());
}
}, executorService))
.collect(Collectors.toList());
CompletableFuture.allOf(futures.toArray(new CompletableFuture[0])).join();
}
4. 企业级安全防护措施
4.1 敏感信息处理
手机号脱敏方案:
java复制public static String maskMobile(String mobile) {
if (StringUtils.isBlank(mobile) || mobile.length() != 11) {
return mobile;
}
return mobile.substring(0, 3) + "****" + mobile.substring(7);
}
内容安全检测:
- 使用DFA算法过滤敏感词
- 禁止发送的内容类型:
- 政治相关词汇
- 竞品营销信息
- 第三方网址链接
4.2 通道灾备方案
多通道自动切换逻辑:
mermaid复制graph TD
A[发送请求] --> B{主通道可用?}
B -->|是| C[主通道发送]
B -->|否| D[备选通道1]
D --> E{发送成功?}
E -->|否| F[备选通道2]
E -->|是| G[记录结果]
实际项目中我们采用更可靠的实现方式:
java复制public class SmsRouter {
private List<SmsProvider> providers;
public SendResult send(SmsRequest request) {
for (SmsProvider provider : providers) {
try {
SendResult result = provider.send(request);
if (result.isSuccess()) {
return result;
}
} catch (Exception e) {
log.warn("Provider {} failed: {}", provider.getName(), e.getMessage());
}
}
throw new SmsException("All providers failed");
}
}
4.3 审计与合规
必须记录的审计字段:
- 发送时间(精确到毫秒)
- 操作人ID(系统自动触发需标记为SYSTEM)
- 客户端IP
- 短信内容哈希值(SHA-256)
合规性检查清单:
- 已备案企业签名(需提供营业执照)
- 模板内容通过运营商审核
- 发送时间限制在8:00-21:00
- 包含退订提示(回复TD退订)
5. 生产环境问题排查指南
5.1 常见错误代码处理
| 错误码 | 含义 | 解决方案 |
|---|---|---|
| 1001 | 手机号格式错误 | 校验国家码(86开头需去除) |
| 2003 | 签名未备案 | 登录控制台提交签名审核 |
| 3005 | 触发频控限制 | 检查1小时内发送次数 |
| 4002 | 账户余额不足 | 设置余额自动预警(<1000元触发) |
| 5001 | 通道临时拥堵 | 指数退避重试(建议最多3次) |
5.2 监控指标体系建设
Prometheus监控配置示例:
yaml复制- job_name: 'sms_metrics'
metrics_path: '/actuator/prometheus'
static_configs:
- targets: ['sms-service:8080']
关键监控项:
- 发送成功率(成功量/总量)
- 平均响应时间(<500ms为优)
- 各通道占比(主备通道健康度)
- 业务类型分布(识别热点场景)
5.3 日志分析技巧
典型问题排查流程:
- 通过traceId关联ERP业务日志和短信日志
- 筛选ERROR级别日志重点检查
- 分析时间序列特征(如整点失败激增可能是限流)
bash复制# 日志查询示例(ELK)
GET /sms-logs-*/_search
{
"query": {
"bool": {
"must": [
{ "match": { "status": "FAILED" }},
{ "range": { "@timestamp": { "gte": "now-1h" }}}
]
}
}
}
6. 高级功能扩展方案
6.1 智能路由策略
基于历史数据的动态路由算法:
python复制def select_provider(mobile_prefix):
stats = get_history_stats(mobile_prefix)
return max(
providers,
key=lambda p: stats[p.id]['success_rate'] * 0.7 + stats[p.id]['speed'] * 0.3
)
6.2 短信链路追踪
在HTTP头中添加追踪信息:
http复制POST /send HTTP/1.1
X-Trace-Id: 7b3d5f8a-1c9e-4f2d
X-Span-Id: 3ac7e1b2
Content-Type: application/json
{
"mobile": "13800138000",
"content": "您的验证码是1234"
}
6.3 全球化支持
多语言模板配置示例:
yaml复制templates:
- id: ORDER_CONFIRMED
zh: "尊敬的{name},订单{orderNo}已确认"
en: "Dear {name}, order {orderNo} is confirmed"
jp: "尊敬する{name}様、注文{orderNo}が確認されました"
实际项目中我们采用数据库存储方案,配合Redis缓存提升性能:
java复制public String getTemplate(String id, String lang) {
String cacheKey = "sms:template:" + id + ":" + lang;
String content = redisTemplate.opsForValue().get(cacheKey);
if (content == null) {
content = templateRepository.findByIdAndLang(id, lang)
.orElseThrow().getContent();
redisTemplate.opsForValue().set(cacheKey, content, 1, TimeUnit.HOURS);
}
return content;
}
7. 实施经验与避坑指南
硬件资源规划建议:
- 每1000条/分钟的吞吐量需要:
- 2核CPU
- 4GB内存
- 独立网卡(避免带宽竞争)
典型配置错误:
- 连接池不足(建议:最大连接数=QPS*平均RT)
- 未设置合理的超时时间(推荐:连接超时3s,读取超时5s)
- 忽略DNS缓存问题(建议设置JVM参数:
-Dsun.net.inetaddr.ttl=60)
性能压测数据:
- 阿里云c6.large实例(2vCPU/4GB)测试结果:
code复制线程数 | 平均RT | 吞吐量 -------------------------- 50 | 218ms | 229/s 100 | 231ms | 432/s 200 | 253ms | 790/s
短信内容优化技巧:
- 重要信息前置(前20字符需包含关键数据)
- 避免特殊符号(&、%等可能被网关过滤)
- 中文长度≤70字,英文≤160字符(避免拆条计费)
某零售企业实施后关键指标提升:
- 审批流程平均耗时从4.2h→0.3h
- 库存周转率提升18%
- 客户投诉率下降27%
