Интеграция Razorpay в Django Project не завершается

Я интегрирую razorpay в проект django. Я создаю заказ через OrderPostApi. При этом создается заказ, и order_ сохраняется в базе данных. Но когда я вызываю представление payment_page с идентификатором заказа, сгенерированным в браузере, я получаю кнопку оплаты, и когда я нажимаю на нее и после заполнения реквизитов (тестовые карты razorpay для тестирования), мой платеж не подтверждается. Он показывает "Ваш платеж находится в обработке" в течение нескольких часов. И я не могу сгенерировать razorpay_payment_id и razorpay_signature в моей базе данных. Я хочу, чтобы, когда я совершу платеж, мой платеж был завершен и я смог получить razorpay_payment_id и razorpay_signature в моей базе данных.

Вот что я сделал.

OrderPostApi:

class OrderPostApi(APIView):
    permission_classes = [AllowAny]
    Serializer = OrderSerializer

    def post(self, request, format=None):
        serializer = self.Serializer(data=request.data)
        if serializer.is_valid():
            #save the order
            order = serializer.save()

            #create razorpay client
            client = razorpay.Client(auth=(settings.RAZORPAY_KEY_ID, settings.RAZORPAY_KEY_SECRET))

            #create razorpay order
            razorpay_order = client.order.create({
                'amount': int(order.total_amount * 100),        #amount in paise
                'currency':'INR',
                'payment_capture':'1'
            })

            #update order with razorpay details
            order.razorpay_order_id = razorpay_order['id']
            order.save()


            response_data= serializer.data
            response_data['razorpay_order_id'] = razorpay_order['id']
            

            return Response(response_data, status=status.HTTP_201_CREATED)
        
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

OrderPaymentStatusApi:

class OrderPaymentStatusApi(APIView):
    permission_classes= [AllowAny]
    
    def post(self, request, format=None):
        data = request.data
    
        #verify the payment signature
        params_dict={
            'razorpay_order_id':data['razorpay_order_id'],
            'razorpay_payment_id' : data['razorpay_payment_id'],
            'razorpay_signature':data['razorpay_signature']
        }
        client = razorpay.Client(auth=(settings.RAZORPAY_KEY_ID, settings.RAZORPAY_KEY_SECRET))
        try:
            client.utility.verify_payment_signature(params_dict)
            order = Order.objects.get(razorpay_order_id=data['razorpay_order_id'])
            order.razorpay_payment_id=data['razorpay_payment_id']
            order.razorpay_signature=data['razorpay_signature']
            order.paid=True
            order.save()
            return Response({'status':'Payment Successful'}, status=status.HTTP_200_OK)
        except:
            return Response({'status':'Payment Verification Failed'}, status=status.HTTP_400_BAD_REQUEST)

views.py:

from django.shortcuts import render
from django.conf import settings
from .models import Order

def payment_page(request, order_id):
    order = Order.objects.get(id=order_id)
    context = {
        'RAZORPAY_KEY_ID': settings.RAZORPAY_KEY_ID,
        'amount': int(order.total_amount * 100),  # Amount in paise
        'razorpay_order_id': order.razorpay_order_id,
    }
    return render(request, 'payment.html', context)

urls.py:

path('order-status/', OrderPaymentStatusApi.as_view(), name='order-payment-status'),
path('payment/<int:order_id>/', payment_page, name='payment_page'),
path('order/post/', OrderPostApi.as_view(), name='order post'),

payment.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Razorpay Payment</title>
    <script src="https://checkout.razorpay.com/v1/checkout.js"></script>
</head>
<body>
    <button id="rzp-button">Pay Now</button>

    <script>
        var options = {
            "key": "{{ RAZORPAY_KEY_ID }}", // Enter the Key ID generated from the Dashboard
            "amount": "{{ amount }}", // Amount in paise
            "currency": "INR",
            "name": "Your Company Name",
            "description": "Test Transaction",
            "image": "https://your-logo-url.com", // Optional
            "order_id": "{{ razorpay_order_id }}", // Pass the `razorpay_order_id` obtained from the API
            "handler": function (response) {
                console.log('Payment response received:', response);
                // Send payment details to your backend for verification
                fetch('order-status/', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/json',
                    },
                    body: JSON.stringify({
                        razorpay_order_id: response.razorpay_order_id,
                        razorpay_payment_id: response.razorpay_payment_id,
                        razorpay_signature: response.razorpay_signature,
                    }),
                })
                .then(response => response.json())
                .then(data => {
                    console.log('Backend verification response:', data);
                    if (data.status === 'Payment Successful') {
                        alert('Payment Successful');
                    } else {
                        alert('Payment Verification Failed');
                    }
                })
                .catch(error => {
                    console.error('Error verifying payment:', error);
                });
            },
            "prefill": {
                "name": "JohnDoe",
                "email": "customer@example.com",
                "contact": "9876543212"
            },
            "notes": {
                "address": "Customer Address"
            },
            "theme": {
                "color": "#F37254"
            }
        };

        var rzp1 = new Razorpay(options);
        document.getElementById('rzp-button').onclick = function(e){
            rzp1.open();
            e.preventDefault();
        }
    </script>
</body>
</html>
Вернуться на верх