7.0 KiB
7.0 KiB
短信网关 APK 开发文档
1. 文档目标
本文档用于指导开发一个 Android APK(短信网关),通过自有手机号实现短信验证码的接收、解析、转发,以及按需发送短信。
目标是不依赖第三方云短信服务,构建可自部署、可运维、可扩展的短信能力。
2. 适用场景
- 自有系统登录验证码收集与转发
- 小规模业务短信收发自动化
- 企业内网或私有化环境下的短信接入
注意:必须用于合法合规的业务场景,禁止用于批量注册、绕过风控、骚扰营销等违规用途。
3. 总体架构
3.1 架构组件
-
Android 短信网关 App
- 监听并接收短信
- 解析验证码或原始短信文本
- 调用后端 API 上报短信
- 接收后端任务并发送短信
-
后端服务(自建)
- 接收网关回调
- 下发发送任务
- 记录日志、重试、告警
- 提供业务系统查询接口
-
业务系统
- 发起发送请求
- 获取验证码处理结果
3.2 数据流
- 上游平台向手机号发送验证码短信
- Android 网关接收到短信广播
- 网关解析短信内容(提取验证码)
- 网关将完整短信 + 解析结果上报后端
- 业务系统从后端查询验证码并完成流程
发送流程(可选):
- 业务系统调用后端发短信接口
- 后端生成发送任务
- 网关轮询/长连接获取任务
- 网关使用
SmsManager发送短信并回执结果
4. 技术选型建议
- 客户端:Android 原生 Kotlin(推荐)
- 网络层:HttpURLConnection(MVP)
- 本地存储:Room 或轻量 SQLite
- 日志:本地文件 + 后端集中日志
- 保活策略:Foreground Service(前台轮询)
若主项目使用 uniapp,建议通过原生插件封装短信能力,不建议纯前端层直接处理短信底层功能。
5. Android 权限与系统能力
5.3 默认短信应用角色(ROLE_SMS)
部分 Android 系统/ROM 在后台/静默发送短信时,会要求应用先成为“默认短信应用”(ROLE_SMS)。
如果你发现需要手动确认发送(或发送会被系统拦截),请按以下方式处理:
- 首次启动 App,点击保存配置后等待系统弹出“默认短信应用”角色授权(系统界面可能叫“短信应用/默认短信应用”)
- 授权完成后,App 的前台服务会继续轮询并自动发送,无需每次手动确认
说明:
ROLE_SMS授权至少需要一次用户确认,之后应自动生效。
5.1 必要权限
在 AndroidManifest.xml 中声明:
android.permission.RECEIVE_SMSandroid.permission.READ_SMS(如需读取短信内容库)android.permission.SEND_SMSandroid.permission.RECEIVE_BOOT_COMPLETEDandroid.permission.FOREGROUND_SERVICE
运行时动态申请:
RECEIVE_SMSREAD_SMSSEND_SMS
5.2 广播接收
核心广播:
android.provider.Telephony.SMS_RECEIVED
实现方式:
- 注册
BroadcastReceiver - 从 PDU 解析短信发送方、内容、时间戳
- 在接收器中快速落库与入队,避免阻塞主线程
5.3 发送短信
使用 SmsManager:
- 单卡:
SmsManager.getDefault() - 双卡:按
SubscriptionId获取目标SmsManager,避免走错 SIM 卡
5.4 保活策略
- 前台服务常驻(通知栏提示)
- 开机自启恢复服务
- 引导用户关闭电池优化限制
- 失败任务在下次轮询继续重试(可在后续增加失败队列/指数退避)
6. 模块设计
6.1 模块划分
- sms-receiver:短信接收与解析
- sms-sender:短信发送与发送回执
- task-sync:任务拉取、状态上报
- storage:本地缓存与失败队列
- api-client:后端 API 通信
- security:签名、鉴权、加密
6.2 关键数据结构(建议)
InboundSms(入站短信)
idsendercontentreceivedAtparsedCodeparseStatusrawPduHash
OutboundTask(出站任务)
taskIdphonecontentstatus(pending/sending/success/failed)retryCountlastError
7. 后端接口设计(示例)
7.1 鉴权建议
- 网关端通过请求头携带
X-Api-Key: SMS_GATEWAY_API_KEY进行鉴权 - 使用 HTTPS,拒绝明文传输
7.2 API 列表
-
POST /api/v1/sms/inbound- 作用:上报入站短信
- 请求体:发送方、短信内容、时间、解析结果
- 返回:
ackId
-
GET /api/v1/device/tasks?limit=5- 作用:拉取发送任务
- 返回:任务列表
-
POST /api/v1/sms/outbound/result- 作用:回传发送结果
- 请求体:
taskId、状态、失败原因、运营商回执(如有)
8. 验证码解析策略
8.1 正则提取建议
建议预置多个规则,按顺序匹配:
\\b\\d{4}\\b\\b\\d{6}\\b验证码[::\\s]*([0-9]{4,8})
8.2 容错策略
- 同一发送方短时间多条短信,按时间窗口聚合
- 对重复短信做哈希去重
- 解析失败也要上报原文,便于后端二次识别
9. 异常与重试机制
- 网络失败:指数退避重试(如 2s/5s/10s/30s)
- 接口 5xx:自动重试
- 接口 4xx:记录并告警,不无限重试
- 本地持久化失败队列,避免进程被杀导致数据丢失
10. 安全与合规要求
- 严格控制设备与接口访问白名单
- 本地敏感数据最小化存储,必要时加密
- 日志脱敏(手机号中间位、验证码字段)
- 定期轮换设备密钥
- 仅用于已授权业务,不得违反运营商与法律规定
11. 测试计划
11.1 功能测试
- 接收短信:不同发送方、长短信、分片短信
- 发送短信:单卡/双卡、不同运营商号段
- 解析测试:4位/6位/8位验证码、多语言模板
- 任务链路:拉取、执行、回执、重试
11.2 稳定性测试
- 24小时持续运行
- 断网恢复
- 杀进程后自恢复
- 低电量模式、系统省电模式下行为
11.3 压力测试
- 高频短信接收场景
- 并发任务发送场景
- 后端不可用情况下队列堆积与恢复
12. 发布与运维建议
- 渠道:企业内部分发、MDM、私有下载页
- 不建议直接面向公开应用市场发布
- 建立设备监控面板:在线率、延迟、失败率
- 预留远程配置开关:正则规则、重试参数、限流阈值
13. 里程碑计划(建议)
- M1(1周):完成收短信 + 上报 API
- M2(1周):完成发短信任务闭环
- M3(1周):完成保活、重试、日志
- M4(1周):完成灰度部署与稳定性压测
14. 最小可用版本(MVP)范围
- 接收短信并解析验证码
- 上报后端并可查询
- 支持基础发送任务
- 支持失败重试与本地缓存
- 提供基础运行状态页(在线、最近短信、错误信息)
如需继续推进,可在下一步补充:
- Android 端包结构与类图
- 完整
AndroidManifest.xml示例 - Kotlin 核心代码模板(Receiver/Service/SmsManager/API)
- 后端接口 OpenAPI 文档草案