Биллинг подписок для веб-сервиса - тарифы, рекуррентные платежи и панель владельца

Ссылка на работу
image image
Задача Владелец веб-сервиса пришёл перевести продукт с ручных продлений на подписку. До этого клиент писал в личку, переводил деньги на карту, владелец лез в базу и ставил дату окончания руками. На сотне активных пользователей это стало отдельной работой - кто-то не продлевался просто потому что забыл, кто-то платил дважды, чеков не выдавалось вовсе. Что сделал Биллинг на FastAPI, данные в PostgreSQL, платежи через ЮKassa, сборка в Docker на VPS. Тарифы заводятся в панели - цена, период, лимиты по функциям. Смена тарифа пересчитывается с остатком оплаченных дней. Списание за сутки до конца периода, при отказе банка - три повтора с растущим интервалом, письмо клиенту после первой неудачи и за день до отключения доступа. Главная грабля здесь - вебхуки платёжного сервиса: приходят повторно, с задержкой и не по порядку. Каждое уведомление проверяется по подписи, гасится по идемпотентному ключу, статус подписки двигается только вперёд по цепочке. Так-же раз в час сервис сам опрашивает статусы платежей, которые висят в ожидании дольше десяти минут - это добирает то, что не доехало вебхуком. Результат Продления идут без владельца, ручное включение доступа осталось кнопкой на редкие исключения. За первый месяц со старой схемы переехало около 90 подписок, само продлилось 84. Сообщения из поддержки в духе «оплатил, включите» пропали, доступ открывается по факту платежа за секунды.