ストライプ 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 の操作を容易にするためのいくつかの提案があります。
これがお役に立てば幸いです、頑張ってください!