Sha256: 764646d0640f3fa6d4b2bf328b52e68c2a68c046b9731a4d8858ca6d921dd148

Contents?: true

Size: 1.34 KB

Versions: 6

Compression:

Stored size: 1.34 KB

Contents

module StripeEvent
  class WebhookController < ActionController::Base
    if Rails.application.config.action_controller.default_protect_from_forgery
      skip_before_action :verify_authenticity_token
    end

    def event
      StripeEvent.instrument(verified_event)
      head :ok
    rescue Stripe::SignatureVerificationError => e
      log_error(e)
      head :bad_request
    rescue StripeEvent::ProcessError
      head :unprocessable_entity
    end

    private

    def verified_event
      payload          = request.body.read
      signature        = request.headers['Stripe-Signature']
      possible_secrets = secrets(payload, signature)

      possible_secrets.each_with_index do |secret, i|
        begin
          return Stripe::Webhook.construct_event(payload, signature, secret.to_s)
        rescue Stripe::SignatureVerificationError
          raise if i == possible_secrets.length - 1
          next
        end
      end
    end

    def secrets(payload, signature)
      return StripeEvent.signing_secrets if StripeEvent.signing_secret
      raise Stripe::SignatureVerificationError.new(
              "Cannot verify signature without a `StripeEvent.signing_secret`",
              signature, http_body: payload)
    end

    def log_error(e)
      logger.error e.message
      e.backtrace.each { |line| logger.error "  #{line}" }
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
stripe_event-2.11.0 app/controllers/stripe_event/webhook_controller.rb
stripe_event-2.10.0 app/controllers/stripe_event/webhook_controller.rb
stripe_event-2.9.0 app/controllers/stripe_event/webhook_controller.rb
stripe_event-2.8.0 app/controllers/stripe_event/webhook_controller.rb
stripe_event-2.7.0 app/controllers/stripe_event/webhook_controller.rb
stripe_event-2.6.0 app/controllers/stripe_event/webhook_controller.rb