Set up a Stripe webhook:

  • Log in to your Stripe dashboard.
  • Navigate to “Developers” > “Webhooks” in the left sidebar.
  • Click the “Add endpoint” button to create a new webhook endpoint.
  • Enter the URL of your Rails application where you’ll receive Stripe webhook events (e.g., https://your-app.com/webhooks/stripe).
  • Select the events you want to listen to, such as “checkout.session.completed” for successful payments.
  • Save the webhook endpoint.

In the app/controllers/webhooks_controller.rb file, create an action to handle the webhook events:

To send email to user after purchase:

1. In the webhooks controller, you can send an email to the user after a checkout is completed. To obtain the user’s email address for sending the email, you can retrieve it from the event object.

class WebhooksController < ApplicationController
  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"
      return
    end
    # Handle the event
    case event.type
    when 'checkout.session.completed'
      session = event.data.object
      session_with_expand = Stripe::Checkout::Session.retrieve({id:     session.id, expand: ["line_items"] })
      session_with_expand.line_items.data.each do |line_item|
      product = Product.find_by(stripe_product_id: line_item.price.product)
      product.increment!(:sales_count)
    end
      #Send email to user after successful payment
      user_id = event.data.object.client_reference_id
      User = User.find_by(id: user_id)
      if user
        UserMailer.payment_success_email(user).deliver_now
      end
    end
    render json: { message: 'success' }
  end
end

2. If you are creating the payment intent with the Ruby SDK you can add the receipt_email field to add a customers email.

Stripe.api_key = 'API_KEY'


intent = Stripe::PaymentIntent.create({
  amount: 1099,
  currency: 'cad',
  payment_method_types: ['card'],
  receipt_email: 'recipient_email@example.com',
})

3. If you are creating the checkout session server side you can preconfigure the properties/settings like for the checkout page.

require 'stripe'
Stripe.api_key ='API_KEY'

Stripe::Checkout::Session.create({
  success_url: 'https://example.com/success',
  cancel_url: 'https://example.com/cancel',
  customer_email:'email',
  line_items: [
    {price: 'price_H5ggYwtDq4fbrJ', quantity: 2},
  ],
  mode: 'payment',
})

 

Need Help With Ruby On Rails Development?

Work with our skilled Ruby on Rails developers to accelerate your project and boost its performance.

Hire Ruby on Rails Developer

Support On Demand!

Related Q&A