如何识别 Stripe webhooks 类型?

Posted

技术标签:

【中文标题】如何识别 Stripe webhooks 类型?【英文标题】:How to identify Stripe webhooks type? 【发布时间】:2016-06-11 07:00:15 【问题描述】:

我正在使用 Stripe,我需要了解如何仅处理 Stripe 在幕后生成的 webhook。当我的服务器向 Stripe 发送内容(新订阅、新的个人费用)时,Stripe 将生成通过我提供的 webhook 发送的事件。好吧,我不需要处理这些,因为它会造成混乱。我只想在以下情况下处理 Stripe 生成的 webhook:续订收费失败、通过 Stripe 仪表板进行手动修改、仪表板中生成的退款等)。

我查看了生成的事件,但找不到任何与我的 API 调用生成的事件或幕后生成的事件有所不同的东西。

我有什么遗漏吗?

更新 - API 调用:事件有一个request id - 幕后条纹:事件有 null request_id - 条纹仪表板:事件有一个request id (这仍然是一个问题)

如果我丢弃所有 not null 的 webhook 事件,我也会丢弃 Stripe 仪表板事件。我需要在幕后处理 Stripe 以及 Stripe 仪表板生成的事件。

【问题讨论】:

【参考方案1】:

首先,Stripe 目前不支持识别传入的 webhook 事件类型。查看仪表板,我确实可以看到是什么引发了事件(API、仪表板或自动),但 Stripe 的人说他们不支持它。

但是,有一个解决方法。对于任何为此苦苦挣扎的人,我将描述我所做的事情。 Stripe 自动生成的事件很容易区分。它包含一个 null request 字段。任何其他类型的事件都会有一个request id(例如:re_123h2kj18321hjk3218)。问题仍然在于区分 API 和 Stripe Dashboard 生成的请求。因此,解决方案是为 API 生成的每个请求捕获请求 id。每当 webhook 到达您的服务器时,您检查请求字段是否不在存储系统(数据库等)中或请求为空。这意味着事件是由仪表板或由 Stripe 自动生成的(订阅续订)。

步骤:

挂钩到 Stripe 提供的 CurlClient。扩展该类并 覆盖 request() 方法。请求方法返回 由 Stripe 服务器生成的响应。捕获headers 的 包含Request-id 的响应。将其存储在您的 存储(在我的情况下是数据库) 在您的配置文件中,您需要指定 Stripe 应该使用您自己的 CurlClient。 ApiRequestor::setHttpClient(new CurlClient());(我也给我的 CurlClient 起了名字,但你可以随便命名) 当 Webhook 到达时,您可以通过三个选项来识别类型:
    自动:如果事件有request=null 仪表板:request is not null 并且请求不在您的存储中 API:您只剩下一种情况。该请求不为空,但存在于您的数据库中

如您所见,要完成一些非常简单的工作需要做很多工作。 Stripe 需要做的就是在他们的 webhook 事件名称中提供另一个字段,例如 request-type 和三个选项(api、自动、仪表板)。他们已经有了这个构建,但他们不允许它在 webhook 事件中显示。

【讨论】:

【参考方案2】:

在事件对象documentation 上,您将看到request 属性documented。只要事件来自 API 请求,就会设置此属性。否则,如果它是 null,则表示没有与之关联的 API 请求,这就是我们在仪表板中调用的自动事件。

您需要放弃任何request 不是null 的事件!

【讨论】:

我越来越近了。你说的对。幕后的 Stripe 确实会生成 null 请求。然而,一个问题仍然存在。在 Stripe Dashboard 中执行的任何“手动”操作都会生成带有 request_id 的事件。由于我将丢弃请求不为空的所有 webhook,因此我将丢弃在 Stripe 仪表板中采取的任何操作。是否可以区分 API 生成请求和从仪表板生成的请求? AFAIK 不幸的是,没有办法做这样的事情。这里最好的解决方案是在您创建或修改的对象上设置代码集元数据,以便在仪表板中或自动发生没有元数据的任何事情。 最后我找到了一种可行的方法。谢天谢地,我在 freenode 的#stripe IRC 频道上得到了一些帮助。

以上是关于如何识别 Stripe webhooks 类型?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何在 C# WCF 中接收 Stripe api webhook

如何在 firebase 函数中检查 Stripe webhook 签名

如何延迟 Rails 控制器操作,直到 Stripe 的 webhook 成功?

如何在 `charge.succeeded` Webhook 上检索 Stripe 的 `ClientReferenceId`?

如何使用 ngrok 测试接收 Stripe webhook