Rails 上的条纹 Webhook

Posted

技术标签:

【中文标题】Rails 上的条纹 Webhook【英文标题】:Stripe Webhook on Rails 【发布时间】:2012-03-26 12:31:06 【问题描述】:

我知道存在另一个与此类似的问题,但我认为它的问/答不是很好。

基本上,我有一个可用的 rails 应用程序,用户可以在其中注册我的订阅、输入信用卡信息等。一切正常。但我需要处理在此定期订阅期间某个时候用户的卡被拒绝的情况。

他们发送的事件类型在这里:https://stripe.com/docs/api?lang=ruby#event_types。

我在访问我的应用程序中的 charge.failed 对象时遇到问题。

webhook 上的文档也在这里:https://stripe.com/docs/webhooks,我们将不胜感激。

【问题讨论】:

Using Stripe webhooks with Rails的可能重复 【参考方案1】:

您需要创建一个控制器来基本上接受和处理请求。这很简单,尽管最初并不那么直接。这是我的 hooks_controller.rb 的示例:

class HooksController < ApplicationController
  require 'json'

  Stripe.api_key = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

  def receiver

    data_json = JSON.parse request.body.read

    p data_json['data']['object']['customer']

    if data_json[:type] == "invoice.payment_succeeded"
      make_active(data_event)
    end

    if data_json[:type] == "invoice.payment_failed"
      make_inactive(data_event)
    end
  end

  def make_active(data_event)
    @profile = Profile.find(User.find_by_stripe_customer_token(data['data']['object']['customer']).profile)
    if @profile.payment_received == false
      @profile.payment_received = true
      @profile.save!
    end
  end

  def make_inactive(data_event)
    @profile = Profile.find(User.find_by_stripe_customer_token(data['data']['object']['customer']).profile)
    if @profile.payment_received == true
      @profile.payment_received = false
      @profile.save!
    end
  end
end

def 接收器是您必须将 webhook 指向条带接口上的视图。视图接收 json,我使用它来更新用户的个人资料,以防支付失败或成功。

【讨论】:

很好!!我想你是对的,一开始有点吓人,但一旦我明白了,这没什么大不了的。我的控制器实际上看起来有点像这样(虽然不那么漂亮)。谢谢! 非常有帮助!仅供参考,JSON 解析的结果不是一个无关紧要的哈希,因此您可能想要改用 event_json = JSON::parse(request.body.read).with_indifferent_access。 为了获得最佳 [安全] 实践,请使用事件 ID (data_json['id']) 检索 Stripe::Event 对象,然后从中获取数据,因为它肯定是合法的。 - 如Stripe's webhooks reference page所述。 您可以使用 Stripe gem 中的 Stripe::Event.construct_from(params) 避免 json 解析。 看到控制器上的方法不是 :actions 也不是私有的,这让我很害怕【参考方案2】:

现在使用stripe_event gem 更容易:

https://github.com/integrallis/stripe_event

【讨论】:

【参考方案3】:

这是一个不太理想的测试情况……

Stripe 需要一种“强制”webhook 以用于测试目的的方法。目前,您可以订阅的最短时间为 1 周(在测试模式下);如果您可以将其设置为 1 分钟、1 小时,甚至只是让回调实时发生,这将更有帮助,因此您可以测试您的 API 响应系统。

本地测试很棒,但没有什么能取代现实世界、实时、通过互联网、网络挂钩/回调。不得不等待一周 (!) 会严重拖慢项目速度。

【讨论】:

现在,最短为 1 天,但仍同意您的看法。

以上是关于Rails 上的条纹 Webhook的主要内容,如果未能解决你的问题,请参考以下文章

Stripe checkout form - 页面上的表单索引 - Ruby on Rails

条纹卡验证在开发与生产中的行为不同

更改信用卡信息(条纹)

小wordpress上的条纹支付图标

条纹“invalid_request_error” - 卡号未从表单传递到模型方法

条纹结帐键盘隐藏付款按钮