def post(self, *args, **kwargs): ''' what happens when payment view is posted ''' token = self.request.POST.get('stripeToken') order = Order.objects.get(user=self.request.user, ordered=False) amount = int(order.get_final_price() * 100) try: charge = stripe.Charge.create( amount=amount, # cents currency="usd", source=token) # create the payment payment = Payment() payment.stripe_charge_id = charge['id'] payment.user = self.request.user payment.amount = int(order.get_final_price()) payment.save() # assign the payment to the order order_items = order.items.all() order_items.update(ordered=True) for item in order_items: item.save() order.ordered = True order.payment = payment order.save() messages.success(self.request, "Your order was successful!") return redirect("home") except stripe.error.CardError as e: body = e.json_body
def post(self, *args, **kwargs): order = Order.objects.get(user=self.request.user, ordered=False) form = PaymentForm(self.request.POST) # token = stripe.Token.create(card={ "number": "4242424242424242", "exp_month": 8, "exp_year": 2021, "cvc": "314",}) amount = int(order.get_total() * 100) try: charge = stripe.Charge.create( amount=amount, # cents currency="usd", source="tok_visa", ) payment = Payment() payment.stripe_charge_id = charge['id'] payment.user = self.request.user payment.amount = order.get_total() payment.save() order.ordered = True order.payment = payment order.save() messages.success(self.request, "Your Order Was Successful") return redirect("shop:shop") except stripe.error.CardError as e: # Since it's a decline, stripe.error.CardError will be caught body = e.json_body err = body.get('error', {}) messages.warning(self.request, f"{err.get('message')}") return redirect("shop:shop") except stripe.error.RateLimitError as e: # Too many requests made to the API too quickly messages.warning(self.request, "RateLimitError") return redirect("shop:shop") except stripe.error.InvalidRequestError as e: # Invalid parameters were supplied to Stripe's API messages.warning(self.request, "InvalidRequestError") return redirect("shop:shop") except stripe.error.AuthenticationError as e: # Authentication with Stripe's API failed # (maybe you changed API keys recently) messages.warning(self.request, "AuthenticationError") return redirect("shop:shop") except stripe.error.APIConnectionError as e: # Network communication with Stripe failed messages.warning(self.request, "APIConnectionError") return redirect("shop:shop") except stripe.error.StripeError as e: # Display a very generic error to the user, and maybe send # yourself an email messages.warning(self.request, "StripeError") return redirect("shop:shop") except Exception as e: # Something else happened, completely unrelated to Stripe messages.warning(self.request, "Something Went Wrong Please Try Again") return redirect("shop:shop")
def post(self, *args, **kwargs): order = Order.objects.get(user=self.request.user, ordered=False) form = PaymentForm(self.request.POST) userprofile = UserProfile.objects.get(user=self.request.user) if form.is_valid(): token = form.cleaned_data.get('stripeToken') save = form.cleaned_data.get('save') use_default = form.cleaned_data.get('use_default') if save: if userprofile.stripe_customer_id != '' and userprofile.stripe_customer_id is not None: customer = stripe.Customer.retrieve( userprofile.stripe_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_purchasing = True userprofile.save() amount = int(order.get_total() * 100) try: if use_default or save: charge = stripe.Charge.create( amount=amount, currency='usd', customer=userprofile.stripe_customer_id) else: charge = stripe.Charge.create(amount=amount, currency='usd', customer=userprofile.token) payment = Payment() payment.stripe_charge_id = charge['id'] payment.user = self.request.user payment.amount = order.get_total() payment.save() order_items = order.items.all() order_items.update(ordered=True) for item in order_items: item.save() order.ordered = True order.payment = payment order.ref_code = create_ref_code() order.save() messages.success(self.request, 'Your order was successful') return redirect('/') 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: # Too many requests made to the API too quickly messages.warning(self.request, "Rate limit error") return redirect("/") except stripe.error.InvalidRequestError as e: # Invalid parameters were supplied to Stripe's API print(e) messages.warning(self.request, "Invalid parameters") return redirect("/") except stripe.error.AuthenticationError as e: # Authentication with Stripe's API failed # (maybe you changed API keys recently) messages.warning(self.request, "Not authenticated") return redirect("/") except stripe.error.APIConnectionError as e: # Network communication with Stripe failed messages.warning(self.request, "Network error") return redirect("/") except stripe.error.StripeError as e: # Display a very generic error to the user, and maybe send # yourself an email messages.warning( self.request, "Something went wrong. You were not charged. Please try again." ) return redirect("/") except Exception as e: # send an email to ourselves messages.warning( self.request, "A serious error occurred. We have been notifed.") return redirect("/") messages.warning(self.request, "Invalid data received") return redirect("/payment/stripe/")