Схема взаимодействия пользователя с игрой.
Для корректной работы приложения необходимо проксировать:
Пример конфигурации для 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" может быть пустым.
$str = "do::".$json['session']."::".$json['trx_id']."::".$salt;
for($i=1; $i<=45; $i++) {$str = md5($str);}
Если пришедшая от сервера приложений подпись sign не совпадает с
рассчитанной строкой $str, то биллинг должен
возвращать ответ: {”status”: "sign_not_found"}
Сервис ожидает один из следующих ответов:
Если операция успешна:
{ "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 при обращении в техническую поддержку.
Примечание:
game_uuid в запросах BET_WIN, BET_LOOSE всегда
соответствует значению в запросе BET.
“game_uuid”:-1.Список игр, которые поддерживают турниры и джекпоты площадки
Работа турнира не может быть одновременно с работой стилизованных джекпотов, в таком случае используйте джекпоты площадки
Список игр, которые поддерживают стилизованные джекпоты