条带 webhook 未按正确顺序传入的错误

Posted

技术标签:

【中文标题】条带 webhook 未按正确顺序传入的错误【英文标题】:Error with stripe webhooks not incoming in correct order 【发布时间】:2021-11-29 17:41:01 【问题描述】:

我一直在将 stripe_event gem 用于来自 stripe 的 webhook,今天我发现 webhook 似乎没有按正确的顺序传入。我正在存储在条带上进行的费用的本地副本,并且我有以下设置

StripeEvent.configure do |events|
  events.subscribe 'payment_intent.created', CreateChargeRecord.new
  events.subscribe 'payment_intent.processing', UpdateChargeRecord.new
  events.subscribe 'payment_intent.succeeded', UpdateChargeRecord.new
end

查看条纹仪表板,事件payment_intent.created 总是在payment_intent.processing 之前完成。现在我正在按如下方式创建收费记录

class CreateChargeRecord
  def call(event)
    charge_object = event.data.object
    Charge.create(
      user: User.find_by(stripe_id: charge_object.customer),
      receiver_id: User.find_by(merchant_id: charge_object.transfer_data.destination).id,
      amount: charge_object.amount / 100,
      currency: 'eur',
      application_fee_amount: charge_object.application_fee_amount / 100,
      status: charge_object.status,
      stripe_id: charge_object.id
    )
  end
end

更新如下

class UpdateChargeRecord
  def call(event)
    charge_object = event.data.object
    charge = Charge.find_by(stripe_id: charge_object.id)
    charge.update!(status: charge_object.status)
  end
end

问题在于,从 cli 看来,webhook payment_intent.processing 似乎在 payment_intent.created 之前被接收

2021-10-10 22:08:50   --> payment_intent.processing 
2021-10-10 22:08:51   --> payment_intent.created 
2021-10-10 22:08:51  <--  [200] POST http://localhost:3000/webhooks/
2021-10-10 22:08:51  <--  [500] POST http://localhost:3000/webhooks/

导致错误NoMethodError (undefined method update!' for nil:NilClass):` 因为我正在尝试更新一条尚不存在的记录。

我可以在这里做些什么来防止这种情况发生,因为这似乎不是条带的错误?

【问题讨论】:

请求是异步的,但您正在尝试同步处理它们。我只会存储所有按其类型键入的事件,并有一些匹配的后台作业按时间间隔运行,并使用其状态更新任何新付款 【参考方案1】:

这是expected and documented -- 事件可能按照它们的生成顺序无序传递。

为了解决这个问题,您的应用程序应该知道这是可能的,例如,当接收到事件时,您可以直接从 API 检索最新的对象状态,而不是使用有效负载。

【讨论】:

以上是关于条带 webhook 未按正确顺序传入的错误的主要内容,如果未能解决你的问题,请参考以下文章

如何/我可以在条带 webhook 处理程序中调用 FASTAPI 异步函数,还是我的方法完全错误?

如何在 symfony 5 中实现条带 webhook?

CLGeoCoder 未按正确顺序附加地标

位图文件未按正确的顺序保存在内存中

使用 ngrok 的条带 webhook 没有答案

Webhook 签名验证失败并出现快速条带