def dispatch(self, request, *args, **kwargs): with transaction.atomic(using="payments_db"): self.object = self.get_object() # User should choose method for new payment if self.object.state == Payment.NEW: return redirect("payment", pk=self.object.pk) # Get backend and refetch payment from the database backend = get_backend(self.object.backend)(self.object) # Allow reprocessing of rejected payments. User might choose # to retry in the payment gateway and previously rejected payment # can be now completed. if backend.payment.state not in (Payment.PENDING, Payment.REJECTED): return self.redirect_origin() backend.complete(self.request) # If payment is still pending, display info page if backend.payment.state == Payment.PENDING: return render( request, "payment/pending.html", { "object": backend.payment, "backend": backend }, ) return self.redirect_origin()
def form_valid(self, form): if not self.can_pay: return redirect("payment", pk=self.object.pk) # Actualy call the payment backend method = form.cleaned_data["method"] backend = get_backend(method)(self.object) result = backend.initiate( self.request, self.request.build_absolute_uri( reverse("payment", kwargs={"pk": self.object.pk})), self.request.build_absolute_uri( reverse("payment-complete", kwargs={"pk": self.object.pk})), ) if result is not None: return result backend.complete(self.request) return self.redirect_origin()