def checkout(request): stripe_public_key = settings.STRIPE_PUBLIC_KEY stripe_secret_key = settings.STRIPE_SECRET_KEY bag = request.session.get('bag', {}) if not bag: messages.error(request, "There's nothing in your bag at the moment") return redirect(reverse('products')) current_bag = bag_contents(request) total = current_bag['grand_total'] stripe_total = round(total*100) stripe.api_key = stripe_secret_key intent = stripe.PaymentIntent.create( amount=stripe_total, currency=settings.STRIPE_CURRENCY, ) order_form = OrderForm() if not stripe_public_key: messages.warning(request, 'Stripe PK is missing. Did you forget to set it in the environ?') template = 'checkout/checkout.html' context = { 'order_form': order_form, 'stripe_public_key': stripe_public_key, 'client_secret': intent.client_secret, } return render(request, template, context)
def cache_checkout_data(request): """ Caches the data from the order and then add the extra info needed for recreating the order through the web hook into the Stripe metadata """ try: current_bag = bag_contents(request) discount = current_bag['offer_discount'] pid = request.POST.get('client_secret').split('_secret')[0] stripe.api_key = settings.STRIPE_SECRET_KEY stripe.PaymentIntent.modify(pid, metadata={ 'username': request.user, 'save_info': request.POST.get('save-info'), 'bag': json.dumps(request.session.get('bag', {})), 'discount': discount, 'loyalty_points': 0, }) return HttpResponse(status=200) except Exception as e: messages.error(request, 'Sorry, your payment cannot be \ processed right now. Please try again later') return HttpResponse(content=e, status=400)
def checkout(request): stripe_public_key = settings.STRIPE_PUBLIC_KEY stripe_secret_key = settings.STRIPE_SECRET_KEY if request.method == 'POST': bag = request.session.get('bag', {}) form_data = { 'full_name': request.POST['full_name'], 'email': request.POST['email'], 'phone_number': request.POST['phone_number'], 'street_address1': request.POST['street_address1'], 'street_address2': request.POST['street_address2'], 'town_or_city': request.POST['town_or_city'], 'postcode': request.POST['postcode'], 'county': request.POST['county'], 'country': request.POST['country'], } order_form = OrderForm(form_data) if order_form.is_valid(): order = order_form.save(commit=False) pid = request.POST.get('client_secret').split('_secret')[0] order.stripe_pid = pid order.original_bag = json.dumps(bag) order.save() for item_id, item_data in bag.items(): try: product = Product.objects.get(id=item_id) order_line_item = OrderLineItem( order=order, product=product, quantity=item_data, ) order_line_item.save() except Product.DoesNotExist: messages.error(request, ( "The product in your bag wasn't found in our database." "Please call us for assistance!")) order.delete() return redirect(reverse('view_bag')) request.session['save_info'] = 'save-info' in request.POST return redirect( reverse('checkout_success', args=[order.order_number])) else: messages.error( request, 'There was an error with your form. \ Please check your information.') else: bag = request.session.get('bag', {}) if not bag: messages.error(request, "There is nothing in your bag at the moment") return redirect(reverse('products')) current_bag = bag_contents(request) total = current_bag['total'] stripe_total = round(total * 100) stripe.api_key = stripe_secret_key intent = stripe.PaymentIntent.create( amount=stripe_total, currency=settings.STRIPE_CURRENCY, ) if request.user.is_authenticated: try: profile = UserProfile.objects.get(user=request.user) order_form = OrderForm( initial={ 'full_name': profile.default_full_name, 'email': profile.user.email, 'phone_number': profile.default_phone_number, 'country': profile.default_country, 'postcode': profile.default_postcode, 'town_or_city': profile.default_town_or_city, 'street_address1': profile.default_street_address1, 'street_address2': profile.default_street_address2, 'county': profile.default_county, }) except UserProfile.DoesNotExist: order_form = OrderForm() else: order_form = OrderForm() if not stripe_public_key: messages.warning(request, 'Stripe public key is missing!') template = 'checkout/checkout.html' context = { 'order_form': order_form, 'stripe_public_key': stripe_public_key, 'client_secret': intent.client_secret, } return render(request, template, context)
def checkout(request): stripe_public_key = settings.STRIPE_PUBLISHABLE_KEY stripe_secret_key = settings.STRIPE_SECRET_KEY if request.method == 'POST': bag = request.session.get('bag', {}) form_data = { 'full_name': request.POST['full_name'], 'email': request.POST['email'], 'phone_number': request.POST['phone_number'], 'country': request.POST['country'], 'postcode': request.POST['postcode'], 'town_or_city': request.POST['town_or_city'], 'street_address1': request.POST['street_address1'], 'street_address2': request.POST['street_address2'], 'county': request.POST['county'], } order_form = OrderForm(form_data) if order_form.is_valid(): order = order_form.save() for item_id, item_data in bag.items(): try: product = Product.objects.get(id=item_id) if isinstance(item_data, int): order_line_item = OrderLineItem( order=order, product=product, quantity=item_data, ) order_line_item.save() else: for size, quantity in item_data['items_by_size'].items(): order_line_item = OrderLineItem( order=order, product=product, quantity=quantity, product_size=size, ) order_line_item.save() except Product.DoesNotExist: messages.error(request, ( "One of the products in your bag wasn't found in our database. " "Please call us for assistance!") ) order.delete() return redirect(reverse('view_bag')) request.session['save_info'] = 'save-info' in request.POST return redirect(reverse('checkout_success', args=[order.order_number])) else: messages.error(request, 'There was an error with your form. \ Please double check your information.') else: bag = request.session.get('bag', {}) if not bag: messages.error(request, "There's nothing in your bag at the moment") return redirect(reverse('products')) current_bag = bag_contents(request) total = current_bag['grand_total'] stripe_total = round(total * 100) stripe.api_key = stripe_secret_key intent = stripe.PaymentIntent.create( amount=stripe_total, currency=settings.STRIPE_CURRENCY, ) order_form = OrderForm() if not stripe_public_key: messages.warning(request, 'Stripe public key is missing. \ Did you forget to set it in your environment?') template = 'checkout/checkout.html' context = { 'order_form': order_form, 'stripe_public_key': stripe_public_key, 'client_secret': intent.client_secret, } return render(request, template, context)
def checkout(request): """ On GET request: Renders the checkout page On POST: Handles the checkout logic through Stripe Checks the form validation of checkout Adds the relevant loyalty points for the order is logged in Saves the client information if requested """ stripe_public_key = settings.STRIPE_PUBLIC_KEY stripe_secret_key = settings.STRIPE_SECRET_KEY current_bag = bag_contents(request) if request.method == 'POST': bag = request.session.get('bag', {}) deal_discount = request.session.get('discount', {}) form_data = { 'full_name': request.POST['full_name'], 'email': request.POST['email'], 'phone_number': request.POST['phone_number'], 'postcode': request.POST['postcode'], 'town_or_city': request.POST['town_or_city'], 'street_address1': request.POST['street_address1'], 'street_address2': request.POST['street_address2'], 'county': request.POST['county'], } order_form = OrderForm(form_data) if order_form.is_valid(): order = order_form.save(commit=False) pid = request.POST.get('client_secret').split('_secret')[0] order.stripe_pid = pid order.original_bag = json.dumps(bag) order.deal_discount = current_bag['offer_discount'] loyalty = current_bag['loyalty_discount'] if not loyalty: l_discount = Decimal(0) else: l_discount = Decimal(loyalty) order.loyalty_discount = l_discount if request.user.is_authenticated: loyalty_points = round(int(current_bag['grand_total'] / 4)) - round(l_discount) order.loyalty_points = loyalty_points else: order.loyalty_points = 0 order.save() for item_id, item_data in bag.items(): try: product = Product.objects.get(id=item_id) if isinstance(item_data, int): order_line_item = OrderLineItem( order=order, product=product, quantity=item_data ) order_line_item.save() else: for dough in item_data.items(): for size in dough[1]: if dough[1][size] > 0: order_line_item = OrderLineItem( order=order, product=product, quantity=dough[1][size], product_size=size ) order_line_item.save() except Product.DoesNotExist: messages.error(request, "One of the products does not exist.") order.delete() return redirect(reverse('view_bag')) request.session['save_info'] = 'save-info' in request.POST return redirect(reverse('checkout_success', args=[order.order_number])) else: messages.error(request, 'There was an error with your form.') total = current_bag['grand_total'] stripe_total = round(total * 100) stripe.api_key = stripe_secret_key intent = stripe.PaymentIntent.create( amount=stripe_total, currency=settings.STRIPE_CURRENCY, ) if request.user.is_authenticated: try: profile = UserProfile.objects.get(user=request.user) form = OrderForm(initial={ 'full_name': profile.user.get_full_name(), 'email': profile.user.email, 'phone_number': profile.default_phone_number, 'postcode': profile.default_postcode, 'town_or_city': profile.default_town_or_city, 'street_address1': profile.default_street_address1, 'street_address2': profile.default_street_address2, 'county': profile.default_county, }) except UserProfile.DoesNotExist: form = OrderForm() else: form = OrderForm() template = 'checkout/checkout.html' context = { 'form': form, 'stripe_public_key': stripe_public_key, 'client_secret': intent.client_secret } return render(request, template, context)