当消息结束时,在决定是否重试或排查投递问题之前,先检查其终端事件和错误码。
whatsapp.rejected 是什么意思?
Bird 在分发前拦截了消息,且未对其计费。
收件人检查和计费可能产生拒绝结果。使用附带的错误码选择下一步操作:
| 错误码 | 原因 | 下一步操作 |
|---|---|---|
undeliverable | 没有可用的收件人地址 | 修正收件人 |
recipient_suppressed | 收件人已被屏蔽 | 遵守退订并检查同意记录 |
price_not_found | Bird 无法为此次发送定价 | 联系支持团队并提供消息标识符 |
insufficient_balance | 钱包余额不足或组织无法被计费 | 解决计费问题后再次发送 |
未定价的发送会被拒绝,而不是被视为免费。重复相同的请求不会补齐缺失的价格。
拒绝时间戳使用的是最初接受的时间。在报表中保持一致使用该时间戳,以免队列延迟将拒绝移到后一个报告周期。
whatsapp.failed 是什么意思?
消息在发送或投递过程中失败,原因记录在错误详情中。
Meta 可以通过投递回调报告失败,也可以在接受消息投递之前拒绝 Bird 的发送请求。
当发送号码没有可用凭证或处理用尽重试次数时,Bird 会记录 internal_error。meta_error_code 是 Meta 记录的错误码,而 Bird 码不携带此信息。
重试耗尽可能包含传输错误或上游故障。不要仅凭 internal_error 就推断 Meta 从未收到请求。
检查描述和发送号码的连接状态。当原因仍不明确时,向支持团队提供消息标识符。
失败可能发生在计费之后。检查消息的 cost,而不是假设每次未成功的发送都是免费的。
为什么 undeliverable 出现在两种事件中?
在拒绝中,Bird 无法寻址收件人。在失败中,它是 Bird 对 Meta 拒绝的标准化结果。
错误码的含义不仅限于手机无法接收消息。当 Meta 错误码没有更具体的映射时,Bird 也会使用 undeliverable。
读取 meta_error_code 获取 Meta 记录的错误码,读取 description 获取附带的说明。没有错误详情的失败仍会收到 undeliverable。
其他标准化失败码标识了更具体的问题:
| 错误码 | 需要排查的内容 |
|---|---|
service_window_expired | 是否在服务窗口之外发送了自由格式内容 |
rate_limited | Meta 的发送或收件人限制 |
media_rejected | Meta 拒绝的媒体资源 |
internal_error | Bird 记录的处理或发送失败 |
在日志中保留不熟悉的错误码。错误码集合可能会扩展,未知值不应使原本可用的事件无效。
我的事件处理程序应如何解读结果?
根据事件类型及其错误码一起进行分支处理。
被拒绝的消息不会进入已发送事件。失败的消息需要其错误详情来区分内部故障和 Meta 的响应。
将投递状态与互动分开。whatsapp.read 事件记录已读,但不会替换消息的投递状态。
Bird 在发送成功后发出自己的 whatsapp.sent,不会根据 Meta 单独的已发送状态回调创建另一个事件。
模板审核使用一组不同的状态。当问题出在审批时,请检查模板的语言,而非这些消息结果。
再次发送之前应该做什么?
在发送另一条消息之前,先修正记录的原因。
对于 service_window_expired,使用已批准的模板或等待客户的消息重新打开服务窗口。
对于屏蔽,遵守收件人的选择。移除退订会忽略收件人的意愿并带来合规风险。
对于计费或发送方连接问题,先解决该账户状况。保留原始消息标识符,以便支持团队检查未成功的尝试。
如果号码或 Business Account 被限制或封禁,请在重试之前按照账户限制和申诉步骤操作。
对于不确定的传输失败,先排查再创建新消息。新的发送可能会重复一个结果未被观测到的请求。
简而言之
拒绝不计费。
当收件人检查或计费阻止发送时,Bird 会在分发前拦截消息。
失败可能来自 Bird 或 Meta。
在决定排查方向之前,先检查记录的错误。
internal_error不携带 Meta 错误码。结合事件和错误码进行判断。
undeliverable出现在两种事件中,其含义取决于消息在哪个阶段停止。根据原因选择恢复方式。
在尝试再次发送之前,先纠正收件人、账户、内容或时间问题。保留不熟悉的错误码以供排查。