Webhook 与 API 场馆集成对比:实用指南

针对场馆和酒店团队的 Webhook 与 API 深度解析。对比延迟、可靠性及安全性,帮助您为 WiFi、POS、预订和住宿系统选择最佳方案。

Webhook vs API for Venue Integrations: A Practical Guide

您正在推进一项历时六周的多场地部署项目。WiFi 采集已上线,收银机已连接,预订数据源源不断,而营销团队只有一个简单的需求:当访客消费、预订、连入 WiFi 或结账时,在恰当的时机发送正确的信息。然而,一条购买 Webhook 接收了两次,导致发放了两份一次性优惠;WiFi 登录记录在接收端重启期间丢失。这并不是因为选择了糟糕的供应商,而是因为您将 Webhook 与 API 仅仅视为了两条可以互换的管道,而生产环境揭示了它们之间的本质差异。

目录

为什么场馆团队会做出错误选择

一家餐饮集团集成了用于登录的 Purple WiFi、用于收据的 Square 或 Epos Now、用于预订的 ResDiary,以及针对客房业务的 Mews。每个供应商都声称支持集成。但每个供应商表达的具体含义略有差异。有的进行事件推送,有的需要轮询,还有的两者兼有,但字段和重试机制各不相同。

团队最先连接了最快的路径。POS 销售触发包含优惠信息的感谢旅程。POS 响应不够迅速,进行了重试,由于接收端未存储事件 ID,导致重新处理了同一笔销售。宾客收到了两条消息,更糟糕的是收到了两个可兑换的优惠码。

遗漏事件是更为隐蔽的故障

在同一个周末,接收端因部署而离线。WiFi 登录事件在发送端排队一段时间后,重试次数耗尽。由于没有计划内的 API 读取来进行恢复,这些宾客便再也无法进入欢迎旅程。报表数据看起来只是稍有下滑,并未显示崩溃。因此无人会因为缺失登录数据而收到告警。

实用规则:将 webhook 视为某事可能已经发生过的信号,而不是当前状态的证明。在发送、发放或核销任何内容之前,请先确认状态。

这些并不是边缘情况。正如 结合 webhook 与 API 进行恢复的指南 中所述,它们是分布式系统的正常行为。交付通常是 至少一次,事件可能会延迟或乱序到达,并且除非您设计了数据对账机制,否则不可用的接收器会导致数据断层。

场馆团队之所以会犯错,主要出于三个可以理解的原因。

  • 他们争论哪种工具更好: 真正有价值的问题是,考虑到延迟需求和出错成本,哪种模式适合每种具体的事件(无论是 WiFi 连接、POS 销售、预订还是结账)。
  • 他们盲目信任数据载荷: 数据载荷只是发送那一刻的快照。在数小时后重试成功之前,用户的同意状态、资格和消费金额都可能发生变化。
  • 他们忽视了恢复机制: 顺利情况下的演示不会展示重复投递、乱序投递,或是接收方在周六营业高峰期宕机的情况。

这是针对餐厅、酒店和零售场所的 IT、数据和 CRM 负责人的实用简报。您将获得核心机制、逐项标准对比、基于事件的建议,以及我们在多门店上线前希望审核的接收器设计。我们的目的并不是要在 webhook vs API 中分出胜负,而是要停止重复的营销活动和遗漏的客户旅程。

Webhook 和 API 的实际作用

首先了解由哪一方发起调用。仅凭这一事实,就足以解释后续的大部分权衡选择。

API 使用拉取模式(pull model)。当您的客户端需要数据或想要执行操作时,它会发送一个 HTTP 请求,然后服务器做出响应。Webhook 则使用推送模式(push model)。当发生特定事件(例如购买、预订、选择订阅或账户更新)时,源系统会向您预先配置好的端点发送 HTTP 请求。这一区别在 Svix 关于 API 提供商采用情况的 Webhooks 现状研究中有详细阐述。

用场馆做类比非常恰当。API 就好比您想看菜单时向服务员索取;而 Webhook 则像服务员在菜品做妥后直接端上桌,无需您专门招呼。

一张教育类信息图,用餐厅类比方式对比了 Webhook 推送数据与 API 拉取数据的方式。

您正在配置的技术机制

这两种模式均使用 HTTP,通常传输 JSON 载荷,在标头中传递元数据,并通过响应代码传达成功或失败。两者的方向相反,运维负担也随之颠倒。使用 API 时,您持有凭据、掌控调用时机,并处理分页和速率限制。而使用 Webhook 时,您暴露一个可公开访问的 URL,验证未由您发起的入站流量,并且必须在不受您控制的负载下快速做出响应。

  • POS 销售: 当交易完成时,收银机发送 webhook,这样无需轮询每台收银机即可启动收据或反馈流程。
  • 住宿历史: 您的平台调用 PMS API 来获取宾客过去的住宿记录、对账结账信息或补全缺失的一周数据。
  • 客群标签刷新: 营销平台按照预定计划通过 API 拉取更新后的记录,而不是对每个字段的更改都做出响应。

它们是互补的层级,而非替代品。针对 100 家知名 API 提供商的调查研究发现,在 2023 年的研究中有 83% 提供了 Webhook 服务,后续报告显示采用率上升至 85%,正如 State of Webhooks 研究 中所记载。提供商并没有用 Webhook 替代 API,而是在其之上增加了事件交付功能。

推送端也会带来拉取端绝不会有的义务。Webhook 端点必须验证签名、容忍重复投递,并记录每个事件以便后续对账,因为无论你是否准备就绪,源端都会再次触发。

如果您要通过共享基础设施路由这两者,了解 GoReplay 撰写的 什么是 API 网关 会很有帮助,因为网关通常处理 API 流量的身份验证、速率限制和路由,而 webhook 接收器则需要在其前端拥有独立的验证和队列。

在审批设计方案之前,先在白板上画出来。在每个箭头上标明发起方。如果你的团队说不出谁在 WiFi 连接与住宿历史查询中调用了谁,你就还没准备好与厂商洽谈。

按关键标准对比 Webhook 与 API

抛开通用的优缺点列表。根据方向、延迟、请求量、失败行为、安全暴露和治理这六个维度为这两种模式打分。下图在详细表格之前直观地展示了这六个标准。

一张对比图表,详细列出了 Webhook 与 API 在六个关键技术标准上的差异。

集成标准对比:Webhook 与 API

评估标准 Webhook API
流量方向 源系统在发生事件时推送至您的端点 客户端根据需要从源系统拉取
延迟 近乎实时,在下方对比中报告为一秒以内 受限于您的轮询间隔时间
请求量 主要在发生变更时发送请求 即使没有任何变更也会重复调用
故障与恢复 至少一次交付,支持重试,可能存在重复项 客户端可随时重试,对账更简便
安全风险 接收器需公开可达,可能存在伪造和重放消息 对每个客户端请求进行身份验证和授权
治理 签名检查、仅追加日志、死信处理 作用域、速率限制、读写审计

延迟和数据量这两行展示了轮询计算的残酷之处。在 Hook0 关于 Webhook 与轮询对比的文档 中的一项具代表性的比较指出,在海量数据场景下,若每秒检查一次,60 秒的轮询间隔会导致平均 30 秒的延迟 以及每天约 1440 万次 API 调用。根据相同的对比数据,将轮询缩短至 5 秒虽然能将平均延迟降至 2.5 秒,但每天的流量将激增至约 1.728 亿次调用。这些是特定场景下的计算结果,而非通用基准,因此请针对您所在区域的提供商延迟、事件频率和速率限制进行实际测量。不过发展趋势显而易见:您无法通过低成本的轮询来实现真正的实时性。

故障与恢复机制的影响是双向的。轮询简单且易于恢复。如果提取失败,只需再次提取并进行对账即可。而 Webhook 则需要队列、背压控制和重放处理,因为发送端决定了流量何时到达 - 包括在您业务最繁忙的服务时段或部署窗口期。

在深入探讨安全性之前,以下流程演练将进一步强化方向与时效方面的差异。

安全风险是非对称的,绝非同一项工作的两种形式。API 安全的核心在于对每个客户端请求进行身份验证。正如 SuprSend 关于 webhook 与 API 安全指南 中所阐述的那样,Webhook 安全还需要保护公开端点免受伪造、重放、畸形和重复消息的攻击。这意味着需要对原始请求进行签名、校验时间戳的新鲜度、使用常数时间比较、强制执行 HTTPS,并确保处理过程具备幂等性。

治理随之而来。请评估传入的事件是否可以安全地更改跨多个场地、时区和审批规则的访客记录或触发发送。在查看 Purple Engage 集成 或任何其他目录时,不要止步于确认是否存在某个品牌 Logo。您还需询问哪些事件进行推送、哪些必须拉取、重试机制如何运行,以及在系统中断后如何证明记录的准确性。

哪些模式适合各种场馆事件

根据两个问题对每个事件进行打分。你必须多快做出反应?基于陈旧或重复数据采取行动的代价是什么?下图是一个有用的提醒,这些事件最初是场所内的物理时刻,而不是数据库中的一行记录。

一名女子在有工作人员的接待台附近使用酒店大堂自助服务终端互动。

WiFi 登录

使用 Webhook 作为触发器。刚刚连接的客人现在就在现场,因此欢迎消息、现场优惠提示或调查邀请一旦延迟就会失去价值。轮询连接事件只会增加延迟,没有任何好处。

不要仅仅依赖数据载荷来创建记录。持久化保存事件 ID,然后在将客人登记入旅程之前确认身份和授权。定期通过 API 读取可以补全接收器宕机期间遗漏的连接事件。

POS 销售

出于同样的原因,Webhooks 也非常适合销售场景,而且涉及的利益更高。笔交易完成可以趁客人记忆犹新时,触发收据、点评邀请或基于消费金额的分段更新。如果您正在评估如 Purple Engage 的 Toast 集成 等收银系统,请仔细核对哪些交易状态会发送事件、退款和撤销是否会发送独立事件,以及部分付款的账单如何显示。这些细节比数据表上的 webhook 字样更为重要。

这种失效模式代价高昂。重复的销售事件可能会导致消费金额被重复计算、归因数据损坏并发放重复的优惠。请确保处理程序具备幂等性,并将 API 记录视为最终消费金额的权威依据。

预订与预约

预订需要两者结合,但更偏向 API。针对新建、变更或取消预订的 Webhook 可让你快速响应,进行确认、提醒或触发旅程步骤。但预订状态会反复改变。人数会变动,时间会调整,押金会到账。

预订 Webhook 是提示您去查看最新状态,而不是对预订现状的最终结论。

在向宾客发送任何内容之前,请先通过 API 获取当前状态。如果您在错过取消预订的 Webhook 后,就直接对早期的数据负载采取行动,您就会给宾客发送提醒,让他们去用餐一个已经取消的预订。

酒店退房与入住住宿

退房会触发住宿后调查和点评邀请,因此 Webhook 可以为你提供及时的启动。住宿历史、客房收入和账单明细则属于 API 读取范畴。它们是历史性的、带分页的,并且在退房后可能会被更正。

仅依赖 Webhook 来获取住宿记录是典型的错误做法。一旦接收端发生故障,整个住宿记录就会从细分数据中缺失。请使用定期 API 对账来弥补这一差距,并在上线新门店或物业时通过 API 进行数据补录。以 Purple Engage 为例,它将 WiFi 登录、POS 收据、预订和酒店住宿整合为单一的客人记录,只有当每个数据源同时具备触发路径和恢复路径时,这一机制才能正常发挥作用。

设计一个在生产环境中不会崩溃的接收器

可靠性不是你购买的厂商功能。它是你在第一个场所上线前做出的系列决策。针对 至少一次投递(at-least-once delivery) 进行设计,而不是恰好一次,其他一切顺理成章。

设计在生产环境中不中断的接收端(Designing a Receiver That Does Not Break in Production)清单信息图,概述了 Webhook 的最佳实践。

快速响应确认,后续异步处理

对请求进行身份验证,将其持久化入队,然后返回成功。请仅将 2xx 响应视为已确认,正如 Svix 关于 Webhook 交付保证的指南 中所述。切勿在请求处理程序内部运行细分、优惠发放或消息发送。处理程序响应过慢会导致超时,超时会触发重试,而重试会使重复数据倍增。

根据上面链接的 Svix 指南,一个记录在案的重试计划会使用 30秒、2分钟、15分钟、1小时、4小时、12小时和24小时 的延迟,在大约 41小时 内总共尝试八次,并带有指数退避和抖动。这就是您的设计必须承受的时间窗口。一天后才送达的重试属于正常现象,而非异常。

消除重复数据的影响

存储提供商的稳定事件标识符,并将其用作幂等键。如果已经处理过该事件,请予以确认并跳过副效应。重试耗尽的投递会转入支持重放的死信队列,以便操作人员进行检查和重新处理,而不是通过宾客投诉才发现数据缺失。

对于将事件流式传输到下游基础设施的团队,Streamkap 的这份 无代码 webhook Kafka 集成指南 是一个有价值的参考,可在无需手动构建接入层的情况下将 webhook 事件引入 Kafka。无论您选择什么,队列都位于接收和业务逻辑之间,这一点至关重要。

先验证后信任

  • 对原始主体(raw body)验证 HMAC 签名:先解析再重新序列化会导致有效的签名失效或误接受无效签名。
  • 检查时间戳时效性:今天重放的过去有效请求必须予以拒绝,这可以防止捕获的有效载荷被二次发送。
  • 使用恒定时间进行比较:普通的字符串比较可能会泄露时间相关的信息。
  • 按来源授权:来自预订提供商的签名不应能够写入 POS 类型的事件。

标准化进程正在推进。Open Webhooks 规范收敛于通用标识符、时间戳和 HMAC-SHA256 签名,RFC 9421 则提供了标准化的 HTTP 消息签名框架。无需等待全面普及,现在就应落实这些控制措施。

在最后时刻重新核验同意状态

治理是场所营销与通用集成建议产生分歧的地方。请保留仅允许追加的审计日志、明确处理场所时区、遵守区域数据处理要求,并在任何发送或优惠发放前立即重新检查当前的同意状态和资格。宾客可能会在初始事件发生与 12 小时后的重试之间选择退出。您的处理程序必须尊重最新的选择,而不是早前的数据载荷。

为什么真正的选择是 Webhook 结合 API

客观的对比并不是 Webhook 与 API 孰优孰劣,而是仅使用 Webhook 对比结合使用 Webhook 和 API。仅使用 Webhook 的方案在生产环境中注定无法胜任。

重试会产生重复数据。事件可能乱序到达,导致取消预订事件比被取消的预订事件更早到达。短暂的停机引发的数据缺失很难被察觉,直到某个细分群体低估了常客数量,或者某项营销活动将不属于它的到店归功于自己。延迟基准测试无法捕获这些问题。

行之有效的一致性模式

  1. 在接收时、开展任何处理之前,持久化保存提供商事件 ID。
  2. 使每个处理程序具备幂等性,从而使第二次交付不会改变任何内容。
  3. 在产生任何副作用、发送消息、发放优惠、变更细分或进行兑换之前,通过 API 获取当前状态。
  4. 针对源快照运行定期对账,以查找遗漏、顺序颠倒或更正后的记录。

请将 Webhook 视为门铃,而将 API 视为确认谁在门外。这种构想与 WebinOne 针对开发者推出的 开发者视角下的 Webhook 与 API 对比 相吻合,该内容涵盖了开发者的实现选择。而对于场馆团队而言,最关键的是运营层面的影响。就像 Purple Engage 访客数据 中描述的统一视图一样,只有当为其提供数据的每个来源都具备恢复路径而不仅仅是触发器时,访客记录才是值得信赖的。

设计测试:如果您的接收端在最繁忙的周六离线一小时,您明天能否证明每一次 WiFi 登录、销售、预订和结账都被准确无误地恢复了恰好一次?如果不能,说明您尚未具备成熟的混合设计。

如果忽略数据对账,成本就会不断累积。重复的旅程会打扰顾客并浪费优惠预算;过时的分群会将昨天刚光顾过的顾客误认为是流失客户;由于重复计算购买或遗漏结账,归因分析会夸大增量影响。这些都不会在仪表板中显示为集成错误,但它们会让营销活动逐渐失去信任。

第一次就构建混合架构。虽然它不如实时演示那样炫酷,但这是区分“能承受多门店推广的集成”与“团队不再信任的集成”的关键所在。选择 webhook 处理低延迟信号,选择 API 获取权威状态和恢复,对于任何可以发送消息或发放优惠的系统,绝不单单采用其中一种。


如果您正在计划多场地部署,并希望将 WiFi、POS、预订和住宿数据聚合到单个带有签名 Webhook、公开 API 的客人记录中,且在发送前再次核实同意状态,请探索 Purple Engage,并根据上述混合清单审查其集成能力。您可以带上最复杂的事件 - 例如决不能重复发生的 POS 销售或结账记录,测试该设计是否能在网络中断后恢复数据。

More ways to bring guests back