Как сохранить данные stripe webhook в переменные сессии в Django?

В настоящее время я работаю над страницей "успеха" для моего Django проекта (который использует Stripe для приема платежей). Я хотел бы показать на этой странице общую сумму заказа с налогом. Мой Stripe webhook работает и посылает данные, но я никак не могу использовать эти данные за пределами веб-хука. Обычно, когда я хочу сообщить одному представлению данные из другого, я пользуюсь сеансовыми переменными Django. Однако, когда я сохраняю сессионную переменную, попытка использовать ее в моем SuccessView возвращает 'None', а не значение, сохраненное в ней. Любая помощь будет принята с благодарностью. Вот мой релевантный код:

views.py

def stripe_webhook(request):
    payload = request.body
    sig_header = request.META['HTTP_STRIPE_SIGNATURE']
    event = None
    try:
        event = stripe.Webhook.construct_event(
            payload, sig_header, settings.STRIPE_WEBHOOK_SECRET
        )
    except ValueError as e:
        # Invalid payload
        return HttpResponse(status=400)
    except stripe.error.SignatureVerificationError as e:
        # Invalid signature
        return HttpResponse(status=400)

    # Handle the checkout.session.completed event
    if event['type'] == 'checkout.session.completed':
        session = event['data']['object']
        customer_email = session["customer_details"]["email"]
        line_items = stripe.checkout.Session.list_line_items(session["id"])
        print(line_items)
        stripe_price_id = line_items["data"][0]["price"]["id"]
        price = Price.objects.get(stripe_price_id=stripe_price_id)
        total_paid_cents = line_items["data"][0]["amount_total"]
        total_paid_dollars = total_paid_cents / 100
        request.session['total_paid'] = total_paid_dollars
    return HttpResponse(status=200)

class SuccessView(TemplateView):
    template_name = "musicstudios/success.html"
    extra_context = sidebar_context
    def get_context_data(self, **kwargs):
        context = super(SuccessView, self).get_context_data(**kwargs)
        order_id = self.request.session.get('order_id')
        order = Order.objects.get(pk=order_id)
        product_id = order.product.id
        product = Product.objects.get(pk=product_id)
        customer = Customer.objects.get(pk=order.customer.id)
        total_paid = self.request.session.get('total_paid')
        print(total_paid)
        context['customer'] = customer
        context['product'] = product
        context['order'] = order
        context['order_total'] = total_paid
        return context

success.html

<div class="contentborder">
    <span class="mb-2">
        <span class="flex flex-col bg-slate-800 bg-opacity-25 border-slate-600 rounded-lg pl-4 pr-2 py-2 mt-2 mb-4">
            <span class="flex flex-row justify-between">
                <h3 class="text-xl font-bold mb-1">Order Details</h3>
            </span>
            <p class="py-1"><strong>Order total:</strong> ${{ order_total }}</p>
            <p class="py-1"><strong>Order includes:</strong> {{ order.price.price_description }}</p>
            {% if order.cust_requests %}
            <p class="py-1"><strong>Requests:</strong> {{ order.cust_requests }}</p>
            {% else %}
            <p class="py-1"><strong>Requests:</strong> No specific requests made.</p>
            {% endif %}
            {% if order.reference_track %}
            <p class="py-1"><strong>Reference track link:</strong> {{ order.reference_track }}
            {% else %}
            <p class="py-1"><strong>Reference track link:</strong> No reference track linked.</p>
            {% endif %}
            {% if order.music_file %}
            <p class="py-1"><strong>Music file:</strong> {{ order.music_file }}
            {% else %}
            <p class="py-1"><strong>Music file:</strong> No music file uploaded.</p>
            {% endif %}
            <p class="py-1"><strong>Order Date:</strong> {{ order.order_date }}
        </span>
    </span

Когда Stripe отправляет Event на вашу конечную точку webhook, она делает HTTP-запрос на ваш сервер. Этот запрос совершенно не связан с запросом (запросами), сделанным вашим клиентом. Вы не можете установить что-то в сессии запроса для кода обработчика webhook, который затем может быть использован в сессии страницы успеха. Они полностью разделены.

Лучшим вариантом здесь будет обработка этого в вашем SuccessView тоже. Вы можете посмотреть состояние самой сессии, используя Retrieve Checkout Session API во время перенаправления. В качестве альтернативы вы можете сохранить эту информацию в своей базе данных, когда обработчик webhook получает событие, а затем попросить вашего SuccessView посмотреть состояние в вашей базе данных.

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