ABXplay Настройка игр

Общая схема интеграции

Схема взаимодействия пользователя с игрой.

ABXplay integration scheme

Настройка проксирования

Для корректной работы приложения необходимо проксировать:

Пример конфигурации для apache:


        <Location ${abx_play_folder}>
            RewriteEngine On
            RewriteCond %{REMOTE_HOST} (.+)
            RewriteRule . - [E=RH:%1]
            RequestHeader set X-Real-IP %{RH}e
            ProxyPass http://static.abx-play.fun
            ProxyPassReverse http://static.abx-play.fun
        </Location>

        <Location /${billing_uuid}/api/>
            RewriteEngine On
            RewriteCond %{REMOTE_HOST} (.+)
            RewriteRule . - [E=RH:%1]
            RequestHeader set X-Real-IP %{RH}e
            ProxyPass http://data.abx-play.fun/${billing_uuid}/api/
            ProxyPassReverse http://data.abx-play.fun/${billing_uuid}/api/
        </Location>
        

Пример конфигурации для nginx:


    location ${abx_play_folder}/
        {
            proxy_pass http://static.abx-play.fun/;
            proxy_redirect  off;
            proxy_set_header        X-Real-IP       $remote_addr;
            proxy_set_header        Host            static.abx-play.fun;
            proxy_set_header Authorization "";
        }

        location /${billing_uuid}/api/
        {
            proxy_pass http://data.abx-play.fun;
            access_log /var/log/nginx/slot_api.access_log mainext;
            proxy_redirect  off;
            proxy_set_header        X-Real-IP       $remote_addr;
        }

Веб-страница со встраиваемой игрой

В коде страницы должно быть следующее:

<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no, minimal-ui" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="${abx_play_folder}/loader/loader.js"></script> //скрипт для запуска игр
<script type="text/javascript">
window.init_loader({
            currency: "${currency}", //валюта игрока
            language: "${language}", //локализация
            home_page: "${home_url}" //по умолчанию "/" - url домашней страницы при выходе из игры соответствующей кнопкой в игре (home)
            token: "${session_token}", //unque user id
            billing: "${billing_uuid}", //ID биллинга
            game: "${game_id}", //ID игры, например abx_egypt_riddles, список ID есть в конфигурационном файле с играми
            kf_list: [${denomination_list}], //возможные значения деноминации, задается массивом, например [1,10,500], по умолчанию [1,5,10,50,100,500]
            bet_per_line: [${bet_per_line}], //возможные значения ставки на линию, задается массивом, например [1,10,500], если не задано, используется значение по умолчанию
            kf: "${denomination}", //стоимость кредита в валюте (значение 1 означает, что 1 кредит = 1 копейке)
            path: "${abx_play_folder}/", //путь к прокси, значение по умолчанию - /media
});
</script>
<div id="game-content"></div> //контейнер с игрой, ID менять нельзя
	

ВНИМАНИЕ:

function getSlotSessionToken() {
    $tokens = array($this->getUserId(), session_token_id());
    $tokens[] = md5($tokens[0] . "," . $tokens[1] . ",some_secret_message");
    return implode('|', $tokens);
}

Взаимодействие с вашим биллингом

Во время игры, сервер взаимодействует с биллингом вашего сайта посредством POST /.../do, чтобы изменять баланс игрока, как только он меняется в игре (происходит спин, или выигрыш). Метод принимает JSON со следующими полями:


"session"            - идентификатор игровой сессии. ключ, по которому биллинг проводит операции со счетом;
"method"  - "do"     - что должно произойти/тип операции - списания/начисления;
"minus"              - сумма списания, заданная положительным числом, означающим сумму списания, выраженную в копейках или рублях (регулируется параметром на сервере) или 0;
"plus"               - сумма пополнения, заданная положительным числом, означающим сумму пополнения, выраженную в копейках или рублях (регулируется параметром на сервере) или 0;
"trx_id"             - уникальный номер транзакции (строка), в которой может быть целое положительное число или UUID;
"sign"               - уникальная подпись к запросам от сервера приложений к серверу биллинга клиента (используется опционально по вашему запросу). Проверка подлинности подписи sign должна осуществляться на стороне биллинга клиента;
"tag"                - назначение операции, содержащее вложенную структуру (используется опционально по вашему запросу), со следующими опциональными полями:


    //для Slots:
    {
        "game": "slot",
        "game_id": "a_op",            // Источник игры на сервере, указан в конфигурационном файле как source
        "game_uuid": 254321,          // id спина в системе
        "lines": 1,                   // Количество линий в спине
        "bet": 1,                     // Ставка
        "denomination": 10           // Деноминация
    }

    //для Egames:
    {
        "game": "egame",
        "game_id": "turbokeno",      // Source игры
        "game_uuid": "AA-BB-CC",     // id ставки в системе**
        "bets": [                    // Ставки
            "[0]:1000",              // Ставка:Сумма
            ...
        ],
        "result": [1,2,3,4,5,6,7...] // Результат игры
    }

    //для Bets:
    {
        "game": "bet",
        "game_id": "2023",           // Источник игры на сервере, указан в конфигурационном файле как source
        "game_uuid": "AA-BB-CC",     // id ставки в системе
        "round": 10000,              // Раунд в игре
        "bets": [                    // Массив ставок
            "[0]:1000",              // Ставка:Сумма
            ...
        ],
        "result": [1,2,3,4,5,6,7...] // Результат розыгрыша
    }
Все поля запроса должны быть заполнены, исключение - запрос баланса, при котором параметр "game_id" в поле "tag" может быть пустым.

Сервис ожидает один из следующих ответов:

Если операция успешна:

{ "status":"OK", "balance":195650, "currency": "FUN" }

Если произошла ошибка:

{ "status":"not_enough_money", "balance":2, "currency": "FUN" } //при недостаточном балансе у игрока.;
{ "status":"session_not_found" } //не найдена сессия;
{ "status":"sign_not_found" } //при несовпадении поля sign между сервером приложений и биллингом клиента.
{ "status":"session_limit_exceeded", "limit":60 } //при блокировке сессии на установленный промежуток времени, в секундах. В течение заданного времени (limit) сессия будет заблокирована, и пользователь не сможет делать ставки во всех играх.

Это все возможные ответы и типы ошибок, других быть не может.

Игра вызывает данный метод после каждого события в ней, которое влияет на баланс игрока.

ВНИМАНИЕ: Если сервер не получил ответ, он совершит еще 10 попыток обращения. На стороне вашего биллинга необходимо контролировать, чтобы баланс не был списан или пополнен более чем один раз для запроса с одинаковым trx_id. В случае прихода двух запросов с одинаковым trx_id для второго запроса необходимо отдавать в ответ текущий баланс ничего не списывая. По умолчанию для защиты от непредвиденных технических проблем после 10 неудачных запросов подряд биллинг блокируется на 1 минуту. По вашему запросу это время может быть увеличено либо включена разблокировка Вами через api.

Реализуйте этот метод на сервере биллинга, и передайте ссылку на него менеджеру (отладку интеграции необходимо проводить на тестовых серверах).

Простейший пример реализации биллинга можно скачать здесь: для PHP, для Python.

После этого менеджер предоставит Вам ${billing_uuid} – уникальный идентификатор партнера.

Периодичность обмена данными между сервером и игрой:
При инициации запроса (init) и с некоторой ериодичностью игра опрашивает наш сервер на предмет изменения баланса и изменения сессии игрока. Это необходимо для предоставления клиенту актуального баланса и проверки наличия у него другой сессии (для предотвращения исполнения нежелательных операций с одним логином, но разными сессиями).

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

Информация по рассчитанным ставкам:
Сервер передает общую сумму по ставкам. При необходимости получения результата по каждой ставке - есть возможность предоставления алгоритма расчета (для этого используется поле $tag).

Типы запросов

NULL_REQUEST

Запрос отправляется при открытии игры с периодичностью раз в 30 секунд для получения актуального статуса и баланса сессии. Запрос имеет вид: game_uuid”:-1,“game_id”:“”,“game”:“none”.

Пример запроса:

request: {"trx_id":"trx2_41a_18786621", "tag":{"lines":0, "game_uuid":-1, "game_id":"", "game":"none", "denomination":1, "bet":0}, "sign":"a1a0656a4f012024875dd12a33b45944", "session":"3aa4e5b570ad412095d9205e8ee50dd3", "retry":0, "plus":0, "minus":0, "method":"do"}

BET

Запрос на совершение ставки. В этих запросах всегда “minus” > 0 и “plus” = 0.

Пример запроса в slot играх:

request: {"trx_id":"trx2_41a_19130677", "tag":{"lines":45, "game_uuid":"813760047", "game_id":"ab_al", "game":"slot", "denomination":10, "bet":5}, "sign":"bc43deffd2cb222ff59ebd5a77d4ace5", "session":"c9f13180688249efa8ba70499579a67e", "retry":0, "plus":0, "minus":4.5, "method":"do", "free":{}}

BET_WIN

Запрос на зачисление выигрыша по результату раунда/тиража. В этих запросах всегда “minus” = 0 и “plus” > 0.

Пример запроса в slot играх:

request: {"trx_id":"trx2_41a_19130716", "tag":{"lines":9, "game_uuid":"813760047", "game_id":"ab_al", "game":"slot", "denomination":10, "bet":5}, "sign":"52a059466043a470b4e3132b99b8cb9a", "session":"c9f13180688249efa8ba70499579a67e", "retry":0, "plus":5.0, "minus":0, "method":"do"}

BET_LOOSE

Запрос с результатом раунда, где ставка проиграла. В этих запросах всегда “plus” и “minus” = 0. В slot играх данная опция включается по customer_id при обращении в техническую поддержку.

Примечание:

Турниры/Джекпоты

Список игр, которые поддерживают турниры и джекпоты площадки

Стилизованные джекпоты

Работа турнира не может быть одновременно с работой стилизованных джекпотов, в таком случае используйте джекпоты площадки

Список игр, которые поддерживают стилизованные джекпоты

Пакеты фриспинов

Инструкция