【问题标题】:Stripe: webhook events orderStripe:webhook 事件顺序
【发布时间】:2018-12-12 19:33:04
【问题描述】:

您应该如何处理通过 webhook 接收的事件可以按随机顺序接收的事实?

例如,给定以下有序事件:

  • A:invoiceitem.created(数量为 1)
  • B:invoiceitem.updated(数量从 1 到 3)
  • C:invoiceitem.updated(数量从 3 变为 2)

您如何确保接收 C-A-B 不会导致数据损坏(即数量为 2 而不是 3)?

如果 Event#data 中的 previous_attributes 与当前状态不对应,您可以拒绝 webhook,但是如果您的本地模型已经更新,您将被卡住,因为您永远不会发现自己处于webhook 期望的状态。

或者您可以使用将任何 webhook 视为检索和更新对象的提示。您只需忽略 webhook 发送的数据并始终检索它。 即使您收到按更新/删除/创建排序的事件,它也应该可以工作,因为更新实际上会创建对象,删除会删除它,而创建将无法检索对象并且什么也不做。 但是,当 webhook 将数据作为事件数据提供时,每次检索数据感觉就像是在浪费资源。

这个问题是asked before,但答案不包括上述解决方案。

谢谢

【问题讨论】:

  • 我会选择后者。使用事件知道我应该获取对象的最新状态并信任该最新状态
  • 您可能需要考虑将此扩展讨论移至您链接到的现有问题,而不是使用非常相似的原始问题。
  • 另外,要考虑的另一种方法是对所有 Stripe webhook 事件使用 created 通用字段。您可以为传入的请求实现一个小的保留区域,并按正确的日期顺序处理它们。
  • @dmulter 我做到了。提到该帖子以表明我已完成作业。发布是因为原始问题主体的目标不明确:OP 的最后一个问题是对节点模块的请求。另外,尽管是实际答案,但我对旧问题的答案被忽略了,并且担心作为答案的问题不会引发太多辩论。

标签: api stripe-payments webhooks


【解决方案1】:

如果您的应用程序对可能及时发生的此类更改敏感,您真的应该使用该事件作为检索对象的信号,正如@koopajah 在他们的评论中指出的那样。这是确保您拥有最新状态的唯一方法。

【讨论】:

    猜你喜欢
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多