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) redsys_payment_accepted.send_robust( PaymentTransaction.__class__, hash=transaction.hash ) 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(), }, )