Integrate Payment Gateway - RazorPay with Laravel

Nov 17, 2022

Integrate Payment Gateway - RazorPay with Laravel

Learn how to integrate the Razorpay payment gateway into a Laravel 8 application. This step-by-step tutorial covers project setup, API configuration, payment verification, transaction storage, and creating a secure checkout experience.

Author

Aanchal Goyal
Aanchal GoyalSenior Software Engineer - II

Editorโ€™s Note: The article was originally written by Aanchal Goyal in November 2022. It was reviewed and updated by Harrini in July 2026 to improve clarity and align the tutorial with current content standards. The implementation continues to demonstrate Razorpay integration with Laravel 8.

Key Takeaways

  • Integrating Razorpay with Laravel involves setting up API keys, installing the SDK, and connecting payment workflows.
  • Payment verification and capture help ensure every transaction is completed securely being recorded.
  • Storing payment details in a database makes it easier to track transactions, refunds, and payment history. 
  • A production-ready payment integration requires secure backend logic, proper error handling, and reliable payment workflows. 

Introduction

Razorpay can be integrated with Laravel 8 by installing the Razorpay SDK, configuring your API keys, creating payment routes, verifying and capturing transactions, and storing payment details in your database. As businesses adopt AI to speed up their software development processes, payment integrations still require careful implementation for secure transactions and frictionless payment processing.

This tutorial walks through each step of the integration process, from setting up a Laravel project and connecting a database to building a checkout page and handling payment responses in a secure way using Razorpay.

Steps to Integrate RazorPay with Laravel

Letโ€™s get started. Follow the steps below, and you are good to go!

Step 1 - Install the Laravel 8 Application

Go to the directory where you want to install your project in the terminal and run the following command to install a new Laravel project.

composer create-project laravel/laravel RazorpayIntegrationLaravel

Step 2 - Connect Database to an Application

In this step, open your project folder in vs. code and open .env and add your database name, user, and password like this.

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel_razorpay
DB_USERNAME=root
DB_PASSWORD=

Step 3 - Add RazorPay Credentials

If you already have Razorpay account, login into the Razorpay dashboard or create a new Razorpay account. Then go to settings from the left sidebar, and you will see the API KEYS tab.

Open that tab and generate a new key. Copy those keys, and paste them into your .env

RAZORPAY_KEY=rzp_test_XXXXXXX
RAZORPAY_SECRET=XXXXXXXXXXXXXX

Step 4 - Install the Composer Package of RazorPay

Now, could you install the composer package of Razorpay? To install that, get the root directory of your project in the terminal and run the below command.

composer requires razorpay/razorpay

Step 5 - Create Route

Open web.php and create a new route. 

Route::get('product',[RazorpayController::class,'index']);
Route::post('razorpay-payment',[RazorpayController::class,'store'])->name('razorpay.payment.store');

Step 6 - Create Migration and Model

Now, you need to create migration for new table payments to store the response of razorpay API. Also, create a model Payment for the same. Run this below command 

php artisan make:model Payment โ€”migration

Copy this code in the migration file and run php artisan migrate

Schema::create('payments',function(Blueprint $table) {
    $table->increments('id');
    $table->string('r_payment_id');
    $table->string('method');
    $table->string('currency');
    $table->string('user_email');
    $table->string('amount');
    $table->longText('json_response');
    $table->timestamps();
  });
<?php 

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model; 

class Payment extends Model {
    use HasFactory;
    protected $table = 'payments';
    protected $guarded = ['id'];
}

Step 7 - Create Controller

Now, create a controller using this command and write the below code. In the controller, we will write the logic for Razorpay API call and store the response in our database.

public function store(Request $request) {
    $input = $request->all();
    $api = new Api (env('RAZORPAY_KEY'), env('RAZORPAY_SECRET'));
    $payment = $api->payment->fetch($input['razorpay_payment_id']);
    if(count($input) && !empty($input['razorpay_payment_id'])) {
        try {
            $response = $api->payment->fetch($input['razorpay_payment_id'])->capture(array('amount' => $payment['amount']));
            $payment = Payment::create([
                'r_payment_id' => $response['id'],
                'method' => $response['method'],
                'currency' => $response['currency'],
                'user_email' => $response['email'],
                'amount' => $response['amount']/100,
                'json_response' => json_encode((array)$response)
            ]);
        } catch(Exceptio $e) {
            return $e->getMessage();
            Session::put('error',$e->getMessage());
            return redirect()->back();
        }
    }
    Session::put('success',('Payment Successful');
    return redirect()->back();
}

Step 8 - Create View File

Create Laravel blade file and add the below code in that file and call that file with the help of the view function from the controller. 

<div class="card card-default">
    <div class="card-header">
        Laravel - Razorpay Payment Gateway Integration
    </div>
    <div class="card-body text-center">
        <form action="{{ route('razorpay.payment.store') }}" method="POST" >
            @csrf 
            <script src="https://checkout.razorpay.com/v1/checkout.js"
                    data-key="{{ env('RAZORPAY_KEY') }}"
                    data-amount="10000"
                    data-buttontext="Pay 100 INR"
                    data-name="GeekyAnts official"
                    data-description="Razorpay payment"
                    data-image="/images/logo-icon.png"
                    data-prefill.name="ABC"
                    data-prefill.email="abc@gmail.com"
                    data-theme.color="#ff7529">
            </script>
        </form>
    </div>
</div>

Now run this below command and open this URL http://127.0.0.1:8000/product

PHP artisan serve

Conclusion

This was a tutorial on integrating Razorpay into your Laravel 8 application. You can try it out and let us know how it went!

Subscribe to Our Newsletter

More from the engineering frontline.

Dive deep into our research and insights on design, development, and the impact of various trends to businesses.
Insight
Building Local LLMs Using Dart FFI And llama.cpp: Beyond Wrapper Packages
Sep 11, 2026

Building Local LLMs Using Dart FFI And llama.cpp: Beyond Wrapper Packages

Build local LLMs in Flutter with Dart FFI and llama.cpp, and see how native bridges, GGUF models, memory management, and token streaming enable private, on-device AI.

Insight
My Flutter App Froze With Three Photos on Screen. Here's What I Was Doing Wrong
Sep 11, 2026

My Flutter App Froze With Three Photos on Screen. Here's What I Was Doing Wrong

This blog explains how rethinking Flutterโ€™s image-processing architecture fixed severe performance issues and improved rendering efficiency.

Insight
Building a Production-Ready Canva-like Editor with Konva.js, React 19 and Next.js 15
Sep 10, 2026

Building a Production-Ready Canva-like Editor with Konva.js, React 19 and Next.js 15

This blog explains how to build a production-ready canvas editor with Konva.js, React, and Next.js, covering architecture, performance, and key engineering decisions.

Insight
What a PHP-to-NestJS Banking Migration Taught Us About Architecture, Security, and Trust
Sep 8, 2026

What a PHP-to-NestJS Banking Migration Taught Us About Architecture, Security, and Trust

This blog explores the architecture, security, performance, and documentation lessons from migrating a legacy PHP/Laravel banking platform to NestJS.

Insight
Building Production-Grade Video Thumbnail Scrubbing in the Browser: HLS, Frame Extraction, Caching, and Performance Trade-offs
Sep 7, 2026

Building Production-Grade Video Thumbnail Scrubbing in the Browser: HLS, Frame Extraction, Caching, and Performance Trade-offs

This blog explains how to build responsive video thumbnail scrubbing in the browser for local files and HLS streams, covering frame extraction, caching, and performance trade-offs.

Insight
The Agent Can See Your App. How Often Can It Look?
Sep 4, 2026

The Agent Can See Your App. How Often Can It Look?

AI coding agents can now interact with mobile apps, but their effectiveness depends on iteration speed. This blog explores how React Native architecture influences feedback loops and AI-driven developer productivity.

Insight
Building Interactive Cards from Design JSON Without Killing Your Feed: Overlays, Video, Mute/Unmute, and Lag-Free Lists
Sep 1, 2026

Building Interactive Cards from Design JSON Without Killing Your Feed: Overlays, Video, Mute/Unmute, and Lag-Free Lists

Learn how to turn design JSON into interactive, video-enabled cards using overlays, smart media controls, caching, and virtualization without slowing down high-cardinality feeds.

The Right Conversation Can

Save You Six Months.

Book a call