Winsee — онлайн-кинотеатр независимого кино: документальные фильмы про горы, фрирайд и спорт. Нужен был платный доступ ко всему каталогу с автопродлением, входом через привычные российские аккаунты и честными отчислениями авторам. Готовые решения не подходили: магазина на WooCommerce нет, а подписка, рефералы и роялти завязаны друг на друга. Я спроектировал и написал биллинг, авторизацию и защиту плеера с нуля.
Биллинг подписок и оплата
Единый тариф 299 ₽ за 30 дней и своя модель состояний: ожидает оплаты, активна, отменена, истекла.
- рекуррентные платежи через Робокассу — карта вводится один раз;
- доступ открывается по вебхуку от платёжного шлюза, а не по возврату пользователя на сайт;
- cron проверяет подписки каждый час и продлевает заранее, до трёх попыток, после чего закрывает доступ и отправляет письмо;
- отмена не отрезает оплаченное: доступ живёт до конца периода, потому что считается по дате окончания, а не по роли;
- возврат по вебхуку закрывает доступ сразу;
- в админке — чеки по 54-ФЗ, ручное создание подписки и тестовый прогон автоплатежа.
Защита контента
- плеер закрыт оверлеем: без активной подписки вместо видео появляется окно с ценой и входом;
- то же самое доступно шорткодом, чтобы закрывать отдельные материалы;
- у подписчика своя роль без доступа в административную панель;
- плеер подключён через Kinescope, оттуда же берётся статистика просмотров для отчётов.
Единый вход: Сбер ID, Яндекс, VK
Зритель должен дойти от «хочу посмотреть» до оплаты за один шаг, привычным аккаунтом. Разрозненные плагины конфликтовали бы с окном оплаты, поэтому вход написан одним модулем.
- одно окно на вход и регистрацию: телефон, почта с паролем и кнопки провайдеров;
- Сбер ID по OAuth 2.0 и OpenID Connect с PKCE и клиентским сертификатом mTLS;
- Яндекс ID и VK ID по коду авторизации, состояние хранится во временном ключе на стороне сайта;
- через виджет VK доступны также OK.ru и Mail.ru;
- аккаунты связываются по идентификатору провайдера, затем по почте и телефону — один человек не плодит дубли;
- после регистрации зритель сразу получает роль подписчика, а реферальная метка сохраняется.
Рефералы и роялти
- блогер приводит зрителей по персональной ссылке, метка живёт в куках до оплаты;
- отчисления считаются по схеме: доля автора фильма, доля блогера и доля сервиса, причём с третьей оплаты схема меняется;
- отчёт за месяц или произвольный период: сумма сборов, комиссия эквайринга и разбивка по авторам и блогерам.
Скорость
Каталог тяжёлый: постеры, баннер на весь экран, плеер, Elementor. Из коробки он проваливал PageSpeed, поэтому стек донастроен отдельно.
- свои фильтры для WP Rocket: логотип исключён из ленивой загрузки, а вертикальным постерам подставляется заглушка нужной пропорции — без неё вёрстка прыгала;
- кеш страниц, объединение и отложенная загрузка скриптов, критический CSS, предзагрузка шрифтов;
- около 4500 изображений переведены в WebP;
- в дочерней теме — нативная ленивая загрузка ниже первого экрана и отдельные размеры картинок под мобильные;
- фронт плагина подписок собирается Vite, на сервере включены кеш заголовков, OPcache и Redis.
Что дало создание онлайн-кинотеатра
Полный цикл монетизации работает без ручных операций: регистрация, оплата, вебхук, доступ, автопродление, отмена или возврат. В админке накопились 627 подписок и 523 транзакции, отчисления авторам и блогерам считаются одной кнопкой. Мобильный PageSpeed — 95 баллов при нулевом сдвиге вёрстки и времени блокировки 20 мс.



