If you're building a Django-based application and want to accept payments online, Razorpay is one of the easiest and most developer-friendly gateways to integrate. In this post, I’ll walk you through the Razorpay integration process with Django, step-by-step — from setting up the environment to handling the payment success callback.
🛠️ Prerequisites
Before we begin, make sure you have:
- Python and Django installed.
- A Razorpay account (Sign up at https://razorpay.com)
- Razorpay API Keys (from the Razorpay dashboard)
- Basic understanding of Django views and templates.
🔧 Step 1: Install Razorpay Python SDK
pip install razorpay
📁 Step 2: Setup Razorpay Keys
In your Django project settings (settings.py), add your RAZORPAY_KEY_ID and RAZORPAY_KEY_SECRET:
RAZORPAY_KEY_ID = 'your_key_id' RAZORPAY_KEY_SECRET = 'your_key_secret'
You can also use environment variables for security.
🧠 Step 3: Create the Payment View
Views.py
from django.shortcuts import render from django.http import HttpResponse import razorpay from django.conf import settings from django.views.decorators.csrf import csrf_exempt from django.http import HttpResponseBadRequest # authorize razorpay client with API Keys. razorpay_client = razorpay.Client(auth=(settings.RAZOR_KEY_ID, settings.RAZOR_KEY_SECRET)) # Create your views here. def home(request): currency = 'INR' if request.method == "POST": amount_rupees = int(request.POST.get("amount", 1)) amount = amount_rupees * 100 # Convert to paise request.session['latest_payment_amount'] = amount razorpay_order = razorpay_client.order.create(dict(amount=amount, currency=currency, payment_capture='0')) razorpay_order_id = razorpay_order['id'] callback_url = 'paymenthandler/' context = {} context['razorpay_order_id'] = razorpay_order_id context['razorpay_merchant_key'] = settings.RAZOR_KEY_ID context['razorpay_amount'] = amount context['currency'] = currency context['callback_url'] = callback_url return render(request, 'home.html', context=context) return render(request, 'home.html') @csrf_exempt def paymenthandler(request): # only accept POST request. if request.method == "POST": try: payment_id = request.POST.get('razorpay_payment_id', '') razorpay_order_id = request.POST.get('razorpay_order_id', '') signature = request.POST.get('razorpay_signature', '') params_dict = { 'razorpay_order_id': razorpay_order_id, 'razorpay_payment_id': payment_id, 'razorpay_signature': signature } result = razorpay_client.utility.verify_payment_signature(params_dict) print(result) if result is not None: amount = request.session['latest_payment_amount'] try: razorpay_client.payment.capture(payment_id, amount) return render(request, 'paymentsuccess.html', params_dict) except: return render(request, 'paymentfail.html') else: return render(request, 'paymentfail.html') except: return HttpResponseBadRequest() else: return HttpResponseBadRequest()
urls.py
from django.urls import path from . import views urlpatterns = [ path('',views.home, name='home'), path('paymenthandler/', views.paymenthandler, name='paymenthandler'), ]
home.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Home</title> </head> <body> <h1>Razorpay Integration</h1> <form method="post" action="{% url 'home' %}"> {% csrf_token %} <label for="amount">Enter amount (INR): </label> <input type="number" id="amount" name="amount" required> <button id="pay-btn" type="submit">Proceed to Pay</button> </form> {% if razorpay_order_id %} <!-- Razorpay's Javascript code. --> <script src="https://checkout.razorpay.com/v1/checkout.js"></script> <script> var options = { key: "{{ razorpay_merchant_key }}", amount: "{{ razorpay_amount }}", currency: "{{ currency }}", // Your/store name. name: "Dj Razorpay", // Pass the `id` obtained in the response of Step 1 order_id: "{{ razorpay_order_id }}", callback_url: "{{ callback_url }}", }; // initialise razorpay with the options. var rzp1 = new Razorpay(options); rzp1.open(); </script> {% endif %} </body> </html>
paymentsuccess.html
<!DOCTYPE html> <html> <head> <title>Payment Successful</title> <style> body { font-family: Arial; text-align: center; padding: 50px; background-color: #f4f4f4; } .box { background: white; padding: 30px; border-radius: 10px; display: inline-block; box-shadow: 0px 0px 10px #ccc; } h2 { color: green; } </style> </head> <body> <div class="box"> <h2>🎉 Payment Successful!</h2> <p>Thank you for your payment.</p> <p><strong>Payment ID:</strong> {{ razorpay_payment_id }}</p> <a href="/">Go back to Home</a> </div> </body> </html>
Razorpay makes payment integration smooth and developer-friendly. With just a few steps, you can start accepting payments in your Django application.
Source code is available on Github : Movie Booking System
Thanks for reading.
Top comments (0)