Сбой проверки подписи 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