ruby-on-rails - 通过 Stripe Checkout 支付后如何更改 Rails 对象字段?
问题描述
在我的应用程序中,用户可以创建对象的草稿,然后在“最终确定”视图中,他们可以检查他们是否只想要标准价格或两个额外功能之一(例如,他们的条目在平台上被推荐) ) - 这些存储为三个单独的产品,每个产品都有自己的价格,因为我希望将来能够单独跟踪它们。
我正在使用 Checkout 进行付款,我的后端是 Rails。
我正在听 webhook,但我不知道如何实际修改相关对象,因为我看不到任何包含我需要的信息的 webhook 请求正文。
我想我需要的是这样的:“已经成功收取了$x
与您的 id 对象相关123
的费用,并且费用包括产品prod_asdf
和prod_sdfg
”,然后我可以更新我的对象的例如 thepaid
和featured
boolean 字段。
这似乎很简单,因为产品和价格实际上是由 Stripe 处理的,并且它们被传递到结帐会话,我不明白为什么我不能从 webhook 访问它们?
编辑:我想知道是否将必要的元数据传递给 Session 对象,然后使用相同的元数据监听checkout.session.completed
事件是一个好主意。
解决方案
创建结帐会话时,您可以通过在元数据 ( https://stripe.com/docs/api/checkout/sessions/object#checkout_session_object-metadata )中包含相关对象 ID 将结帐会话链接回您的列表对象。当您监听checkout.session.completed
事件时,该事件将带有一个 Checkout Session 对象。您可以通过检查元数据轻松地将结帐会话链接回您的列表对象,它还有一个amount_total
字段,以便告诉您总付款金额。
您可以从line_items
( https://stripe.com/docs/api/checkout/sessions/object#checkout_session_object-line_items ) 获取会话中包含的产品。不幸的是,line_items
默认情况下不包含在 webhook 事件中,因为它是可扩展的 ( https://stripe.com/docs/expand )。收到checkout.session.completed
事件后,您可以使用 ID 检索 Checkout Session,line_items
扩展如下:
session = Stripe::Checkout::Session.retrieve(
id: 'cs_test_xxx',
expand: ['line_items'],
)
line_items = session.line_items
或者,您可以像这样检索结帐会话的行项目(https://stripe.com/docs/api/checkout/sessions/line_items):
line_items = Stripe::Checkout::Session.list_line_items('cs_test_D3OF4MY1VGflR8idkewd795t8MLd4PwA3wxdLCHikdRFTIkBecH6FKij', {limit: 5})