首页 > 解决方案 > 通过 Stripe Checkout 支付后如何更改 Rails 对象字段?

问题描述

在我的应用程序中,用户可以创建对象的草稿,然后在“最终确定”视图中,他们可以检查他们是否只想要标准价格或两个额外功能之一(例如,他们的条目在平台上被推荐) ) - 这些存储为三个单独的产品,每个产品都有自己的价格,因为我希望将来能够单独跟踪它们。

我正在使用 Checkout 进行付款,我的后端是 Rails。

我正在听 webhook,但我不知道如何实际修改相关对象,因为我看不到任何包含我需要的信息的 webhook 请求正文。

我想我需要的是这样的:“已经成功收取了$x与您的 id 对象相关123的费用,并且费用包括产品prod_asdfprod_sdfg”,然后我可以更新我的对象的例如 thepaidfeaturedboolean 字段。

这似乎很简单,因为产品和价格实际上是由 Stripe 处理的,并且它们被传递到结帐会话,我不明白为什么我不能从 webhook 访问它们?

编辑:我想知道是否将必要的元数据传递给 Session 对象,然后使用相同的元数据监听checkout.session.completed事件是一个好主意。

标签: ruby-on-railsstripe-payments

解决方案


创建结帐会话时,您可以通过在元数据 ( 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})

推荐阅读