Проект: подписки и кабинет
Регулярные платежи — формат продуктов, который продаётся дороже разовой покупки. Продолжаем урок 72: подписочная модель, пробный период и личный кабинет пользователя.
План и сессия подписки
// Продукт, цена и периодичность: price_recurring = month
await stripe.subscriptions.create({
customer: user.stripeId,
items: [{ price: "price_monthly_pro" }],
trial_period_days: 7, // пробные 7 дней
success_url: "https://app.ru/cabinet"
});
Кабинет пользователя
- текущий план, дата следующего списания и статус (active/past_due);
- история платежей из events платёжного API;
- кнопки «отменить», «приостановить», «сменить план»;
- webhook-события применяем идемпотентно (урок 81).
app.post("/webhooks/stripe", raw, async (req) => {
const ev = stripe.webhooks.constructEvent(req.body, sig, SECRET);
const map = {
"customer.subscription.updated": syncStatus,
"invoice.paid": grantAccess,
"invoice.payment_failed": flagPastDue
};
if (map[ev.type]) await map[ev.type](ev.data.object);
});
💡
Доступ должен расти из статуса в БД (актуального по webhook), а не из клиента. Юзер мог «отменить по-тайком» — сервер проверит уведомление и выключит доступ.
ℹ️
Финальный продукт уроков 72+89 — регулярный доход-бизнес из кода: платёжный цикл, кабинет, статусы. В портфолио эта пара «платежи + подписки» смотрится лучше пары лендингов.