【问题标题】:How to upgrade Stripe API version with webhooks如何使用 webhook 升级 Stripe API 版本
【发布时间】:2020-09-30 14:50:00
【问题描述】:

我正在回答我自己的问题,但我想我会写这篇文章,因为我在这个问题上遇到了很多困难,而且我也有兴趣听到其他答案。

环境

我们正在使用 Stripe 服务器端进行支付(一次性和订阅),并且我们正在使用 Stripe webhook 在我们的数据库中记录支付和事件。我们在负载均衡器后面有多个服务器,并且我们使用金丝雀/滚动部署,因此在部署期间并非所有服务器都运行相同的代码版本。

问题

当您想要升级 Stripe API 版本时,经常会发生需要更改代码的重大模型更改(例如新的或重命名的字段)。如果您不经常升级,可能会有很多变化! 咳嗽 咳嗽 ????

在滚动部署期间有一个 catch-22:

  • 如果您等到所有服务器都部署了新代码/库来更新 Stripe 仪表板中的 Stripe 版本,“新”服务器可能会在部署期间抛出错误,因为它们正在接收旧 JSON 格式的 webhook。
  • 如果您在部署所有服务器之前更新 Stripe 版本,那么“旧”服务器可能会抛出错误,因为它们与新的 JSON 格式不兼容。
  • 如果您在部署时更新 Stripe 版本...您会得到两者的混合。

Stripe 允许您设置多个 webhook URL,每个都有自己的 API 版本。 但所有匹配的事件都会发送到所有 webhook URL(起初我并不清楚)。

在较新的 Stripe Java 库中还有一种机制可以在事件模型不匹配时实现您自己的“异常处理程序”,但它需要编写代码并跟踪自上次升级以来的每个模型更改,在我们的例子中是……太多了:)

同样对于较新的 Stripe 库,您不能覆盖 Stripe 版本:它现在是硬编码的(这很有意义)。

【问题讨论】:

    标签: stripe-payments


    【解决方案1】:

    我对这个问题的解决方法如下:

    1. version 参数添加到Stripe 中的webhook URL(例如https://example.net/stripe/webhook?version=2019-xx-yy 与当前使用的API 版本)。
    2. 在 webhook 处理程序中,在解析事件 JSON 之前,将 version URL 参数与当前库/代码版本进行比较:如果它们匹配,则处理事件。否则,忽略它(首先部署该更改)。
    3. 确保 webhook 处理程序跟踪已处理的事件 ID,并且不会重新处理它们。
    4. 将服务器代码和库版本升级到新的 Stripe API 版本。
    5. 在部署新代码之前,在 Stripe 中为新版本添加第二个 webhook URL(例如https://example.net/stripe/webhook?version=2020-zz-tt)。此时,服务器将收到每个事件的两个副本,但由于版本不匹配,它们将“丢弃”新格式的事件。
    6. 开始金丝雀/滚动部署。
    7. 在推出期间,旧服务器将仅处理旧事件,而新服务器将仅处理“新”事件。每个事件都发送两次,因此第 3 步至关重要,因为可能不希望多次处理同一事件。
    8. 部署完成后,删除旧的 webhook URL 并在 Stripe 控制面板中升级 API 版本。

    这很复杂,我觉得我想多了。在部署期间仍有一些事件不会被处理的可能性很小(因为两个事件版本都会转到忽略它的服务器)。

    所以我很好奇是否有人有更简单的解决方案。

    【讨论】:

      【解决方案2】:

      您也可以只 create a new webhook endpoint via the API 并将其指向新升级的代码库 - 这可能是最好的方法。

      【讨论】:

      • 但是它会在旧服务器上抛出 404,不是吗?
      • 这取决于很多事情,但获取不同 API 版本的事件的唯一方法是使用 API 创建新的特定于版本的端点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-05
      • 1970-01-01
      相关资源
      最近更新 更多