Techioz Blog

ストライプ Webhook イベント checkout.session.completed の 500 エラー

概要

現在、Rails アプリケーションのストライプ Webhook に取り組んでいますが、問題が発生しています。 checkout.session.completed を除くすべてのイベントは機能しています。 私の主な目標は、イベント checkout.session.completed が発生したときに、支払いステータスの Booking.paid を true に変更することです。ストライプ Webhook ログには、イベント 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

解決策

私はたまたまあなたとまったく同じ機能を書いているので、これが私のキューに表示されてうれしいです。

コードをざっと見ただけでは、特に目立った点はありません。機能しない唯一のイベントが checkout.session.completed であり、それが処理さえしている唯一のイベントであることがわかっている場合、問題は少し絞り込まれます…そこで私がやったことは次のとおりです。

$ stripe listen --forward-to http://localhost:3000/webhook_events
$ stripe trigger checkout.session.completed

したがって、前の回答が示唆しているように、問題は予約モデルの更新にあると思います。そのため、一般的に Webhook の操作を容易にするためのいくつかの提案があります。

これがお役に立てば幸いです、頑張ってください!