如何让 Stripe 手动将事件重新发送到 webhook

Posted

技术标签:

【中文标题】如何让 Stripe 手动将事件重新发送到 webhook【英文标题】:How to make Stripe manually resend an event to webhook 【发布时间】:2019-06-18 08:23:56 【问题描述】:

我一直在使用 Stripe API,并且它已经成功调用了我的 Webhook 大约一年了。

但是昨天第一次出现问题。 webhook 没有成功完成其预期的操作,但还是返回了 200 状态码,因此 Stripe 没有重试。

我现在已经修复了 Webhook 上的错误,但不知道如何让 Stripe 为这个特定事件重复 webhook 调用。我可以检索事件,但没有重新发送的按钮。怎么做?

【问题讨论】:

正如其他人指出的那样,您无法让 Stripe 重新向您发送 webhook 成功响应的事件,但是由于您可以在 Stripe 中提取事件并显示已交付的 JSON 有效负载,您可以使用 CURL 或任何其他工具使用相同的 JSON 有效负载向您的 webhook 端点发出请求。 【参考方案1】:

既然返回了 200,那么检索该事件将是您最好的选择。目前无法手动重试(https://stripe.com/docs/webhooks#responding-to-a-webhook):

在实时模式下,我们将尝试在最多三天内以指数级回退方式交付您的 webhook。在测试模式下,我们会在几个小时内重试 3 次。在此之后无法手动重试 Webhook,但您可以查询事件以将您的数据与任何错过的事件相协调。

通过仪表板查看有关特定事件的信息时,您可以通过单击 Webhook 详细信息部分中的端点 URL 来查看我们尝试将事件发送到端点的次数。这将向您显示我们从您的端点收到的最新响应,以及所有尝试过的 webhook 的列表以及我们收到的相应 HTTP 状态代码。

【讨论】:

这不再是真的;现在可以在 Stripe 仪表板中在返回 200 时进行手动重试(参见下面的屏幕截图)。【参考方案2】:

可以手动重新发送 webhook 事件。

在 Stripe 控制面板中,选择 Developers > Webhooks,然后找到您正在使用的 webhook 并按下“重新发送”小图标。

请注意,对于成功的事件,您仍然可以通过单击省略号然后“重新发送”来重新发送它们(这是一项较新的功能)。

【讨论】:

是的,这适用于失败的调用,但不适用于返回 200 状态代码的调用。 它有效,我最近也这样做了。现在我面临一个新问题,显示的 webhook 尝试不会超过 15 天前。 @Sygmoral 限制不再存在 - 您现在可以重新发送返回 200 状态代码的事件。【参考方案3】:

Stripe cli 允许 stripe events resend IDOFTHEEVENT --live --webhook-endpoint=IDOFTHEWEBHOOK(将 IDOFTHEEVENT 替换为事件的 id,将 IDOFTHEWEBHOOK 替换为 webhook 的 id,当您在 webhook 的页面上时,您可以在 URL 中找到它)。

否则,您可以复制/粘贴发送到 webhook 的事件,然后使用 postman 等工具将其发送到您的端点。

【讨论】:

即使事件超过 15 天也有效!也就是说,请确保使用密钥stripe login --api-key sk_live_... 对 CLI 进行身份验证,否则您将收到如下权限错误:"The provided key 'rk_live_...' does not have the required permissions for this endpoint on account 'acct_...'. Having the 'rak_webhook_write' permission would allow this request to continue." 请注意,如果您在测试模式下测试事件,则需要删除 --live。并使用在测试模式下生成的 webhook 和事件的 ID。

以上是关于如何让 Stripe 手动将事件重新发送到 webhook的主要内容,如果未能解决你的问题,请参考以下文章

测试 Stripe 的 trial_will_end webhook

Stripe checkout - 如何绑定提交事件?

如何使用 ngrok 测试接收 Stripe webhook

无法将数据从 Stripe webhook 发送到 Firebase

Stripe 创建后获取订阅 ID

将 WM_POWERBROADCAST 发送到其他进程