条带 Webhook 事件 checkout.session.completed 出现 500 错误

问题描述 投票:0回答:4

我目前正在为我的 Rails 应用程序开发 stripe webhook,但遇到了问题。除

checkout.session.completed
之外的所有事件均有效。 我的主要目标是当事件
booking.paid
发生时,将付款状态
true
更改为
checkout.session.completed
。 stripe webhooks 日志为我提供了事件
checkout.session.completed
的 500 内部服务器错误。我认为问题出在我的 Webhook 控制器中,但我就是不知道出了什么问题。任何帮助都会很棒!

这是我的 Webhooks_controller:

 class WebhooksController < ApplicationController
  skip_before_action :authenticate_user!
  skip_before_action :verify_authenticity_token

  def create
    payload = request.body.read
    sig_header = request.env['HTTP_STRIPE_SIGNATURE']
    event = nil

    begin
      event = Stripe::Webhook.construct_event(
        payload, sig_header, Rails.application.credentials[:stripe][:webhook]
      )
    rescue JSON::ParserError => e
      status 400
      return
    rescue Stripe::SignatureVerificationError => e
      # Invalid signature
      puts "Signature error"
      p e
      return
    end

    # Handle the event
    case event.type
    when 'checkout.session.completed'
      # session = event.data.object
      # @booking.session.client_reference_id.paid = true
      booking = Booking.find_by(checkout_session_id: event.data.object.id)
      booking.update(paid: true)
    end

    render json: { message: 'success' }
  end
end
ruby-on-rails ruby stripe-payments payment
4个回答
1
投票

我恰好正在编写与您完全相同的功能,所以我很高兴它出现在我的队列中。

快速浏览一下代码,没有什么特别突出的地方。如果我们知道唯一不起作用的事件是

checkout.session.completed
,并且这是我们正在处理的唯一事件,那么问题就会缩小一点......所以这就是我所做的:

  1. 我将您的实现复制到我的 Rails API 项目中的控制器中,然后使用 Stripe CLI 来侦听并将 Stripe 事件转发到新端点:
$ stripe listen --forward-to http://localhost:3000/webhook_events
  1. 我注释掉了事件的实际处理,因此它只是处理事件。

  2. 然后我在新终端中使用 Stripe CLI 来触发

    checkout.session.completed
    事件:

$ stripe trigger checkout.session.completed
  1. 完成此操作后,我的 API 响应为
    201
    ,Stripe 很高兴。

因此,正如前面的答案所表明的那样,我认为问题在于您更新

Booking
模型,因此我有一些建议可以使使用 webhooks 变得更容易:

  1. 理想情况下,一旦您使用 Stripe gem 验证了事件的真实性,您的控制器应该立即向 Stripe 发出
    2xx
    响应。
  2. 完成后,我会立即使用 ActiveJob 将事件处理转移到后台作业。
  3. 在后台作业中,您知道您的事件有效并且会话已成功完成,因此现在您可以开始更新您的
    Booking
    模型。该作业的参数可以像 Stripe 结帐会话 ID 一样简单。
  4. 最后,像这样划分职责将使编写测试变得更加容易(并且会发现实际问题是什么!)。

我希望这有帮助,祝你好运!


0
投票

我认为问题可能出在

Booking.find_by
方法上。尝试添加一行来检查
booking
的值,然后再更新其状态。


0
投票

当“checkout.session.completed”时

在此使用 print(session) 它将在控制台中显示影响或在结账会话中显示 500 错误的错误


0
投票

stripe webhooks 旨在处理很少的代码,然后传递到另一个路由。您的 Booking 集合可能太大,搜索太长,导致 Webhook 崩溃。看看这个

© www.soinside.com 2019 - 2024. All rights reserved.