Что такое PrizeX
PrizeX — платформа призов, игр и маркетплейса на PHP: аукционы, лотерея, мистери-боксы, набор аркадных игр, мультипродавцовый интернет-магазин и экономика кошелька и монет — всё в одном самостоятельно размещаемом приложении. В основе — архитектура плагинов и тем с панелью администратора и 38 плагинами платёжных шлюзов, которые закрывают карты, кошельки, криптовалюты и региональные процессинги, плюс 3 ручных способа оплаты, заведённых ядром.
Никакой привязки к SaaS: вы ставите платформу на свой хостинг, владеете базой данных и получаете обновления навсегда по лицензии. Каждое направление (аукционы, лотерея, мистери-боксы, игры, магазин) включается и отключается независимо из панели администратора — свежая установка может работать и как продукт с одним направлением, и как полный набор.
Основной код никогда жёстко не зависит от плагина. Каждое направление, каждый платёжный шлюз и каждый вход через соцсети — это плагин в plugins/, который можно включить, отключить или удалить, не сломав остальной сайт.
Префикс таблиц tbl_, без ORM, в основном подготовленные запросы. Каждый плагин владеет своими таблицами и мигрирует их сам через идемпотентный установщик db_delta().
На чём это работает
PrizeX работает на обычном shared-хостинге или VPS — особая настройка сервера не нужна, достаточно веб-сервера с поддержкой rewrite.
* Несколько файлов в database/migrations/ используют расширение ADD COLUMN IF NOT EXISTS, которое есть только в MariaDB. Обычный MySQL 8.0/8.4 его отвергает — берите в качестве базы данных MariaDB, и в разработке, и на продакшене.
Как поднять свежую установку
Мастера установки для свежей настройки нет — вы импортируете схему напрямую и настраиваете файл окружения.
- Установите зависимости PHP:
composer install - Скопируйте шаблон файла окружения и впишите доступы к своей базе данных:
cp .env.example .env - Импортируйте
database/production.sqlв базу данных, указанную в вашем.env, — так создаётся полная схема. - Замените предустановленную учётную запись администратора (см. врезку ниже), затем войдите по адресу
/admin/.
database/production.sql есть строка tbl_admin (admin@wowcodes.in), хеш пароля которой одинаков на каждой установке. Удалите её и заведите свою до запуска в бой:
php -r "echo password_hash('your-password', PASSWORD_BCRYPT), \"\n\";"DELETE FROM tbl_admin;
INSERT INTO tbl_admin (username, email, password, image, status, permission_settings)
VALUES ('yourname', 'you@example.com', '<hash from the command above>', '', 1, 1);Для локальной разработки хватает встроенного сервера PHP, без Apache: php -S localhost:8000 router.php — учтите, что этот сервер полностью игнорирует .htaccess, поэтому router.php вручную повторяет те же правила маршрутизации (см. Настройка веб-сервера).
Переменные окружения
Все настройки, зависящие от окружения, лежат в .env и загружаются через vlucas/phpdotenv. Скопируйте .env.example в .env (этот файл не попадает в git) и пропишите реальные значения для каждого окружения — как минимум доступы к базе данных, ещё до импорта схемы.
Общие настройки сайта, не зависящие от окружения (название приложения, валюта, активные плагины, активная тема и переключатели по каждому направлению), хранятся в базе данных, в tbl_settings, и управляются из панели администратора, а не через файлы.
Настройка веб-сервера
Правила маршрутизации и безопасности — человекопонятные URL, запрет прямого доступа к .env/connection.php/логам и защита от выполнения загруженных файлов как PHP — заданы в файлах .htaccess по всему проекту. Apache и LiteSpeed/OpenLiteSpeed читают их нативно.
На nginx используйте nginx.conf.example: там все те же правила собраны в блок server{} для nginx — поправьте server_name, root и сокет PHP-FPM под своё окружение.
.htaccess (продакшен), router.php (локальный dev-сервер php -S) и nginx.conf.example (nginx) реализуют одни и те же правила маршрутизации независимо друг от друга. Новый человекопонятный URL означает правку во всех трёх.
Архитектура запроса
Каждая страница витрины (index.php, item.php, …) стартует через includes/header.php в таком порядке:
connection.php запускает сессию, подключается через mysqli с доступами из .env, загружает tbl_settings в константы вроде APP_NAME и CURRENCY и авторизует текущего пользователя вместе со строкой отпечатка устройства. plugins_load() поднимает каждый активный плагин и вызывает хук plugins_loaded — именно в этот момент становится известен реальный текущий набор активных направлений, поэтому header.php уже после этого сверяет старые флаги настроек (shop, multivendor, auction, lottery) с фактическим состоянием активности плагинов.
Панель администратора не дублирует этот запуск — admin/includes/connection.php задаёт свои настройки сессии и ошибок, а затем подключает тот же корневой includes/connection.php.
Система плагинов
Плагин — это plugins/<slug>/plugin.php, метаданные в заголовочном комментарии, которые разбираются без выполнения файла, плюс необязательный plugin.json с более подробной информацией для каталога. Активные плагины хранятся JSON-массивом в tbl_settings.active_plugins.
- Владение таблицами — каждый плагин описывает свой
includes/schema.php, который вызывается при активации и использует идемпотентный помощникdb_delta()(CREATE TABLE IF NOT EXISTSплюс только добавляющийALTER TABLE ADD COLUMN). Плагин никогда не трогает таблицы другого плагина. - Реестры загружаются первыми —
add_admin_page,add_route,add_cron_job,add_api_routeиregister_moduleопределяются до загрузки любого плагина, поэтому вызовы на верхнем уровне плагина никогда не приводят к фатальной ошибке, даже если плагин в итоге останется неактивным. - Чистое удаление — при удалении плагина запускается его
uninstall.phpи убирается его папка; ничто за пределамиplugins/<slug>/не должно жёстко подключать его файлы, поэтому остальной сайт продолжает работать и без плагина.
Система тем
Тема живёт в assets/themes/<slug>/ — это manifest.php, theme.css, functions.php для хуков темы и необязательная папка components/. Активная тема хранится в tbl_settings.active_theme; если она не задана, подставляется запасная editorial.
Компонент ищется по порядку: сначала в собственной папке components/ активной темы, затем в каталоге компонентов, объявленном плагином через register_module(), затем в общей корневой components/. На практике это значит, что общий вариант по умолчанию лежит один раз в components/, а любая тема — или активный плагин направления — может переопределить конкретный путь компонента своей копией.
База данных
Префикс таблиц tbl_, чистый mysqli, в основном подготовленные запросы. Файлы SQL в порядке приоритета:
database/core-schema.sql— поддерживается вручную, только таблицы ядра; таблицы направлений и плагинов сюда намеренно не включены.database/production.sql— генерируется (схема ядра плюс собственная процедура установки каждого плагина, выгруженные из пустой временной базы). Именно этот файл вы импортируете при свежей установке.database/sandbox.sql— демонстрационный набор данных для локальной разработки.database/migration.sql— сводный идемпотентный скрипт обновления для уже работающих установок.database/migrations/<slug>/up.sql(плюсdown.sqlтам, где откат возможен) — по одному файлу на каждую отдельную миграцию.
Модули
Все модули поставляются в одной установке и включаются независимо друг от друга из панели администратора.
Аукционы
Живые торги с мультипродавцовым кабинетом продавца и расчётом комиссий. Основной плагин: plugins/auction.
Лотерея
Тиражи по билетам с настраиваемым расписанием, призами и уведомлением победителей. Основной плагин: plugins/lottery.
Мистери-бокс
Настраиваемые призовые фонды с анимацией вскрытия — пользователь покупает коробку и сразу видит, что ему выпало. Плагин: plugins/mystery-box.
Игры и награды
Набор аркадных игр в games/ плюс плагины вовлечения и заработка:
Магазин и маркетплейс
Мультипродавцовый слой электронной коммерции с инструментами акций и мерчандайзинга. Основные плагины: plugins/shop, plugins/multivendor.
Кошелёк, монеты и инвестиции
Единый кошелёк платформы, общий для всех модулей.
Рефералы и награды
Авторизация, доверие и комплаенс
Утилиты
Панель администратора
Панель администратора живёт в admin/ и не дублирует запуск витрины — она задаёт свои настройки сессии и ошибок, а затем подключает тот же корневой includes/connection.php. Страницы регистрируются через add_admin_page(), который берёт на себя пункт бокового меню, проверку прав, CSRF и обвязку авторизации; JSON-действия только для администратора регистрируются через add_admin_ajax() и вызываются по admin/ajax.php?action=<slug>.
Товары, баннеры, страницы, меню, блог.
Управление автоматическими и ручными шлюзами, проверка ручных платежей, выгрузка выплат.
Группы пользователей, роли, данные продавцов, вход от имени пользователя.
Выгрузки транзакций, заказов и пользователей, логи cron, отслеживание ошибок, журнал действий администратора.
Email-рассылки, шаблоны, новостные письма, push-уведомления, журнал уведомлений.
Включение и отключение плагинов и тем, настройки SEO для каждой страницы, общие настройки сайта.
Темы витрины
В комплекте пять тем в assets/themes/, они переключаются для каждой установки из панели администратора. Каждая тема держит свою копию общих компонентов в собственной папке components/.
Простой современный вид с белыми карточками и мягкими тенями — безопасный универсальный выбор почти для любого магазина.
Чистый журнальный стиль с тёплыми бумажными тонами и чёткой типографикой — для аккуратной витрины, вызывающей доверие.
Тема по умолчаниюСмелая роскошная тёмная тема с золотыми акцентами — сделана так, чтобы ощущаться азартной и дорогой.
Тёплый, богато украшенный вид в духе традиционных рынков, с поддержкой языков с письмом справа налево.
Жутковатый праздничный сезонный вид — глубокий фиолетовый фон со светящимися тыквенно-оранжевыми акцентами.
Платёжные шлюзы
38 автоматических шлюзов принадлежат плагинам — каждый лежит в своей папке plugins/gateway-<slug>/ и регистрируется в ядре через add_payment_gateway(). Достаточно активировать шлюз, и он работает; в диспетчере оформления заказа (payment_processor.php) нет ничего, зашитого под конкретный шлюз.
3 ручных способа — это заведённые ядром строки с gateway_type = 'manual', без кода init/verify, который надо было бы настраивать: они просто показывают инструкцию по оплате или QR-код. Плагин manual-gateway-builder позволяет администратору добавить свои ручные способы оплаты, не трогая код.
Некоторые шлюзы (Stripe, Razorpay, Midtrans, Venmo) дополнительно регистрируют хук render — для сценариев оформления заказа, которым нужен клиентский JS: загрузчик Stripe Checkout или SDK Razorpay/Midtrans/Braintree, которому сначала нужен идентификатор заказа или токен, созданный на сервере. Любому другому шлюзу никакой дополнительной обвязки в ядре не требуется.
Слои API и AJAX
api/v1/— REST API с авторизацией по JWT для мобильного приложения и внешних потребителей.api/v1/middleware/*.phpпроверяет заголовокAuthorization: Bearer <token>. Плагины добавляют свои эндпоинты черезadd_api_route().ajax/— внутренний AJAX с авторизацией по сессионной куке для собственного JS витрины (корзина, купоны, уведомления). Слоя токенов нет — всё опирается на сессию PHP, которую поднимаетconnection.php.- Разрозненный
api/в корне — разные неверсионированные эндпоинты вродеgeo_location.php,exchange-rate.phpиofferwall_postback.php.
Мобильное приложение
mobile/ — отдельный проект на Capacitor и Ionic: обёртка WebView вокруг живого сайта, а не самостоятельное SPA и не только потребитель api/v1. В его capacitor.config.ts параметр server.url указывает на ваш домен. У него свой package.json, и из корня проекта он не собирается:
cd mobile
npm run sync
npm run open:ios
npm run open:androidОбновления и миграции
Сделайте резервную копию, прежде чем выполнять database/migration.sql или любой database/migrations/<slug>/up.sql на живой базе данных:
mysqldump --single-transaction -u<user> -p<pass> <db> > pre-deploy-$(date +%Y%m%d-%H%M%S).sqlК большинству миграций прилагается парный down.sql, который откатывает ровно это одно изменение. У немногих, что преобразуют существующие данные, а не просто добавляют структуру, вместо этого лежит down.sql с пояснением, почему он ничего не делает, — для них при откате восстанавливайте дамп, снятый до деплоя.
Заметки по безопасности
- Смените предустановленные доступы администратора сразу после импорта (см. Установка).
.env,connection.phpи файлы логов закрыты от прямого доступа по HTTP правилами.htaccess/ nginx из комплекта — не убирайте эти правила.- Загруженные файлы отдаются так, что не могут выполниться как PHP, — это обеспечивается на уровне конфигурации веб-сервера, а не приложения.
- Доступы к платёжным шлюзам настраиваются отдельно для каждого шлюза в панели администратора и хранятся на сервере — на витрину они не попадают никогда.
Тестирование
Набора PHPUnit нет. composer test запускает bin/run-probes.php, который собирает каждый файл probe_*.php в includes/_probes/ и в собственной папке _probes/ каждого плагина, запускает их по одному отдельным процессом CLI и проверяет код возврата.
composer test # run every probe
php plugins/<slug>/_probes/probe_*.php # run a single probe directly
php bin/run-probes.php --all # also run destructive probes (skipped by default)Частые вопросы
Поддержка и ресурсы
Всё ещё в тупике или нужно то, чего нет на этой странице?