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