class Webhooks::StripeController < ApplicationController skip_before_action :verify_authenticity_token def create payload = request.body.read sig_header = request.env["HTTP_STRIPE_SIGNATURE"] begin event = Stripe::Webhook.construct_event( payload, sig_header, ENV["STRIPE_WEBHOOK_SECRET"] ) rescue Stripe::SignatureVerificationError => e # Invalid signature return head 400 end case event["type"] when "transfer.payout.succeeded" payout_id = event.data.object.metadata["payout_id"] payout = Payout.find(payout_id) if payout && payout.processing? payout.update!(status: :completed, stripe_payout_id: event.data.object.id) end when "transfer.payout.failed", "transfer.canceled" payout_id = event.data.object.metadata["payout_id"] payout = Payout.find(payout_id) if payout payout.update!(status: :failed) end end head 200 end end