Как сохранить данные 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
посмотреть состояние в вашей базе данных.