Документация
Платежи

Stripe

Stripe — это ведущая мировая платформа онлайн-платежей, поддерживающая более 100 способов оплаты, подписки и защиту от мошенничества

Быстрый старт

Создание аккаунта Stripe

Перейдите на сайт Stripe и зарегистрируйте аккаунт.

Получение API-ключа

  1. Откройте Stripe Dashboard и перейдите в DevelopersAPI Keys Stripe API Keys
  2. Создайте ключ Stripe Create API
  3. Скопируйте ключ в .env Stripe Create API
VITE_STRIPE_PUBLISHABLE_KEY=pk_test_xxx
STRIPE_SECRET_KEY=sk_test_xxx

Их также можно указать в панели настроек: Stripe API Keys

Внимание

STRIPE_SECRET_KEY — это чувствительная информация, не отправляйте ее в репозиторий.

Настройка Webhook

Stripe Create Webhook Прослушивайте следующие события:

  • checkout.session.completed
  • invoice.payment_succeeded
  • invoice.payment_failed
  • customer.subscription.created
  • customer.subscription.updated
  • customer.subscription.deleted Stripe Webhook Events Укажите путь callback:
https://your-domain.com/api/payment/webhook/stripe

Stripe Webhook Path

Скопируйте Webhook Secret в .env или укажите его в панели настроек: Stripe Webhook Secret

STRIPE_WEBHOOK_SECRET=whsec_xxx

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

Режим песочницы

Используется для локального тестирования и не приводит к реальным списаниям.

Stripe Sandbox

  1. В Dashboard переключитесь в Test Mode и получите тестовые Publishable Key и Secret Key
  2. Скачайте Stripe CLI и запустите локальное прослушивание:
stripe listen --forward-to localhost:3377/api/payment/webhook/stripe
  1. Скопируйте Webhook Secret из вывода терминала в .env или укажите его в панели настроек: Stripe Webhook Secret
STRIPE_WEBHOOK_SECRET=whsec_xxx

После настройки можно тестировать платежи локально. Для проверки используйте тестовые карты: Stripe Test Cards

Как использовать обратный прокси для тестирования онлайн-платежей

Перейдите на сайт Ngrok

Откройте сайт Ngrok и зарегистрируйте аккаунт.

Запустите Ngrok

ngrok http 3377

Скопируйте публичный адрес из вывода терминала Ngrok Public URL Ваш адрес callback будет таким:

https://xxx.app/api/payment/webhook/stripe

Внимание

Не используйте ngrok в production. После каждого запуска публичный адрес меняется, поэтому нужно обновлять адрес callback. Если нужен фиксированный домен, получите его в ngrok и укажите через --url=.

Проверка конфигурации

Откройте главную страницу, прокрутите до блока pricing и нажмите кнопку покупки. Если вы переходите на страницу Stripe Checkout, значит настройка выполнена успешно. Pricing

Настройка цен

  1. В Stripe Dashboard создайте Product и добавьте Price Stripe Product

  2. Скопируйте Price ID (формат price_xxx) в .env Stripe Price

  3. Скопируйте Price ID (формат price_xxx) в .env. При необходимости можно изменить имена переменных окружения, но они должны совпадать с кодом:

VITE_STRIPE_PRO_MONTHLY_PRICE_ID=price_xxx
VITE_STRIPE_PRO_YEARLY_PRICE_ID=price_xxx
VITE_STRIPE_LIFETIME_PRICE_ID=price_xxx
  1. Измените src/config/payment-config.ts, чтобы суммы и периоды совпадали с настройками в Stripe:
export const paymentConfig: PlanWithPrice[] = [
  {
    id: "pro",                    // Уникальный идентификатор плана, используется в коде
    planType: "subscription",     // free | subscription | lifetime
    credit: {
      amount: 100,                // Кредиты, выдаваемые каждый месяц после подписки
      expireDays: 31,             // Срок действия кредитов
    },
    prices: [
      {
        priceId: import.meta.env.VITE_STRIPE_PRO_MONTHLY_PRICE_ID!,
        amount: 990,              // Значение в центах, 990 = $9.90
        currency,                 // Валюта, берется из VITE_CURRENCY
        interval: "month",        // month | year
        trialPeriodDays: 7,       // Дни пробного периода (необязательно)
      },
      {
        priceId: import.meta.env.VITE_STRIPE_PRO_YEARLY_PRICE_ID!,
        amount: 9900,
        currency,
        interval: "year",
      },
    ],
    display: {
      isRecommended: true,        // Показывать метку "Рекомендовано"
      group: "subscription",      // Группа для отображения в UI
    },
  },
  {
    id: "lifetime",
    planType: "lifetime",         // Разовая покупка
    prices: [
      {
        priceId: import.meta.env.VITE_STRIPE_LIFETIME_PRICE_ID!,
        amount: 19900,
        currency,
      },
    ],
    display: {
      originalPrice: 29900,       // Исходная цена (зачеркнутая)
      group: "one-time",
    },
  },
]

Описание полей

ПолеОписание
idИдентификатор плана, по нему код находит нужный план
planTypefree бесплатно / subscription подписка / lifetime разовая покупка
credit.amountКоличество кредитов, которые выдаются после активации подписки
credit.expireDaysСрок действия кредитов, если не задан, они не истекают
priceIdID цены Stripe, копируется из Dashboard
amountЦена, в центах: 990 = $9.90
intervalПериод подписки, month или year
trialPeriodDaysКоличество дней бесплатного пробного периода
display.isRecommendedПоказывать ли метку рекомендации
display.originalPriceИсходная цена, используется для отображения зачеркнутой цены
display.groupИдентификатор группы, используется для группировки в UI

Содержание