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 (и возможно другие?) не передают ранее выполненные метаданные.

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