所有文章
webhook debuggingreplaytestingcallbacks

Webhook 重放:无需重新触发即可调试

Webhook 重放 会把先前捕获的 HTTP 回调重新发送到你的本地处理器,而无需让上游服务商再次投递该事件。你不必重新触发一笔 Stripe 扣款、一次 GitHub 推送或一条 Twilio 消息,而是从请求历史中重放完全相同的请求——请求头、请求体,一应俱全。

为什么 Webhook 重放很重要

Webhook 调试通常陷入一个痛苦的循环:触发事件、检查投递、找到 bug、修复代码、再次触发。重新触发上游事件既慢又嘈杂,有时甚至不可能(一次性支付事件、已删除的资源,或受速率限制的测试 API)。

重放压缩了这个循环。捕获一次,修复处理器,反复重放同一个负载直到通过——完全不必碰外部服务商。

Webhook 重放如何工作

  1. 回调到达你的隧道 URL 并被转发到本地应用。
  2. 隧道工具捕获完整请求:方法、路径、请求头和请求体。
  3. 你根据捕获请求中看到的内容修复处理器代码。
  4. 你用一个动作把捕获的请求重放到本地端点。
  5. 重复直到处理器返回正确响应。

这个工作流需要一个内置请求捕获的 localhost 隧道——而不仅仅是流量转发。

Webhook 重放的使用场景

处理器开发

迭代地构建和测试 Webhook 处理器。在打磨解析逻辑时,把同一个 Stripe checkout.session.completed 事件重放十次。

幂等性测试

服务商在重试期间会投递重复事件。多次重放同一负载,确认你的处理器能安全处理重复,不会重复扣款或产生重复记录。

签名校验调试

当签名校验失败时,用完整的请求头重放原始请求,以判断问题出在校验逻辑还是负载解析。

回归测试

保存来自贴近生产的测试事件的捕获请求,在重构后重放它们,以在部署前捕捉破坏性变更。

用 PortPreview 进行 Webhook 重放

  1. 启动你的应用并运行 npx portpreview 3000
  2. 配置服务商把回调发送到隧道 URL。
  3. 触发一个测试事件,并在 PortPreview 中检查捕获的请求。
  4. 修复处理器,然后重放捕获的请求。
  5. 验证响应状态和响应体,无需重新触发服务商。

PortPreview 保留原始请求头,因此服务商的签名校验在重放期间依然有意义。

重放与重新触发:何时用哪个

  • 重放:处理器逻辑 bug、负载解析、幂等性检查、签名调试。
  • 重新触发:测试服务商端的事件生成、验证 Webhook 注册,或与服务商实时状态的端到端集成。

关于各服务商的设置,请参阅 本地测试 Stripe Webhook本地测试 GitHub Webhook本地测试 Twilio Webhook 的指南。

Webhook 重放的最佳实践

  • 始终在重放时校验签名,而不仅是首次投递时。
  • 通过多次重放同一事件来测试重复投递。
  • 在功能分支期间保留请求历史以供回归检查。
  • 使用测试模式凭据,使重放的事件绝不影响生产数据。

加入 PortPreview 等候名单,把 Webhook 捕获与重放内置到你的隧道工作流中。

常见问题

什么是 Webhook 重放?
Webhook 重放把先前捕获的回调请求重新发送到你的本地处理器,无需重新触发上游服务商。你复用请求历史中完全相同的请求头和请求体。
为什么 Webhook 重放比重新触发事件更好?
重放是即时的,不依赖服务商速率限制、一次性事件或测试 API 的可用性。你在迭代处理器代码时无需等待外部系统。
Webhook 重放会保留签名请求头吗?
会,只要你的隧道工具原样捕获并重放原始请求。PortPreview 保留请求头,因此 Stripe、GitHub 等服务商的签名校验在重放期间有效。