短信API与SMPP对比:该用哪种连接方式?
短信API与SMPP全面对比:会话与bind、窗口机制、吞吐量、送达回执、编码方式、TLS安全、运维成本以及迁移步骤,帮助工程团队判断该用REST、SMPP还是两者混合使用,找到最适合自己业务量和团队能力的短信对接方案,少走弯路。
作者: OmniChannels.ai Editorial Team · 审阅: BroadNet Messaging Solutions Team
集成
简短回答
验证码、告警和通知等应用类流量,以及同时还需要WhatsApp、RCS或其他渠道的场景,请使用REST短信API:它是无状态的HTTPS,易于做好安全防护,开发也快。如果您的短信发送量大且持续、已经在运行SMPP客户端或在转售短信,则使用SMPP,因为带窗口机制的持久bind能让大量消息同时在途。许多企业会在一个账户上两者并用。
本页内容
要点速览
- REST短信API把每条消息作为独立的HTTPS请求发送;SMPP则保持一个称为bind的长连接会话,并在其上交换二进制PDU。
- SMPP的吞吐量取决于窗口机制:如果客户端每发一条都要等到submit_sm_resp才发下一条,就会浪费大部分连接能力。
- REST的送达状态通过Webhook到达;SMPP的送达回执则以deliver_sm PDU的形式在同一会话上到达,每一条都必须确认。
- SMPP v3.4没有内置加密,所以生产环境的bind应当运行在TLS上,并只允许白名单中的源IP地址。
- SMPP只承载短信,因此用REST处理多渠道流量、用SMPP处理批量短信的混合方案,是常见的长期架构。
本指南面向正在决定如何连接短信服务商的工程师和技术负责人:通过HTTP/REST短信API、通过SMPP,还是两者兼用。文中解释二者在网络传输层和运维层面的真实差异,帮助您为每类流量选择合适的接口,并在初始选择不够用时规划迁移。
想进一步了解包括Webhook和幂等性在内的对接模式,请参阅我们的消息API对接指南。
短信API与SMPP有什么区别?
REST短信API把每条消息作为独立的HTTPS请求发送,并返回一个消息ID。SMPP(Short Message Peer-to-Peer)则保持一个长期存在、经过身份验证的会话,并在其中双向交换称为PDU的二进制消息。REST为简单而优化,SMPP为持续的短信发送量而优化。
| REST短信API | SMPP v3.4 | |
|---|---|---|
| 传输方式 | HTTPS请求与响应 | 持久TCP会话,生产环境用TLS封装 |
| 状态 | 无状态;每个请求独立 | 有状态的bind,带序列号和保活 |
| 鉴权 | 请求头中的Bearer token | bind中的system_id和密码,外加IP白名单 |
| 渠道 | 短信,以及通过多渠道API支持的WhatsApp、RCS等 | 仅短信 |
| 吞吐模型 | 每秒请求数,外加批量接口 | 每个bind每秒消息数,借助窗口机制让大量消息在途 |
| 送达回执 | 带标准化状态的JSON Webhook | 会话上的deliver_sm PDU,文本回执格式 |
| 编码 | 类似messageType(TEXT或UNICODE)的字段 |
data_coding(GSM-7为0,UCS-2为8),长消息使用UDH |
| 工具 | 任意HTTP客户端、SDK、OpenAPI | SMPP客户端库 |
| 运维成本 | 低 | 中等:连接、重连、窗口、回执 |
| 最适合 | 应用、验证码、通知、多渠道 | 聚合商、代理商、有SMPP经验的高发送量用户 |
REST短信API是如何工作的?
您携带token和JSON请求体发起一个HTTPS POST,服务商返回一个ID。每个请求都是独立的,因此您可以从任何服务器、函数或容器发送,而无需管理连接。
使用我们的API,典型的发送请求如下:
curl -X POST https://api.broadnet.me/sms/sendSms \
-H "Authorization: Bearer $BROADNET_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"senderId": "OmniDemo",
"destinationNumber": "971500000000",
"message": "Your OmniDemo code is 482913",
"messageType": "TEXT"
}'
响应是200 OK,消息ID以纯文本形式返回。最终状态稍后会通过Webhook以SUBMITTED、SENT、DELIVERED、FAILED或REJECTED的形式到达。字段名称和选项见短信API参考。
REST的优势:
- **熟悉的工具:**任何语言、任何HTTP客户端,以及RFC 9110所定义的标准状态码。
- **安全易做:**全程TLS,并在
Authorization头中携带token。 - **无需连接的批量发送:**一次请求即可上传收件人文件,而无需建立会话。
- **一个API覆盖多个渠道:**同样的模式可以发送WhatsApp模板或RCS卡片。
REST的局限:每条消息或每批消息都要付出一次HTTP往返,并且在碰到运营商限制之前,您会先碰到每秒请求数的限制。对大多数应用流量来说,这一点从来不重要。
SMPP是如何工作的?
SMPP是由SMPP v3.4规范定义的二进制协议,该规范由SMPP开发者论坛(后来的SMS Forum)发布,至今仍是部署最广泛的版本。您的系统称为ESME(External Short Message Entity),它连接到服务商的SMSC(Short Message Service Centre,短信服务中心),并打开一个称为bind的会话。
bind类型
- Transmitter(TX),使用
bind_transmitter:仅提交消息。 - Receiver(RX),使用
bind_receiver:仅接收送达回执和上行消息。 - Transceiver(TRX),使用
bind_transceiver:在一个会话上两者兼备。这是通常的选择。
会话生命周期
- 向服务商提供的主机和端口建立TLS连接。
- 用您的
system_id和密码发送bind_transceiver,并等待command_status为0的响应。 - 用
submit_sm发送消息。每个submit_sm_resp都会返回一个message_id。 - 以
deliver_sm形式接收送达回执,并对每一条回复deliver_sm_resp。 - 空闲时定期发送
enquire_link,让双方都知道会话仍然存活。 - 用
unbind关闭,并等待unbind_resp。
每个PDU都带有序列号,响应携带相同的序列号,您就是靠它把submit_sm_resp与发出的消息匹配起来。我们的SMPP文档结合我们的配置逐步说明了每一步。
什么是SMPP窗口机制?为什么重要?
窗口机制是指在响应返回之前先发送多个submit_sm PDU。允许在途的未确认PDU数量就是窗口。这是SMPP能比逐个HTTP请求维持更高吞吐量的主要原因。
窗口为1时,您的客户端发送一条消息,等待完整的一次往返响应,再发送下一条。吞吐量受网络延迟的限制,而不是您约定的速率。窗口更大时,响应返回期间连接始终保持繁忙。
经验法则:
- 使用服务商与您约定的窗口大小,绝不要超过;多出的PDU可能被拒绝。
- **遵守每个bind约定的速率。**如果收到
ESME_RTHROTTLED,请放慢速度并退避重试。 - 跟踪未完成的序列号,这样断线时不会丢失哪些消息已被接受的信息。
- 通过增加bind数量来扩展(上限为您账户约定的数量),而不是不断增大窗口。
我们REST API和SMPP bind的默认限制列在错误与限制中;您账户的具体限制在开通访问权限时确认。
送达回执有何不同?
在REST上,服务商向您的Webhook推送一个JSON事件。在SMPP上,回执以deliver_sm PDU的形式出现在会话上,esm_class中设置了回执位。两者都是异步的;无论200 OK还是submit_sm_resp,都不意味着手机收到了消息。
SMPP v3.4规范以示例的形式给出回执文本格式,并把确切格式留给SMSC厂商,但大多数服务商都遵循它:
id:2603121407537573731 sub:001 dlvrd:001 submit date:2610100914 done date:2610100915 stat:DELIVRD err:000 text:Your OmniDemo code
如果您的系统同时使用两种接口,请把SMPP状态映射到统一的状态模型。典型映射如下:
SMPP stat |
含义 | 标准化状态 |
|---|---|---|
ACCEPTD |
已接受,中间状态 | SENT |
DELIVRD |
已送达手机 | DELIVERED |
UNDELIV |
无法送达 | FAILED |
EXPIRED |
有效期已结束 | FAILED |
REJECTD |
被拒绝,例如发件人被封 | REJECTED |
DELETED |
在送达前被删除 | FAILED |
UNKNOWN |
无状态信息 | 保留最后一个已知状态 |
比格式更重要的是两个实际差异:
- **确认。**SMPP客户端必须回复每一条
deliver_sm。未确认的回执会被重发,还可能拖慢bind。Webhook处理器也出于同样原因需要迅速回复2xx。 - **恢复。**如果SMPP客户端断线,回执会等待下一次bind,也可能在服务商的队列中过期。在REST上,服务商可能提供按日期范围重新推送回执的功能。请询问两者各自如何运作。
关于每种状态的含义,请阅读消息送达状态详解。
编码是如何处理的?
两种接口都必须在GSM-7和Unicode之间选择,也都会把长消息拆成多个分段。区别在于由谁来做这项工作。
- **REST:**您把
messageType之类的字段设置为TEXT或UNICODE,由平台对长消息分段。我们的API还提供POST /sms/identify,可先统计字符数和分段数。 - **SMPP:**您设置
data_coding(默认GSM-7字符集为0,UCS-2为8),并自行对字节编码。对于长消息,您要么为每个部分添加User Data Header并把esm_class设为0x40,要么在服务商支持时,把整段文本放进message_payload字段发送。
根据3GPP TS 23.040,一条短信承载140个八位字节:160个GSM-7字符或70个UCS-2字符;加入头部后每个部分降为153或67个。哪怕只有一个阿拉伯字母或一个emoji,整条消息就会变成Unicode。编码错误是最常见的SMPP集成故障,所以请用阿拉伯语、emoji和长文本做测试。请参阅我们的字符限制指南。
两者的安全模型如何比较?
REST依靠TLS和每次请求携带的bearer token。SMPP v3.4自身不带加密,并在bind中发送凭证,因此要依赖周边的传输层和网络控制。
对于SMPP:
- 使用TLS(RFC 8446定义了TLS 1.3)或专线;绝不在公共互联网上使用明文SMPP。
- 登记源IP地址,使只有您的服务器能够bind。
- 将
system_id和密码作为密钥存放,各环境分开,泄露时立即轮换。 - 监控bind失败,它可能意味着配置错误或凭证被滥用。
对于REST:
- token只放在服务器端,绝不要放进移动应用或浏览器代码。
- 避免把用户名和密码放在URL里的旧式HTTP接口,它们会最终落入日志。
- 用HTTPS、不可猜测的路径和严格的请求体校验保护Webhook。
两种方案各自的运维成本是什么?
REST几乎不增加运维负担:请求要么成功,要么返回一个可以重试的错误。SMPP则增加了一个需要您监控和维护的长期运行组件。
SMPP客户端需要:
- 连接管理,使用带退避和抖动的重连,而不是紧凑的循环;
- 保活,以及对静默的半开连接的检测;
- 每个bind的窗口和速率控制;
- 序列号跟踪,以及断线后的对账;
- 回执的确认与存储;
- 编码与分段拼接逻辑;
- 监控bind状态、吞吐量、限流错误和回执延迟。
成熟的开源库能处理协议本身,但围绕它的行为,包括服务商在凌晨3点的维护窗口期间,依然由您的团队负责。
各自应该在什么时候使用?
除非有明确的理由增加SMPP,否则请使用REST。
在以下情况选择REST短信API
- 您从应用发送验证码、告警、通知或营销活动;
- 除短信外,您还需要WhatsApp、RCS或其他渠道;
- 您的平台运行在无服务器函数或短生命周期的容器上;
- 您的团队没有SMPP经验,也没有构建它的必要。
在以下情况选择SMPP
- 您的短信发送量大且持续,并且已触及REST的限制;
- 您已经在运行SMPP网关或消息平台;
- 您是聚合商、运营商或转售商,要接入自己客户的短信流量;
- 您需要在多个上游服务商之间使用同一种协议。
混合方案是什么样的?
许多企业在一个账户上同时使用两者:多渠道和应用流量走REST,批量短信走SMPP。陷阱在于最终出现两套送达模型。
- **按使用场景路由,**而不是随机:例如验证码和WhatsApp走REST,批量的账单短信走SMPP。
- 将来自Webhook和
deliver_sm的状态标准化,写入以消息ID为键的同一张表。 - 由于无论使用哪种接口,报备都同样适用,因此在两者上使用同一套Sender ID策略。
- 统一报告,让跨两个接口发送的活动呈现一份结果。
如何从短信API迁移到SMPP?
循序渐进,在两种接口同时运行的情况下,先衡量,再转移流量。
- **确认需求:**记录REST无法满足的发送量或吞吐量。
- **申请开通:**提供目的国家、Sender ID、预期峰值吞吐量和源IP地址。
- 在您的技术栈中选择一个成熟的客户端库,并用自己的发送接口封装它。
- **先构建回执处理,**并映射到与Webhook相同的状态模型。
- **测试编码:**在真机上测试GSM-7、阿拉伯语、emoji和多段消息。
- **测试故障:**在发送过程中切断连接、触发限流并检查对账。
- **并行运行:**把某类流量的一小部分迁到SMPP,对比送达情况和回执。
- 分步转移流量,并保留REST作为回退路径。
示例bind配置如下。主机、端口和限制均为占位符,真实值随您开通的凭证一并提供。
host: <provided with your bind>
port: <TLS port provided with your bind>
bind type: transceiver
system_id: <your system_id>
password: <your password>
system_type: (empty unless told otherwise)
interface_version: 0x34
source_addr_ton/npi: 5 / 0 (alphanumeric sender ID)
dest_addr_ton/npi: 1 / 1 (international number)
registered_delivery: 1 (request delivery receipts)
data_coding: 0 (GSM-7) or 8 (UCS-2)
enquire_link: every 30 seconds while idle
window: as agreed for your account
实战示例:一家区域零售商为账单短信引入SMPP
“Souq Rafiq”(虚构)是一家在阿联酋、埃及和约旦运营的线上零售商,通过REST API发送验证码和订单更新,WhatsApp模板也通过同一个API发送。向全体客户群发送的每月账单短信,增长到了REST任务耗时超出业务期望的程度。
- **决定:**验证码、订单更新和WhatsApp继续使用REST。每月账单短信迁移到SMPP transceiver bind。
- **开通:**团队登记了两个源IP,确认各国的Sender ID,并约定吞吐量和bind数量。
- **开发:**一个小型SMPP服务使用开源库,把回执写入Webhook所用的同一张状态表,并对外提供与REST路径相同的内部发送接口。
- **测试:**在多款手机上确认阿拉伯语账单为UCS-2编码,且分段拼接正确。
- **上线:**先迁移一个国家。把送达情况和回执时间与REST基线对比之后,其他国家依次跟进,并保留REST作为回退。
常见错误
- **为了面子而选SMPP。**如果REST已满足您的发送量,SMPP只会增加工作量。
- **窗口设为1,**然后怪服务商吞吐量低。
- **不确认
deliver_sm,**导致回执被重发和限流。 - 断线后**在紧凑循环里重连,**可能看起来像攻击。
- 在同一个PDU中**混用
short_message和message_payload,**导致长度错误。 - **在互联网上使用明文SMPP,**暴露凭证和内容。
- 混合方案中**两套状态模型,**导致报表互相矛盾。
- **局限:**本指南描述的是通行做法。窗口大小、速率、TLS端口和回执细节因服务商和账户而异;请在开通时确认。
OmniChannels.ai 如何提供帮助
OmniChannels.ai两种方式都提供。位于https://api.broadnet.me的REST API使用Bearer token,在短信之外还覆盖WhatsApp、RCS、Messenger、Instagram、Telegram、邮件和推送,送达状态以统一格式推送到您的Webhook。对于高并发短信,按账户开通基于TLS的SMPP 3.4 bind,限定白名单源IP,并使用BroadNet运营商直连网络上相同的短信线路。代理商和批发合作伙伴可获得专用bind。请从SMPP文档或快速入门开始,或查看开发者概览。
常见问题
SMPP比短信API更快吗?
SMPP能维持更高的吞吐量,因为一个持久会话可以让大量消息同时在途,而不必为每条消息发起新的HTTP请求。对于单条验证码,差异很少能被察觉,因为运营商的送达时间才是主导因素。两种接口的吞吐量都由您的账户限制决定,所以请向服务商索取文档化的限制,而不要想当然地认为SMPP总是更快。
可以通过SMPP发送WhatsApp消息吗?
不可以。SMPP是用于短信及相关短消息服务的协议。WhatsApp、RCS、Messenger、Instagram、邮件和推送都使用HTTP API。如果需要多个渠道,请对它们使用REST API,仅在需要时再为高并发短信增加SMPP。
什么是SMPP bind?
bind是您的客户端(称为ESME)与服务商SMSC之间经过身份验证的SMPP会话。您先建立TCP或TLS连接,再用system_id和密码发送bind_transmitter、bind_receiver或bind_transceiver。transceiver bind在一个会话上既提交消息又接收送达回执,这是通常的选择。
SMPP安全吗?
SMPP v3.4本身不加密流量,凭证在bind请求中发送。生产环境的bind请运行在TLS上,把连接限制在已登记的源IP地址,将system_id和密码作为密钥存放,一旦泄露立即轮换。应避免在公共互联网上使用明文SMPP。
SMPP和REST的送达回执有什么不同?
在SMPP上,回执以deliver_sm PDU的形式到达,文本中带有类似stat:DELIVRD的内容,您的客户端必须以deliver_sm_resp作为回复。在REST上,服务商会向您的Webhook推送一个JSON事件,带有DELIVERED或FAILED之类的标准化状态。两者都是异步的:已被接受的提交永远不是送达的证明。
从短信API迁移到SMPP需要多长时间?
如果使用成熟的SMPP库,慢的部分并不是写代码。开通配置更耗时:约定吞吐量和bind数量、登记源IP,以及测试回执和编码。在把流量迁过去之前,请规划一段并行运行期,先让一小部分流量走SMPP。
资料来源
继续阅读
更多指南集成
如何通过 Webhook 将 CRM 接入全渠道收件箱
通过 Webhook 将 CRM 接入全渠道收件箱的技术指南:应该同步哪些事件、如何做幂等处理与失败重试、如何匹配联系人、如何满足数据隐私合规要求,并附参考架构,帮助出海企业打通客户沟通与客户管理数据,减少人工录入,并附吉达诊所集团的实操案例。
8 分钟阅读
集成
如何选择消息 API:CTO 选型清单
如何选择消息 API:面向 CTO 的选型清单,涵盖渠道覆盖、线路质量、Webhook、安全、限流、重试、SMPP、MCP、合规与定价,并提供加权评分表和冒烟测试方法,帮助出海企业用实测数据做出可向财务和安全团队交代的决策。
13 分钟阅读
全渠道
消息渠道代理定价:批发价与利润率
详解消息渠道代理商的定价逻辑:短信、WhatsApp、RCS与语音的批发价如何构成,怎样设定按线路的零售加价、选择预付费或后付费以管控信用风险、按月核对账单,并守住利润空间,同时把汇率、税费和坏账风险一并算清,避免低价抢单反而亏本。
13 分钟阅读
