Интеграция Stripe в Django для подписок

Интеграция Stripe в Django для подписок — это важный шаг для создания приложения, которое будет эффективно обрабатывать платежи и подписки. В настоящей статье мы разберем, как интегрировать Stripe, какие инструменты и библиотеки нам понадобятся, а также подробно рассмотрим, как реализовать систему подписок, используя Django.

Что такое Stripe?

Stripe — это популярная платформа для обработки платежей, которая предоставляет API для работы с платежами, управлением подписками и другими финансовыми операциями. Stripe позволяет разработчикам легко внедрять функции обработки платежей на своих веб-сайтах и в мобильных приложениях. С помощью Stripe можно безопасно управлять картами, выставлением счетов и подписками, что делает его идеальным инструментом для SaaS-проектов.

Одной из ключевых особенностей Stripe является поддержка подписок. Разработчики могут создавать многоуровневые подписки с различными тарифами, что позволяет гибко подходить к монетизации своих проектов. Stripe также обеспечивает высокий уровень безопасности, что является особенно важным при обработке платежной информации пользователей.

Подготовка окружения Django

Перед тем как интегрировать Stripe, необходимо подготовить окружение Django. Убедитесь, что у вас установлены Python и Django. Если вы еще не создали проект Django, выполните следующие команды:

pip install django
django-admin startproject myproject
cd myproject
python manage.py startapp subscriptions

После создания приложения «subscriptions» необходимо добавить его в список INSTALLED_APPS в настройках вашего проекта. Откройте файл settings.py и добавьте:

INSTALLED_APPS = [
    ...
    'subscriptions',
]

Также убедитесь, что у вас установлен пакет Stripe. Для установки выполните следующую команду:

pip install stripe

Настройка Stripe

Первым шагом в настройке Stripe является создание учетной записи на сайте Stripe. После регистрации вам будет доступен панель управления, где можно получить ключи API, необходимые для интеграции. Stripe предоставляет два набора ключей: тестовые и живые. Во время разработки рекомендуется использовать тестовые ключи.

В панели управления вы можете создать свои продукты и тарифы. Нужно будет добавить товары, а затем создать планы с различными ценами, которые будут использоваться для подписок. Для вашего приложения вам потребуются следующие данные:

  • Publishable Key
  • Secret Key

Сохраните эти ключи, так как они понадобятся нам в коде.

Конфигурация Django для работы с Stripe

Теперь, когда у вас есть ключи API Stripe, нужно настроить Django для работы с ними. Создайте файл stripe.py в папке вашего приложения «subscriptions». В этом файле мы будем хранить основные конфигурации для Stripe.

import stripe
from django.conf import settings

stripe.api_key = settings.STRIPE_SECRET_KEY

Также добавьте соответствующие ключи в ваш settings.py:

STRIPE_TEST_PUBLISHABLE_KEY = 'ваш_публикуемый_ключ'
STRIPE_TEST_SECRET_KEY = 'ваш_секретный_ключ'

Теперь вам нужно будет создать представления для обработки платежей и подписок. Определите точки доступа API для создания и управления подписками, которые будут использоваться на клиентской стороне.

Создание моделей для подписок

Для того чтобы хранить информацию о пользователях и их подписках, создадим модели в файле models.py вашего приложения. Вы можете использовать следующую структуру:

from django.db import models
from django.contrib.auth.models import User

class Subscription(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    stripeCustomerId = models.CharField(max_length=255)
    stripeSubscriptionId = models.CharField(max_length=255)
    active = models.BooleanField(default=True)
    
    def __str__(self):
        return f"{self.user.username} Subscription"

Эта модель содержит основную информацию о подписке, включая идентификаторы Stripe для клиента и подписки.

Создание формы для подписки

Теперь нам нужна форма для сбора платежной информации от пользователей. Создайте файл forms.py в вашем приложении с следующим содержимым:

from django import forms

class SubscriptionForm(forms.Form):
    card_number = forms.CharField(max_length=20)
    exp_month = forms.CharField(max_length=2)
    exp_year = forms.CharField(max_length=4)
    cvc = forms.CharField(max_length=4)

Эта форма содержит поля для ввода данных кредитной карты. Вы можете расширить ее, добавив валидацию или дополнительные параметры по мере необходимости.

Создание представлений для подписки

Теперь перейдем к созданию представлений, которые будут обрабатывать логику подписки. В файле views.py определите функции для отображения форм подписки и обработки отправленных данных. Примерный код может выглядеть так:

from django.shortcuts import render, redirect
from .forms import SubscriptionForm
from .models import Subscription
import stripe

def subscribe(request):
    if request.method == 'POST':
        form = SubscriptionForm(request.POST)
        if form.is_valid():
            # Здесь вы получите данные формы
            card_info = {
                "number": form.cleaned_data['card_number'],
                "exp_month": int(form.cleaned_data['exp_month']),
                "exp_year": int(form.cleaned_data['exp_year']),
                "cvc": form.cleaned_data['cvc']
            }

            # Создание клиента в Stripe
            customer = stripe.Customer.create(
                email=request.user.email,
                source=stripe.Token.create(card=card_info)
            )

            # Создание подписки
            subscription = stripe.Subscription.create(
                customer=customer.id,
                items=[{"price": "ваш_идентификатор_плана"}],
            )

            # Сохранение информации о подписке в базе данных
            Subscription.objects.create(
                user=request.user,
                stripeCustomerId=customer.id,
                stripeSubscriptionId=subscription.id,
            )

            return redirect('subscription_success')
    else:
        form = SubscriptionForm()
    return render(request, 'subscribe.html', {'form': form})

Создание шаблонов

Теперь нужно создать шаблон формы подписки. В папке templates (если ее нет, создайте) создайте файл subscribe.html:

{% csrf_token %} {{ form.as_p }}

Это простая форма, которая будет отправлять данные на сервер для обработки.

Обработка вебхуков Stripe

Stripe поддерживает вебхуки для уведомления вашего сервера о событиях, связанных с подписками (например, отмена или истечение подписки). Для этого вам нужно будет создать URL для просмотра вебхуков и соответствующим образом настроить его в панели управления Stripe.

Добавьте новый маршрут в urls.py:

from django.urls import path
from .views import stripe_webhook

urlpatterns = [
    ...
    path('stripe/webhook/', stripe_webhook, name='stripe-webhook'),
]

Затем в views.py добавьте обработчик:

from django.http import JsonResponse

def stripe_webhook(request):
    payload = request.body
    event = None

    # Проверка подписи вебхука
    try:
        event = stripe.Webhook.construct_event(
            payload, request.META['HTTP_STRIPE_SIGNATURE'], settings.STRIPE_WEBHOOK_SECRET
        )
    except ValueError as e:
        return JsonResponse({'error': str(e)}, status=400)
    except stripe.error.SignatureVerificationError as e:
        return JsonResponse({'error': str(e)}, status=400)

    # Обработка события
    if event['type'] == 'customer.subscription.deleted':
        subscription_id = event['data']['object']['id']
        subscription = Subscription.objects.get(stripeSubscriptionId=subscription_id)
        subscription.active = False
        subscription.save()

    return JsonResponse({'status': 'success'})

Этот код обрабатывает уведомления о некоторых событиях и обновляет состояние подписки в вашей базе данных.

Тестирование интеграции

После завершения разработки необходимо протестировать интеграцию. Stripe предоставляет тестовые карты, которые можно использовать для проверки, корректно ли работает ваша подписка. Введите тестовые карты в форме и проверьте, что запросы к Stripe обрабатываются корректно.

Кроме того, убедитесь, что все вебхуки обрабатываются правильно, включая события отклонения платежей, обновления подписок и отмены. В случае обнаружения проблем внесите необходимые изменения в код.

Заключение

Интеграция Stripe в приложение Django для обработки подписок — это мощный способ добавить функциональность оплаты. Следуя шагам, изложенным в этой статье, вы можете создать систему подписок, которая будет безопасной и эффективной.

Stripe предлагает множество возможностей, включая обработку различных типов платежей и автоматизацию управления подписками. При этом важно оставаться в курсе обновлений API и лучших практик безопасности при работе с финансовыми данными.

С правильной реализацией ваша система подписок может стать основным источником дохода для вашего приложения, поэтому не забывайте тестировать и улучшать ее с течением времени.

Интеграция Stripe с Django Подписки Stripe в Django API Stripe для Django Платежные системы Django Stripe Создание подписок в Django
Stripe webhook Django Обработка платежей Stripe Django Stripe billing integration Подписочные сервисы Django Stripe Django Stripe tutorial