我只是想知道如何处理来自第三方API的webhook。
就我而言,我需要处理Stripe中的Webhooks。
所以我用
主要实施是:
到目前为止一切正常。
但是,我们假设
在这种情况下,我觉得我需要考虑使用后台工作。
如果您的webhook脚本执行复杂的逻辑或进行网络调用,则在Stripe完全执行之前脚本可能会超时。因此,您可能希望通过返回2xx HTTP状态代码>让您的webhook端点立即确认收到,然后执行其余的职责。
这是我的代码, 我只是想知道我应该将哪一部分捆绑并入队?
StripeEvent.event_retriever = lambda do |params|
return nil if StripeWebhook.exists?(stripe_id: params[:id])
StripeWebhook.create!(stripe_id: params[:id])
return Stripe::Event.construct_from(params.deep_symbolize_keys) if Rails.env.test? # fetching the event from Stripe API
return Stripe::Event.retrieve(params[:id])
end
StripeEvent.configure do |events|
events.subscribe 'invoice.created', InvoiceCreated.new # handling the invoice.created event in service object
events.subscribe 'invoice.payment_succeeded', InvoicePaymentSucceeded.new
...
end
答案 0 :(得分:0)
简短答案,只需通过将Stripe::Event
实例序列化为带有Marshal::dump的字符串来发送所有答案,然后使用Marshal::load将其在后台工作程序中反序列化回到Stripe::Event
我们还希望使用delayed_job系统在后台处理Webhook请求,该系统将作业存储在数据库表中,并将作业参数存储在字符串列中。
为此,我们首先需要将Stripe::Event
序列化为StripeEvent.configure
块中的字符串:
# event is an instance of Stripe::Event
serialized_event = Marshal::dump(event)
然后,我们将后台作业排队而不是同步处理,将序列化的事件作为字符串传递到存储它的位置(在本例中为数据库表)以等待处理。
然后,我们的后台工作人员代码可以将读取的字符串反序列化为Stripe::Event
:
event = Marshal::load(serialized_event)