用 SMPP 和 HTTP 接入短信

把测试路由带到生产而不弄坏绑定、窗口和回执:绑定状态、吞吐、心跳、编码、回调与故障处理。

生产环境的短信连接是一份运维约定,不只是一个端点。SMPP 多了绑定状态、吞吐窗口、心跳和会话上的回执;HTTP 多了逐请求认证和回调。这份指南把两者都拆成从测试到生产的一段顺序。

先管住绑定状态

绑定是一条带方向的会话。发送绑定负责提交,接收绑定接收上行短信和回执,收发绑定两者兼顾。服务商为您需要的绑定类型发凭据,客户端要把绑定当成状态来管:正在打开、已绑定、被限流、正在重连、已关闭。把绑定当作永远在线的客户端,第一次掉线就会丢消息。

把绑定状态显式记下来。每次绑定请求和响应、接口版本、system ID 和错误码都写进日志。掉线后按退避重连,不确定短信中心有没有受理之前,不要重放已经在途的提交。唯一可靠的判断依据是 submit_sm_resp 里的 message ID。

绑定与第一次提交

  1. 应用(ESME)
  2. bind_transceiver 建立会话
  3. SMSC
  4. submit_sm_resp 已受理
  5. 送达回执
会话只开一次。每次提交拿到带 message ID 的响应,回执稍后沿同一条会话返回。 来源: smpp.org:SMPP 会话与 PDU 操作
文字说明

客户端发出绑定请求并收到响应。它用 submit_sm 提交短信,收到带 message ID 的 submit_sm_resp。稍后短信中心发来 deliver_sm,携带回执,客户端用 deliver_sm_resp 确认。unbind 关闭会话。

窗口、心跳与编码

窗口是一条绑定上短信中心允许的在途请求数。把在途计数压在窗口以内,发下一波之前先让窗口排空。被限流的提交是降速信号。按原速率重试只会把队列填满,把一条慢短信变成一次拥堵。绑定数量按峰值速率算,不按月均算。

心跳让两端都知道会话还活着。按节奏发 enquire_link,对不再响应的会话要主动关闭。编码方面,内容允许就用 GSM-7,否则用 UCS-2。只要有一个字符不在 GSM-7 字符集里,整条短信就会转成 UCS-2,分段数也可能变。用真实模板测试,把变量值也带上。

送达回执

回执以 deliver_sm PDU 异步到达,携带原始 message ID、状态(已送达、已过期、未送达、未知),往往还有网络错误码。按 message ID 匹配,把状态和消息记录存在一起。不要按到达顺序匹配,也不要把“回执没到”当成“短信失败”。

回执格式因短信中心而异。新的实现用 message_state 这个标签-长度-值字段;旧实现把键值文本放在短消息字段里。两种都要解析。把应用需要的状态归一化,同时保留原始错误码,工单才能追到网络当时到底说了什么。

故障形态与第一步

每一行是一个症状、可能的原因和第一步检查。
症状可能原因第一步检查
绑定被拒凭据、绑定类型或接口版本不对读绑定响应码和接口版本
超时上升窗口超了,或者路由慢重试前先看在途请求数和响应码
绑定开着,没有响应会话已死,或客户端停了心跳发 enquire_link,再退避重连
回执缺失回执没到处理程序重发前先查会话日志和 message ID
字符错误GSM-7 内容按 UCS-2 发,或反过来查数据编码和分段数
回调超时端点慢或不可达快速响应,异步处理,验签

处理时先观察,再只改一个变量。

从测试路由到生产

  1. 连上测试路由

    用测试凭据和生产要用的绑定类型。确认绑定响应和接口版本。

  2. 发真实模板

    测您真正要上线的内容,包括链接、变量和最长的短信。记录编码和分段数。

  3. 读回执

    每条回执按 message ID 匹配。确认应用会收到的状态和错误码。

  4. 测故障路径

    发往无效号码、收件箱已满的手机和被停服务的号码。确认回执状态和应用的处置。

  5. 算窗口

    按峰值速率压测,确认在途请求仍在窗口以内。不够就加绑定。

  6. 开监控

    对绑定状态、提交时延、回执时延和状态分布告警。每条告警都要有明确的处理人。

  7. 切生产流量

    先切一小部分,把回执和测试结果对上,再逐步加量。测试路由留着当备用。

HTTP 认证与回调

HTTP 接入用开户时签发的密钥认证每一次请求。密钥到期前轮换,重叠期内旧密钥继续有效。提交成功会返回带 message ID 的响应,回执和上行短信送到您的回调 URL。

回调端点要验签、快速响应,再处理事件。端点一慢就会触发重试,处理程序不幂等就会产生重复。证书和 DNS 变更时端点仍要可达,回调失败率上升要告警。SMPP 详解讲会话,传输方式对比讲选择。

SMPP 与 DLR 错误码解码

解码器在浏览器里运行,粘贴的回执不会离开本页。

粘贴 command_status、送达回执的 stat/err 字段或十六进制 PDU,查看含义与排查方向。

sample
id:0123456789 sub:001 dlvrd:001 submit date:2610181200 done date:2610181201 stat:DELIVRD err:000 text:您的验证码是 123456
打开工具

常见问题

该用哪个 SMPP 版本?

SMPP 3.4 是部署最广的版本。只有短信中心和您自己的技术栈都支持时,才用 5.0。

需要几条绑定?

足够把峰值速率压在窗口以内,并留出一条绑定故障的余量。每条绑定的配额问服务商。

回调要先响应再处理吗?

要。先验签、返回成功,再处理事件。响应慢会触发重试和重复。

回执一直不来怎么办?

先查会话日志和 message ID。回执没到,不代表短信失败。

故障怎么测?

发往无效号码、收件箱已满的手机和被停服务的号码,分别记录状态和错误码。
  • 全球 A2P 发送方 ID 手册

    发送方 ID 在各市场如何运作:字母数字、数字与短码路径,注册要求与国家示例。

  • A2P SMS

    应用对个人短信:应用经已注册的发送方路由发往用户手机的流量,例如验证码或交易提醒。

  • DLR

    送达回执报告移动网络针对已发送短信返回的状态,例如已送达、已过期、已拒绝或未知。

与我们提供的服务相关

我们在这里说明,因为它会影响您使用我们服务的方式。