Веб-платформа 64 автотеста

Сайт с оплатой и личным кабинетом

Веб-проект на бэкенде и фронтенде: лендинг, который сам продаёт, — с платёжным потоком, автоматической выдачей доступа, личным кабинетом и админ-панелью. Законченный цикл продажи, а не просто страница с описанием продукта.

Роль: бэкенд, фронтенд, оплата, аккаунты Стек: TypeScript · Express · node:sqlite · Lava.top Статус: сдан заказчику

Демо-версию здесь не даём — в этом кейсе не называем ни заказчика, ни продукт, поэтому не даём ссылку, которая могла бы их раскрыть.

Главная страница сайта продукта, сделанного в этом проекте
Задача

Задача

Нужен был не сайт-визитка о продукте, а сайт, который сам продаёт: принимает оплату, сразу открывает доступ и даёт покупателю личный кабинет, чтобы управлять доступом после оплаты.

Это означало сразу три требования без права на нестыковку: платёжный поток, который не может списать оплату дважды или выдать доступ дважды; личный кабинет, которым покупатель реально пользуется после оплаты; и админ-панель для работы с аккаунтами без ручных правок в базе данных.

Решение

Решение

Сайт на Express и TypeScript с базой на node:sqlite: лендинг, приём оплаты через платёжный шлюз Lava.top. Вебхук сначала перепроверяет статус платежа у провайдера, а затем передаёт его идемпотентному шагу выдачи доступа — так повторный или задвоенный вызов вебхука не создаст вторую лицензию и не спишет оплату дважды.

Вход устроен через OAuth с гео-роутингом провайдера: пользователи из России авторизуются через Яндекс, остальные — через Google, каждый через провайдера, подходящего его региону. Поверх этого — тарифная система из пяти платных планов и двух бесплатных уровней, и админ-панель для поддержки и работы с аккаунтами.

Оплата и выдача доступа

Платёжный поток, который переживает повторы, задвоенные вебхуки и частичные сбои без двойных списаний.

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

Аккаунты и админка

Всё, что нужно покупателю и команде поддержки сразу после оплаты.

Личный кабинет, где покупатель видит и управляет своим доступом после оплаты
Админ-панель для работы с аккаунтами и поддержкой без ручных правок в базе данных
Вход через OAuth с гео-роутингом провайдера — каждый пользователь авторизуется через провайдера, подходящего его региону

Бэкенд и тесты

Express/TypeScript-бэкенд на node:sqlite, с тарифной системой и реальным набором автотестов за ней.

Пять платных тарифов и два бесплатных уровня в единой тарифной конфигурации
node:sqlite в роли базы данных — не нужно поднимать отдельный сервер БД
64 автотеста (node:test), покрывающих оплату, выдачу доступа и работу с аккаунтами
Результат

Результат

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

64
автотеста (node:test), покрывающих оплату, выдачу доступа и работу с аккаунтами
5 + 2
тарифных уровней — 5 платных планов и 2 бесплатных
2
провайдера OAuth, выбираемых по региону пользователя

Из уважения к приватности заказчика в этом кейсе не называется ни сам продукт, ни ссылка на живую версию — описана только инженерная часть сайта.

Другой кейс

ещё 1 проект
Сайт-каталог Краснодар

«Южные Порталы» — сайт-каталог для монтажной компании

Было Нужен был сайт-каталог для монтажной компании: три уровня категорий, десятки товарных страниц, без конструктора. Стало Каталог на 3 уровня, 576 из 576 изображений с alt-текстом и самописный доступный lightbox — без сторонних библиотек.
82 HTML-страницы, свёрстанные вручную по единому шаблону
Похожая задача?
Нужен сайт, который продаёт, а не просто рассказывает, — расскажите детали, предложим решение.
Оставить заявку