如何使用webhooks升级Stripe API版本?

问题描述 投票:0回答:1

我是在回答自己的问题,但我想,我之所以写这个,是因为我在这个问题上颇为纠结,我也很想听听其他的答案。

环境问题

我们正在使用Stripe服务器端进行支付(一次性和订阅),并使用Stripe webhooks在我们的DB中记录支付和事件。我们在一个负载平衡器后面有多台服务器,我们使用的是金丝雀滚动部署,所以在部署过程中,并不是所有服务器都运行相同的代码版本。

问题是

当你想升级Stripe API版本时,经常会有一些突破性的模型变化(例如新的或重命名的字段),需要修改代码。而如果你不经常升级,可能会有很多变化! 咳嗽 😬

在滚动部署期间有一个问题。

  • 如果你等到所有服务器都部署了新的代码库,才在Stripe仪表板上更新Stripe版本,那么 "新的 "服务器可能会在部署过程中出错,因为他们接收的是旧的JSON格式的webhooks。
  • 如果您在所有服务器部署之前更新了Stripe版本,那么 "老 "服务器可能会抛出错误,因为它们与新的JSON格式不兼容。
  • 如果您在部署时更新Stripe版本......您会得到两者的混合。

Stripe允许你设置多个webhook URL,每个都有自己的API版本。但所有匹配的事件都会被发送到所有的webhook URLS上。 这一点我一开始根本不清楚)。

在新的Stripe Java库中也有一个机制,当事件模型不匹配时,可以实现你自己的 "异常处理程序",但这需要编写代码,并跟踪上次升级后的每一个模型变化,在我们的情况下,这太多了 :)

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

stripe-payments
1个回答
0
投票

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

  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版本。

这很复杂,我觉得自己想多了。在部署过程中,还有一小部分事件不被处理的可能性(因为两个事件版本都去了忽略的服务器)。

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


0
投票

你也可以直接 通过API创建一个新的webhook端点。 并将其指向新升级的代码库--这可能是最好的方法。

© www.soinside.com 2019 - 2024. All rights reserved.