feat: added tpv app

This commit is contained in:
Pablo Moreno
2024-03-22 00:44:49 +01:00
parent a13eb6c9d9
commit b8562b3d7b
27 changed files with 1153 additions and 7 deletions
+111
View File
@@ -0,0 +1,111 @@
from django.urls import reverse
from django.views.decorators.csrf import csrf_exempt
from django.shortcuts import render, get_object_or_404, redirect
from django.http.response import HttpResponse
from tpv.forms import UpdateEmailForm
from tpv.models import PaymentTPV
from tpv.redsys import RedsysClient
from tpv.utils import pay_order, validate_payment_for_order
from tpv.signals import redsys_payment_accepted, redsys_payment_rejected
def payment_accepted(request, order):
order = get_object_or_404(PaymentTPV, hash=order)
# Ñapa histórica
if request.GET:
return redirect(reverse("tpv:ok", kwargs={"order": order.hash}))
return render(
request,
template_name="tpv/order_created.html",
context={
"order": order,
},
)
def payment_rejected(request, order):
order = get_object_or_404(PaymentTPV, hash=order)
# Ñapa histórica
if request.GET:
return redirect(reverse("tpv:ko", kwargs={"order": order.hash}))
return render(
request,
template_name="tpv/order.html",
context={
"order": order,
},
)
@csrf_exempt
def webhook(request, order):
order = get_object_or_404(PaymentTPV, hash=order)
try:
amount_paid = validate_payment_for_order(request, order)
pay_order(order, amount_paid)
redsys_payment_accepted.send_robust(PaymentTPV.__class__, hash=order.hash)
return HttpResponse(status=200)
except Exception as e:
order.status = PaymentTPV.StatusChoices.ERROR
order.observations = str(e)
order.save()
redsys_payment_rejected.send_robust(PaymentTPV.__class__, hash=order.hash)
return HttpResponse(status=409)
def order_created(request, order):
order = get_object_or_404(PaymentTPV, hash=order)
client = RedsysClient()
parameters = client.get_body_for_order(order)
if request.method == "GET":
return render(
request,
template_name="tpv/order_created.html",
context={
"form": UpdateEmailForm({"contact_email": order.contact_email}),
"action": reverse("tpv:order_created", kwargs={"order": order.hash}),
"order": order,
"signature_version": parameters.get("Ds_SignatureVersion"),
"merchant_parameters": parameters.get("Ds_MerchantParameters"),
"signature": parameters.get("Ds_Signature"),
"redsys_target_url": client.get_target_url(),
},
)
elif request.method == "POST":
form = UpdateEmailForm(request.POST)
if form.is_valid():
order.contact_email = form.cleaned_data["contact_email"]
order.save()
return redirect(reverse("tpv:order_created", kwargs={"order": order.hash}))
else:
return render(
request,
template_name="tpv/order_created.html",
context={
"form": UpdateEmailForm({"contact_email": ""}),
"errors": form.errors,
"action": reverse(
"tpv:order_created", kwargs={"order": order.hash}
),
"order": order,
"signature_version": parameters.get("Ds_SignatureVersion"),
"merchant_parameters": parameters.get("Ds_MerchantParameters"),
"signature": parameters.get("Ds_Signature"),
"redsys_target_url": client.get_target_url(),
},
)
return HttpResponse(status=405)