Обновление подписки 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'],
)
Как я могу перевести подписку в неполное / неактивное состояние и проверить, была ли произведена оплата?
Как я могу предоставить фронтенду ссылку или механизм для аутентификации покупки, чтобы я мог убедиться, что подписка оформлена правильно?