Python Официальный клиент Stripe, создающий двух клиентов - PullRequest
1 голос
/ 20 апреля 2020

Этот код, который я использую ниже, работает отлично, кроме случаев, когда оформление заказа завершено. Я заметил, что каждый раз, когда кто-то оформляет заказ на моем сайте, делается две записи для клиентов.

У одного установлен источник по умолчанию, а у другого - нет. Я приложил скриншот.

https://i.ibb.co/8dd0Cxz/Screenshot-from-2020-04-20-11-15-25.png

@login_required
def checkout(request):
    if request.method == 'POST':
        plan = Plan.objects.get(nickname=request.POST['plan'])
        stripe_customer = stripe.Customer.create(
            email=request.user.email, source=request.POST['stripeToken'])

        stripe_subscription = stripe.Subscription.create(customer=stripe_customer.id,
                                                         items=[
                                                             {'plan': plan.id}],
                                                         trial_from_plan=True)
        # Tried removing but no the reason for the issue.
        Subscription.sync_from_stripe_data(
            stripe_subscription
        )
        return redirect('settings')
    else:
        if request.method == 'GET':
            plan = Plan.objects.get(nickname=request.GET['plan'])
        return render(request, 'plans/checkout.html',
                      {'plan': plan, 'price': '0'})

Я попытался изменить {'plan': plan.id} на {'plan': plan } и я получаю сообщение об ошибке:

Запрос req_0WL0lW2orGwLMV: Нет такого плана: Семья; существует имя с именем Family, но его идентификатор - plan_H5fvA8jJ0qX9qF.

edit: dj-stripe + webhooks используется, но мне нужно создать клиента с помощью официального API. Похоже, что дублирующий клиент (без источника оплаты) создается последним после (по какой-то причине) создания подписки

1 Ответ

0 голосов
/ 20 апреля 2020
@login_required
def checkout(request):
    if request.method == 'POST':
        plan = Plan.objects.get(nickname=request.POST['plan'])

        # Create the stripe Customer, by default subscriber Model is User,
        # this can be overridden with settings.DJSTRIPE_SUBSCRIBER_MODEL
        stripe_customer, _ = Customer.get_or_create(
            subscriber=request.user)

        # Using the Stripe API, create a subscription for this customer,
        # using the customer's default payment source
        stripe_subscription = stripe.Subscription.create(customer=stripe_customer.id,
                                                         items=[
                                                             {'plan': plan.id}],
                                                         trial_from_plan=True)

        # Add the source as the customer's default card
        stripe_customer.add_card(request.POST['stripeToken'])

        # Sync the Stripe API return data to the database,
        # this way we don't need to wait for a webhook-triggered sync
        Subscription.sync_from_stripe_data(
            stripe_subscription
        )
        return redirect('settings')
    else:
        if request.method == 'GET':
            plan = Plan.objects.get(nickname=request.GET['plan'])
        return render(request, 'plans/checkout.html',
                      {'plan': plan, 'price': '0'})
...