Сбой проверки подписи Razorpay

Я пытаюсь интегрировать Razorpay в мое приложение на django-rest-framework. Я следую этой статье. Я могу успешно создавать заказы. Но не могу произвести оплату. Вы можете непосредственно увидеть весь код в github репозитории.

views.py

from django.shortcuts import render
from django.conf import settings
from django.views.decorators.csrf import csrf_exempt
from .constants import PaymentStatus
import json
import razorpay
from .models import Order

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

def home(request):
    return render(request, "index.html")

def order_payment(request):
    if request.method == "POST":
        name = request.POST.get("name")
        amount = request.POST.get("amount")
        razorpay_order = client.order.create(
            {"amount": int(amount) * 100, "currency": "INR", "payment_capture": "1"}
        )
        order = Order.objects.create(
            name=name, amount=amount , provider_order_id=razorpay_order["id"]
        )
        order.save()
        return render(
            request,
            "payment.html",
            {
                "callback_url": "http://" + "127.0.0.1:8000" + "/razorpay/callback/",
                "razorpay_key": settings.RAZORPAY_KEY_ID,
                "order": order,
            },
        )
    return render(request, "payment.html")

@csrf_exempt
def callback(request):
    def verify_signature(response_data):
        return client.utility.verify_payment_signature(response_data)

    print(f'first request.POST: {request.POST}')
    print(f'input {request.body}')
    if "razorpay_signature" in request.POST:
        payment_id = request.POST.get("razorpay_payment_id", "")
        provider_order_id = request.POST.get("razorpay_order_id", "")
        signature_id = request.POST.get("razorpay_signature", "")
        order = Order.objects.get(provider_order_id=provider_order_id)
        order.payment_id = payment_id
        order.signature_id = signature_id
        order.save()

        print(f'signature verification: {verify_signature(request.POST)}')
        if not verify_signature(request.POST):
            order.status = PaymentStatus.SUCCESS
            order.save()
            return render(request, "callback.html", context={"status": order.status})
        else:
            order.status = PaymentStatus.FAILURE
            order.save()
            return render(request, "callback.html", context={"status": order.status})
    else:
        payment_id = json.loads(request.POST.get("error[metadata]")).get("payment_id")
        provider_order_id = json.loads(request.POST.get("error[metadata]")).get(
            "order_id"
        )
        order = Order.objects.get(provider_order_id=provider_order_id)
        order.payment_id = payment_id
        order.status = PaymentStatus.FAILURE
        order.save()
        return render(request, "callback.html", context={"status": "Success"}) #order.status})

if not verify_signature(request.POST): всегда возвращает True, что означает, что платеж не прошел, в то время как когда я вижу статус соответствующей транзакции на панели Razorpay, он показывает captured, что означает, что платеж прошел успешно. Я получаю этот результат, даже если я выполняю платеж с помощью success@razorpay или failure@razorpay. Но я ожидаю, что платеж должен быть успешным только тогда, когда я делаю его с помощью success@razorpay.

Я видел ответы на такие же вопросы, как this. Но они кажутся устаревшими, так как client.utility.verify_payment_signature() принимает аргументы словаря, а не строки, о чем говорится в ответе.

Я использую razorpay=1.3.0

Вернуться на верх