Два заказа, представленные после оформления заказа - PullRequest
0 голосов
/ 19 апреля 2020

У меня проблема с тем, что после отправки платежа заказ подается дважды. В некоторых случаях, если я впервые загружаю приложение на свое устройство, оно будет заряжено один раз. Тем не менее, поскольку это делается несколько раз, для одного и того же заказа будет взиматься более одного заряда.

# Create your views here.
stripe.api_key = settings.STRIPE_SECRET


@login_required()
def checkout(request):
    if request.method == "POST":
        # call the two forms that will be used
        order_form = OrderForm(request.POST)
        payment_form = MakePaymentForm(request.POST)

        # Then will check if both forms are valid if yes, save
        if order_form.is_valid() and payment_form.is_valid():
            order = order_form.save(commit=False)
            order.date = timezone.now()
            order.save()

            cart = request.session.get('cart', {})
            total = 0
            for id, quantity in cart.items():
                destination = get_object_or_404(Destinations, pk=id)
                total += quantity * destination.price
                order_line_item = OrderLineItem(
                    order=order,
                    destination=destination,
                    quantity=quantity
                )
                order_line_item.save()

            try:
                customer = stripe.Charge.create(
                    amount=int(total * 100),
                    currency="EUR",
                    description=request.user.email,
                    card=payment_form.cleaned_data['stripe_id'],
                )
            except stripe.error.CardError:
                messages.error(request, "Your card was declined!")

            if customer.paid:
                messages.error(request, "You have successfully paid")
                request.session['cart'] = {} #clear the cart in session
                return redirect(reverse('destination'))
            else:
                messages.error(request, "Unable to take payment")
        else:
            messages.error(request, "We were unable to take a payment with that card!")
    else:
        payment_form = MakePaymentForm()
        order_form = OrderForm()
    return render(request, "checkout.html", {"order_form": order_form, "payment_form": payment_form, "publishable": settings.STRIPE_PUBLISHABLE})

Поскольку это переработанный код из загрузочного лагеря, который я делаю, я попытался исправить второй, если на order.save() и добавьте его после if customer.paid:, но я получаю ошибку.

django admin/orders

1 Ответ

1 голос
/ 20 апреля 2020

Скорее всего (как упомянуто в комментариях) ваш клиентский код отправляет более одного запроса на создание платежа. В идеале вы должны выяснить, почему это происходит, но вы также можете использовать Ключи Идемпотентности , чтобы решить это тоже.

...