def post(self, *args, **kwargs): form = PaymentForm(self.request.POST) userprofile = User.objects.get(user=self.request.user) if form.is_valid(): data = form.cleaned_data token = data.get("stripeToken") save = data.get("save") use_default = data.get("use_default") if save: if userprofile.customer_id != "" and userprofile.customer_id is not None: customer = stripe.Customer.retrieve( userprofile.customer_id) customer.sources.create(source=token) else: customer = stripe.Customer.create( email=self.request.user.email, ) customer.sources.create(source=token) userprofile.stripe_customer_id = customer["id"] userprofile.one_click_purchase = True userprofile.save() order = Order.objects.get(user=self.request.user, ordered=False) amount = int(order.get_total() * 100) try: if use_default or save: charge = stripe.Charge.create( amount=amount, currency="gbp", customer=userprofile.stripe_customer_id) else: charge = stripe.Charge.create(amount=amount, currency="gbp", source=token) payment = Payment() payment.stripe_bill_id = charge["id"] payment.user = self.request.user payment.amt = order.get_total() payment.save() order_items = order.products.all() order_items.update(ordered=True) for item in order_items: item.save() order.ordered = True order.payment = payment order.orderid = generate_order_id() order.save() messages.success(self.request, "Your order was Successful!") return redirect("order_confirmation", orderid=order.orderid) except stripe.error.CardError as e: body = e.json_body err = body.get("error", {}) messages.warning(self.request, f"{err.get('message')}") return redirect("/") except stripe.error.RateLimitError as e: messages.warning(self.request, "Rate limit error") return redirect("/") except stripe.error.InvalidRequestError as e: messages.warning(self.request, "Invalid parameters") return redirect("/") except stripe.error.AuthenticationError as e: messages.warning(self.request, "Not authenticated") return redirect("/") except stripe.error.APIConnectionError as e: messages.warning(self.request, "Network error") return redirect("/") except stripe.error.StripeError as e: messages.warning( self.request, "Something went wrong. Please try again. You haven't been Charged" ) return redirect("/") except Exception as e: messages.warning( self.request, "A serious issue occurred. We have been notifed.") return redirect("/") messages.warning(self.request, "Invalid data received") return redirect("/payment/stripe/")