我一直在使用stripe_event gem来处理来自stripe的网络钩子,今天我发现这些网络钩子似乎没有按正确的顺序传入。我正在存储在条带上生成的费用的本地副本,并且我有以下设置
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更新!‘对于nil:NilClass):`因为我正在尝试更新一个还不存在的记录。
有什么我可以做的来防止这种情况,因为这似乎不是一个错误,根据条带?
发布于 2021-10-11 03:24:44
这是expected and documented --事件可能会从它们生成的顺序开始无序地传递。
为了说明这一点,您的应用程序应该意识到这是可能的,例如,当接收到事件时,您可以直接从API检索最新的对象状态,而不是使用有效负载。
https://stackoverflow.com/questions/69518285
复制相似问题