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/")