Webhook处理后台工作?

时间:2017-02-12 14:57:46

标签: ruby-on-rails stripe-payments webhooks

我只是想知道如何处理来自第三方API的webhook。

就我而言,我需要处理Stripe中的Webhooks。

所以我用

  • StripeEvent处理和监听webhook处理程序的入口。它提供了一个易于使用的界面来处理来自Stripe的事件。

主要实施是:

到目前为止一切正常。

但是,我们假设

  • 处理webhook hanlder中的一些复杂逻辑
  • 收听许多webhook请求

在这种情况下,我觉得我需要考虑使用后台工作

Best practices in stripe doc

  

如果您的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

1 个答案:

答案 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)