module Webhooks class StripeController < ActionController::API def create payload = request.body.read sig_header = request.env["HTTP_STRIPE_SIGNATURE"] unless MatchLiveTv.stripe_webhook_secret.present? Rails.logger.info("[Stripe webhook] ignored — STRIPE_WEBHOOK_SECRET not set") return head :ok end event = ::Stripe::Webhook.construct_event( payload, sig_header, MatchLiveTv.stripe_webhook_secret ) Billing::Stripe::WebhookHandler.call(event) head :ok rescue JSON::ParserError, ::Stripe::SignatureVerificationError => e Rails.logger.warn("[Stripe webhook] #{e.message}") head :bad_request end private def stripe_object_from_hash(hash) OpenStruct.new(hash.transform_keys(&:to_s).transform_values do |v| v.is_a?(Hash) ? stripe_object_from_hash(v) : v end) end end end