UnicoreCMS

Платёжные системы

Подключение агрегаторов и бонусы за пополнение

Оплату подключают в .env, а не в админке. Ключи агрегаторов не должны попадать ни в базу, ни на экран. У каждого провайдера свой флаг и свой набор ключей.

Что поддерживается

ПровайдерПеременные
UnitpayUNITPAY_ENABLED, UNITPAY_PUBLIC_KEY, UNITPAY_SECRET_KEY
FreeKassaFREEKASSA_ENABLED, FREEKASSA_MERCHANT_ID, FREEKASSA_SECRET_KEY, FREEKASSA_SECRET_KEY_SECOND
Enot.ioENOTIO_ENABLED, ENOTIO_MERCHANT_ID, ENOTIO_SECRET_KEY, ENOTIO_SECRET_KEY_SECOND
PayOkPAYOK_ENABLED, PAYOK_SHOP_ID, PAYOK_SECRET_KEY
AnyPayANYPAY_ENABLED, ANYPAY_MERCHANT_ID, ANYPAY_SECRET_KEY
CentAppCENTAPP_ENABLED, CENTAPP_SHOP_ID, CENTAPP_TOKEN

Провайдеров можно включить сколько угодно, игрок выберет способ в кабинете. Если не включён ни один, кнопка пополнения не появится.

Если забыть ключ

Если поставить *_ENABLED=1 и не заполнить ключи, приложение не стартует и напишет, чего именно не хватает. Лучше упасть на старте, чем узнать от игрока, что оплата не работает.

Как настроить

Завести магазин у агрегатора

Понадобятся домен сайта и реквизиты для выплат. Модерация везде своя, от получаса до нескольких дней.

Указать адреса возврата и уведомлений

Три адреса, которые агрегатор спросит:

ЧтоАдрес
Успехhttps://api.example.com/payment/redirect/success/<провайдер>
Неуспехhttps://api.example.com/payment/redirect/fail/<провайдер>
Уведомлениеhttps://api.example.com/payment/methods/<провайдер>/handler

Вместо <провайдер> подставьте unitpay, freekassa, enotio, payok, anypay или centapp.

Первые два просто возвращают игрока на сайт. Третий — вебхук, по которому приходит уведомление об оплате; он должен быть доступен из интернета без авторизации.

Прописать ключи в .env и перезапустить

UNITPAY_ENABLED=1
UNITPAY_PUBLIC_KEY=...
UNITPAY_SECRET_KEY=...

Проверить реальным платежом

На минимальную сумму, с настоящей карты. Тестовые режимы агрегаторов часто ведут себя не так, как боевые, особенно с подписью уведомления.

Как сервер проверяет уведомление

Отсюда растут 90% проблем «оплатил, деньги не пришли», поэтому механику лучше знать.

  1. Приходит POST на handler от агрегатора.
  2. Сервер сверяет IP отправителя со списком адресов провайдера.
  3. Сервер пересчитывает подпись по своему секретному ключу и сравнивает с присланной.
  4. Если всё сошлось, счёт помечается оплаченным и баланс пополняется.

TRUST_PROXY

Если сайт за nginx, а TRUST_PROXY в .env пустой, сервер видит IP прокси вместо IP агрегатора и отклоняет все уведомления. Симптом ровно тот: у агрегатора платежи проходят, а баланс не растёт. Разбор на странице про .env.

Второй по частоте случай — не тот секретный ключ. У FreeKassa и Enot.io их два: одним подписывают ссылку на оплату, другим проверяют уведомление. Если поменять их местами, симптомы будут те же.

Бонусы за пополнение

E-Commerce → Пополнение. Таблица порогов: пополнил на столько-то, получил процент сверху.

СуммаБонус к пополнению, %
5005
100010
300015

Работает ступеньками: сервер берёт самый высокий порог, который платёж перешагнул, и считает процент от всей суммы платежа. При такой таблице пополнение на 1200 зачислит 1320.

Бонус приходит в ту же реальную валюту, а не в бонусную. Каждому порогу можно задать иконку, тогда на странице пополнения они показываются списком наград.

Если порогов нет, игрок получает ровно сумму платежа.

Жизненный цикл платежа

Счёт создаётся, когда игрок нажимает «Пополнить», и остаётся в базе, даже если вкладку закрыли. Брошенные счета копятся быстро, поэтому в настройках есть автоочистка: ставьте 7–14 дней.

Оплаченные платежи лучше хранить дольше: именно к ним приходят с «я платил, где деньги». В карточке платежа видно сумму, метод, ID счёта у агрегатора и IP, с которого пришло уведомление.

Содержание