DEV Community

Discussion on: Handling stripe webhooks with Ruby on Rails

Collapse
 
superails profile image
Yaroslav Shmarov

Receiving Stripe Webhooks 101

Webhooks = incoming POST requests from external services.

To receive incoming Stripe webhooks you do not need any gem.

First configure dashboard.stripe.com to receive wehooks (as described above)

Next, You need to add a route in routes.rb

   resources :webhooks, only: [:create]
Enter fullscreen mode Exit fullscreen mode

add a webhooks controller app/controllers/webhooks_controller.rb

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.dig(: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
      @user = User.find_by(stripe_customer_id: session.customer)
      @user.update(subscription_status: 'active')
    when 'customer.subscription.updated', 'customer.subscription.deleted'
      subscription = event.data.object
      @user = User.find_by(stripe_customer_id: subscription.customer)
      @user.update(
        subscription_status: subscription.status,
        plan: subscription.items.data[0].price.lookup_key,
      )
    end

    render json: { message: 'success' }
  end
end
Enter fullscreen mode Exit fullscreen mode

now you can receive webhooks when a subscription was updated or deleted, or when a checkout was completed.

git source

video source

Have a nice day!

Collapse
 
nklbigone profile image
nkl_alexis • Edited

thank you very much for your hard work

I am testing webhook locally I can receive 200 status on post request by my user table never being update I receive 500 status though

if I find user from table I can have him mean all response I can log them on when it comes to update table that's where the problem is

I am using this method you used

though I am running my app from docker is that could be the reason?