Stripe client_reference_id: null в checkout.session.completed
У меня есть таблица цен stripe на передней стороне для отображения вариантов, доступных клиентам. На моем бэкенде я использую Django для обработки создания учетной записи, если платеж был успешным. Как показано ниже, это было создано по учебнику на TestDriven.io btw.
if event['type'] == 'checkout.session.completed':
session = event['data']['object']
print(session)
# # Fetch all the required data from session
client_reference_id = session.get('client_reference_id')
stripe_customer_id = session.get('customer')
stripe_subscription_id = session.get('subscription')
# Get the user and create a new StripeCustomer
user = CustomUser.objects.get(id=client_reference_id)
StripeCustomer.objects.create(
user=user,
stripeCustomerId=stripe_customer_id,
stripeSubscriptionId=stripe_subscription_id,
)
Я получаю следующую ошибку
raise self.model.DoesNotExist(apps.authentication.models.CustomUser.DoesNotExist: CustomUser matching query does not exist
После некоторого копания я обнаружил, что Stripe не возвращает client_reference_id в мой бэкенд, ниже приведена распечатка переменной сессии
"client_reference_id": null,
Я считаю, что именно поэтому Django не находит аккаунт, но я не могу понять, почему Stripe не отправляет эту информацию или как прикрепить ее к ответу на мой веб-хук?
Я столкнулся с той же проблемой, хотя и в другом технологическом стеке.
Решением является передача дополнительной информации, которая вам необходима, в качестве metadata
параметра. Смотрите документацию Stripe об этом.
Со:
Session.create(
success_url="https://example.com/success",
cancel_url="https://example.com/cancel",
line_items=[
...
],
metadata={
'user_id': my_user_id,
}
)
этот дикт метаданных должен быть передан на checkout.session.completed
событие webhook.
Со:
if event['type'] == 'checkout.session.completed':
session = event['data']['object']
metadata = session['metadata']
..
user_id = metadata.get('user_id')
..
user = CustomUser.objects.get(id=user_id)
Параметр метаданных прикреплен к большинству объектов Stripe.
Однако, checkout.session.expired
и payment_intent.canceled
(и возможно другие?) не передают ранее выполненные метаданные.