Как сохранить экземпляр после завершения всех процессов (включая сессию проверки Stripe)?

#views

@transaction.atomic
def booking_form(request, id):

    franchise_id = id
    form = BookingForm(franchise_id=franchise_id)

    if request.method == 'POST':
        form = BookingForm(request.POST, franchise_id=franchise_id)
        if 'paynow-btn' in request.POST:
            if form.is_valid():
                instance = form.save(commit=False)
                instance.payment_status = 'due'
                instance.booking_status = 'unconfirmed'
                instance.franchise_id = franchise_id

                #other code

                #stripe connect [standard account] direct charges    
                connected_account_id = create_or_get_connected_account(franchise_id)
                success_urlpattern = reverse('booking:booking_successful', kwargs={'id': franchise_id})
                success_urlpath = request.build_absolute_uri(success_urlpattern)
                # Create a Stripe checkout session
                print("Before checkout session creation")

                checkout_session = stripe.checkout.Session.create(
                    payment_method_types=['card'],
                    line_items=[{
                        "price_data": {
                            "currency": "gbp",
                            "unit_amount": int(instance.total_amount * 100),
                            "product_data": {
                                "name": f'Booking for {instance.full_name}',
                            },
                        },
                        "quantity": 1,
                    }],
                    payment_intent_data={
                        'metadata': {
                            'booking_id': instance.id,
                        },
                        'application_fee_amount': int(instance.total_amount * (franchise.payout_percentage / 100) * 100),
                    },
                    mode='payment',
                    # Create a Stripe checkout session
                    success_url=success_urlpath,
                    cancel_url=settings.PAYMENT_CANCEL_URL,
                    stripe_account=connected_account_id,
                )

                print("After checkout session creation")

                print(checkout_session)

                # Check if the checkout session was successfully created
                if checkout_session and checkout_session.status == 'completed':
                    # Save the instance only if the checkout session is completed
                    instance.save()
                    return redirect(checkout_session.url)
                else:
                    # Handle the case where the checkout session creation failed
                    messages.error(request, 'Failed to create the checkout session. Please try again.')
                    return redirect(reverse('booking:booking_form', kwargs={'id': franchise_id}))

Привет, я пытаюсь сохранить экземпляр объекта бронирования после завершения всех процессов! Это не работает и оставляет меня с Failed to create the checkout session. Please try again. Печать сессии показывает мне это {"status": "open",}. Я попробовал сделать @transaction.atomic без проверки stripe checkout_session.status и сохранить экземпляр после всех процессов, и это просто сохраняет экземпляр, как только я нажимаю paynow-btn, а затем

перенаправляет меня на stripe для оплаты. Есть ли способ решить эту проблему?

Если целью является обновление БД, когда клиент завершил сеанс оформления заказа, вам следует создать конечную точку webhook и зарегистрировать ее для прослушивания событий checkout.session.completed. Подробности реализации см. в этом руководстве.

Вернуться на верх