跳转到正文
OmniChannels.ai

API 与 SMPP

如何通过 Webhook 接收送达回执?

更新于

简短回答

要通过 Webhook 接收送达回执,需提供一个接受 POST 请求的 HTTPS 接口,并把其 URL 登记到消息服务商。收到事件先存储,快速返回 2xx 状态码,再异步处理。用消息 ID 匹配事件、去重,并避免迟到的状态覆盖最终状态。

配置接口

开发阶段可用内网穿透工具,为本地服务器生成公网 HTTPS 地址。

  1. 提供一个接受 JSON 请求体 POST 请求的 HTTPS 接口。
  2. 把 URL 提供给服务商,配置到正确的账户或子账户下。
  3. 向自己的号码发送测试短信,并记录原始事件内容。
  4. 根据真实事件映射所需字段,而不是凭假设的字段名。
  5. 为所用的每个渠道保留示例数据,作为测试样本。

会收到哪些状态?

服务商会把运营商和渠道的回执转换为自己的状态名称。以下是 OmniChannels.ai 在短信、WhatsApp 等渠道统一使用的标准化状态。

状态含义是否为终态?
SUBMITTED已接收并排队否
SENT已交给运营商或渠道否
DELIVERED已确认送达设备通常是;之后可能出现 READ
READ已打开(仅限支持已读回执的渠道)是
FAILED未送达,并尽可能附带原因是
REJECTED被拒绝,例如 Sender ID 未注册是

让处理程序可靠运行

  • 先存储原始内容,再返回 2xx。如果存储失败,返回 5xx 以便事件被重试。
  • 把实际处理放到队列或工作进程中,而不是在响应之前完成。
  • 按消息 ID 去重;同一状态可能到达两次。
  • 为状态设定优先级,避免迟到的 SENT 覆盖 DELIVERED。
  • 遇到无法识别的状态值时照常接收,不要报错。
  • 切勿在 Webhook 处理程序内部重发短信。

保障安全并补收遗漏的回执

只接受 HTTPS,使用足够长且难以猜测的路径,校验请求体结构,并在退款等不可逆操作前先通过状态查询接口确认状态。如果您的接口曾经宕机,可请服务商重新推送该时段的回执,或从其报表接口读取状态。

在 SMPP 方式下,回执通过绑定以 deliver_sm 的形式到达,而不是 Webhook。部分运营商回执延迟甚至不返回,因此应将其视为有力证据,而非已读的证明。

官方来源