Обновление подписки Stripe с помощью Django и React

Я разработал бэкенд-реализацию для вызовов Stripe API для обработки следующих запросов :

urlpatterns = [
    path('subscription', SubscriptionCreate.as_view(), name="create_subscription"),
    path('add_payment_method', PaymentIntentCreate.as_view(), name="add_payment_method"),
    path('delete_payment_method', PaymentIntentDelete.as_view(), name="add_payment_method"),
    path('customer', CustomerView.as_view(), name="customerview"),
    path('webhook', stripe_webhook, name="stripe_webhook")
]

Ниже приведены мои модели в Django backend для обработки информации о товарах и клиентах :

class Product(models.Model):
    class Plan(models.IntegerChoices):
        FREE         = 0, _('Free')
        BASIC        = 1, _('Basic')
        PREMIUM      = 2, _('Premium')
        ENTENPRISE   = 3, _('Enterprise')
    plan = models.PositiveSmallIntegerField(choices=Plan.choices, null=False, blank=False, default=Plan.FREE)
    stripe_plan_id = models.CharField(max_length=40)

class Customer(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    stripe_customer_id = models.CharField(max_length=40, default="")
    product = models.ForeignKey(Product, on_delete=models.SET_NULL, null=True)
    
    stripe_subscription_id = models.CharField(max_length=40, default="")
    clientsecret = models.CharField(max_length=80, default="")
    active = models.BooleanField(default=True)

Также у меня есть функция post_save, которая запускается "User Creation in Django", которая также создает клиента Stripe, связанного с каждым пользователем, и подписку с планом FREE, который не требует оплаты / информации о карте :

post_save.connect(post_save_customer_create, sender=settings.AUTH_USER_MODEL)
stripe_subscription = stripe.Subscription.create(
    customer=customer.stripe_customer_id,
    items=[{"price": customer.product.stripe_plan_id},],
    payment_behavior='default_incomplete',
    payment_settings={'save_default_payment_method': 'on_subscription'},
    expand=['latest_invoice.payment_intent'],
)

Однако, когда пользователь хочет обновить свою подписку с бесплатной до платной модели (Basic, Premium, Enterprise), тогда требуется информация о методе оплаты/карте.

В этом случае я хочу, чтобы подписка перешла в состояние "Незавершенная", пока платеж не будет подтвержден Stripe.

Я использую следующую стратегию обновления подписки :

if (selected_product.plan == 0 and customer.product.plan != selected_product.plan) or (selected_product.plan > 0 and stripe_customer.invoice_settings.default_payment_method != None and customer.product.plan != selected_product.plan):
       new_subscription = stripe.Subscription.modify(
           stripe_subscription.id,
           items=[
                  {"id": stripe_subscription['items']['data'][0].id, "price": selected_product.stripe_plan_id },
                 ],
           payment_behavior='default_incomplete',
           payment_settings={'save_default_payment_method': 'on_subscription'},
           expand=['latest_invoice.payment_intent'],
       )

Как я могу перевести подписку в неполное / неактивное состояние и проверить, была ли произведена оплата?

Как я могу предоставить фронтенду ссылку или механизм для аутентификации покупки, чтобы я мог убедиться, что подписка оформлена правильно?

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