Files
shoppy/tpv/views.py
T
2024-05-05 00:04:51 +02:00

78 lines
2.4 KiB
Python

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 PaymentTransaction
from tpv.redsys import RedsysClient
from tpv.utils import pay_transaction, validate_payment_for_transaction
from tpv.signals import redsys_payment_accepted, redsys_payment_rejected
def payment_accepted(request, transaction):
transaction = get_object_or_404(PaymentTransaction, hash=transaction)
return render(
request,
template_name="tpv/order_created.html",
context={
"order": transaction,
},
)
def payment_rejected(request, transaction):
transaction = get_object_or_404(PaymentTransaction, hash=transaction)
return render(
request,
template_name="tpv/order_created.html",
context={
"order": transaction,
},
)
@csrf_exempt
def webhook(request, transaction):
transaction = get_object_or_404(PaymentTransaction, hash=transaction)
try:
amount_paid = validate_payment_for_transaction(request, transaction)
pay_transaction(transaction, amount_paid)
return HttpResponse(status=200)
except Exception as e:
transaction.status = PaymentTransaction.StatusChoices.ERROR
transaction.observations = str(e)
transaction.save()
redsys_payment_rejected.send_robust(
PaymentTransaction.__class__, hash=transaction.hash
)
return HttpResponse(status=409)
def transaction_created(request, transaction):
transaction = get_object_or_404(PaymentTransaction, hash=transaction)
client = RedsysClient()
parameters = client.get_body_for_transaction(transaction)
return render(
request,
template_name="tpv/order_created.html",
context={
"form": UpdateEmailForm({"contact_email": transaction.contact_email}),
"action": reverse(
"tpv:order_created", kwargs={"transaction": transaction.hash}
),
"order": transaction,
"signature_version": parameters.get("Ds_SignatureVersion"),
"merchant_parameters": parameters.get("Ds_MerchantParameters"),
"signature": parameters.get("Ds_Signature"),
"redsys_target_url": client.get_target_url(),
},
)