SSG Gaming

Product API Единый кошелёк или трансферный кошелёк

Единый кошелёк или трансферный кошелёк

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

Коротко

АспектЕдиный кошелёкТрансферный кошелёк
Хранение балансаЕдинственный баланс хранится в вашей базе данных. Провайдер никогда не держит средства игроков.Провайдер хранит отдельный игровой баланс. Средства переводятся туда и обратно обращениями перевода.
Обращения во время ставкиКаждая ставка и выигрыш вызывают серверный callback к вам (balance, debit, credit, rollback).Нет. Игра работает с балансом на стороне провайдера. Обращения происходят только при переводе туда и обратно.
Требуемая доступностьВаши эндпоинты кошелька должны отвечать на каждый callback, обычно за несколько сотен миллисекунд. Если они недоступны, игра останавливается.Нужна только для переводов. Раунды продолжаются, даже если ваша система ненадолго офлайн.
Модель согласованностиВаш реестр — источник истины в реальном времени. Сверять нужно только игровые раунды, а не балансы.Два реестра, совпадающие только на границах переводов. Нужна сверка на уровне переводов.
Восстановление после сбоевТаймауты разрешаются идемпотентными повторами и обращениями rollback по ID транзакции.Переводы двухфазные: pending, затем success или failed. Неизвестный результат выясняется запросом статуса.
Трудоёмкость интеграцииВыше. Вы строите и поддерживаете callback-сервис с низкой задержкой, идемпотентностью и реестром.Ниже. Вы вызываете три-четыре REST-эндпоинта, без входящего трафика, который нужно защищать и масштабировать.
Опыт игрокаОдин баланс, без шага перевода. Подходит для бонусов, игры в разных продуктах и показа баланса в реальном времени.Средства переводятся перед игрой и выводятся после. Добавляет небольшую задержку и риск зависшего баланса, если игрок уходит посреди сессии.
Кому подходитОператорам со своим кошельком или платформой и строгим контролем средств и промоакций.Операторам, которым нужен быстрый запуск или у которых нет кошелька реального времени.

Единый кошелёк (seamless)

В модели единого кошелька (seamless) кошельком является ваша система. Когда игрок делает ставку, SSG API вызывает ваш callback-эндпоинт, вы меняете баланс в своём реестре и отвечаете новым балансом. Средства никогда не покидают вашу базу данных.

Последовательность обращений

PlayerOperatorSSG APIloop1. open game2. launch(playerId, token)3. launchUrl4. spin5. debit(txId, roundId, amount)6. OK, balance7. credit(txId, roundId, win)8. OK, balance9. rollback(txId) [on timeout]
  1. Запуск: ваш бэкенд запрашивает у SSG URL игры с ID игрока и токеном сессии.
  2. Ставка: для каждого раунда SSG вызывает debit с уникальным txId. Вы проверяете средства, пишете строку реестра и возвращаете новый баланс.
  3. Выигрыш: SSG вызывает credit с выплатой (она может быть нулевой) для того же раунда.
  4. Сбой: если обращение превышает таймаут, SSG повторяет его с тем же txId, а после лимита повторов отправляет rollback.

Методы callback (иллюстрация)

МетодНазначениеКлючевые поляИдемпотентность
balanceВернуть текущий баланс игрока.playerId, currencyДа (только чтение)
debitПринять ставку: списать сумму.playerId, txId, roundId, gameId, amount, currencyПо txId
creditРассчитать выигрыш: начислить сумму.playerId, txId, roundId, amount, currencyПо txId
rollbackОтменить ранее выполненный debit или credit после ошибки.txId, refTxIdПо txId

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

{
  "method": "debit",
  "playerId": "p_839201",
  "txId": "tx_20261007_000184",
  "roundId": "r_77f3a1",
  "gameId": "slots_fruit_01",
  "currency": "MYR",
  "amount": "2.50",
  "ts": 1791338577,
  "sign": "hex(HMAC-SHA256(secret, canonical))"
}

Пример ответа

{
  "status": "OK",
  "txId": "tx_20261007_000184",
  "balance": "97.50",
  "currency": "MYR"
}
// errors: INSUFFICIENT_FUNDS, PLAYER_NOT_FOUND,
//         DUPLICATE_TX (return original result), INTERNAL_ERROR

Правила, которым должен следовать ваш сервис кошелька

Идемпотентность
Повторный debit или credit с тем же txId должен вернуть исходный результат и не двигать деньги снова. Обеспечьте это уникальным индексом по txId.
Атомарная запись в реестр
Проверка баланса, вставка строки реестра и обновление баланса — в одной транзакции базы данных, чтобы две одновременные ставки не могли увести баланс в минус.
Rollback раньше debit
Rollback может прийти для txId, которого вы не видели, потому что исходный debit превысил таймаут. Сохраните метку-«надгробие», чтобы поздний debit с этим txId был отклонён.
Бюджет задержки
Цель — p99 ниже 500 мс с учётом сети. Ограничьте путь callback одним индексированным чтением и одной записью и не нагружайте его отчётными запросами.
Формат денег
Храните суммы как десятичные строки или целые минимальные единицы. Никогда не используйте числа с плавающей точкой и проверяйте валюту по аккаунту игрока.
Бонусы и фриспины
Фриспин — это debit на 0, за которым следует credit выигрыша. Держите промо-балансы отдельно от денежного баланса в реестре.
Безопасность
Проверяйте подпись HMAC-SHA256 канонического запроса, отклоняйте устаревшие метки времени, разрешайте только IP-адреса SSG и требуйте TLS 1.2 или выше.
Сверка
Сравнивайте ежедневные отчёты SSG по раундам со своим реестром по roundId. Расхождения указывают на пропущенные callback или rollback.

Трансферный кошелёк

В модели трансферного кошелька провайдер хранит игровой баланс для каждого игрока. Ваш бэкенд переводит средства туда перед игрой и обратно после. Во время игры к вашей системе нет обращений callback, поэтому нужны только исходящие REST-вызовы.

Последовательность обращений

PlayerOperatorSSG APIplay1. transferIn(txId, amount)2. PENDING or SUCCESS3. launch(playerId)4. launchUrl5. spin (no callbacks to Operator)6. getBalance(playerId)7. balance8. transferOut(txId, all)9. SUCCESS, amount
  1. Перевод внутрь: ваш бэкенд вызывает transferIn с уникальным txId и суммой. Результат — PENDING или SUCCESS.
  2. Игра: запустите игру. Все ставки и выигрыши меняют баланс на стороне провайдера без обращений к вам.
  3. Перевод наружу: когда игрок уходит, вызовите transferOut на весь баланс и при SUCCESS зачислите его обратно в свой реестр.
  4. Неизвестный результат: если вызов перевода превысил таймаут, прежде всего запросите getTransferStatus с тем же txId.

Методы API (иллюстрация)

МетодНазначениеКлючевые поляИдемпотентность
transferInПеревести средства из вашего кошелька на игровой баланс игрока.playerId, txId, amount, currencyПо txId
transferOutПеревести средства с игрового баланса обратно в ваш кошелёк.playerId, txId, amount | allПо txId
getBalanceПрочитать игровой баланс игрока.playerIdДа (только чтение)
getTransferStatusВернуть PENDING, SUCCESS или FAILED для txId.txIdДа (только чтение)

Правила, которым должен следовать ваш бэкенд

Один txId на одно намерение
Создавайте txId до первого вызова и используйте его при каждом повторе. Не создавайте новый txId, пока не известен статус предыдущего.
Сначала списание в вашем реестре
При переводе внутрь зарезервируйте сумму в реестре до вызова SSG, затем подтвердите или освободите её, когда статус станет окончательным.
Собирайте зависшие балансы
Запускайте задачу, которая находит игроков с игровым балансом без активной сессии и переводит его обратно. Это покрывает игроков, закрывших браузер посреди сессии.
Отыгрыш и отчёты
Поскольку вы не видите ставки в реальном времени, считайте оборот, отыгрыш бонусов и лимиты риска по отчётам о раундах из SSG, а не по callback.
Сверка
Сопоставляйте каждый перевод внутрь и наружу с записями SSG по txId и поднимайте тревогу при любом PENDING старше вашего таймаута.
Безопасность
Подписывайте запросы HMAC-SHA256, обращайтесь только по TLS 1.2 или выше, храните API-ключи в хранилище секретов и ограничьте, какие ваши серверы могут обращаться к SSG.

Сценарии сбоев

СценарийЕдиный кошелёкТрансферный кошелёк
Сетевой таймаутВо время ставки SSG повторяет тот же txId, а после лимита повторов отправляет rollback. Вы обязаны быть идемпотентными.Затрагиваются только переводы. Запросите getTransferStatus с тем же txId, затем действуйте.
Ваша система недоступнаИгроки не могут начать или продолжить раунды. Открытые раунды откатываются.Игроки продолжают играть на текущем игровом балансе. Новые переводы заблокированы.
Повторный запросВерните сохранённый ответ для этого txId и ничего не меняйте.Верните сохранённый результат для этого txId и ничего не меняйте.
Игрок отключился посреди раундаРаунд завершается у провайдера, и credit отправляется как обычно.Раунд завершается, а средства остаются на игровом балансе до перевода наружу или задачи сбора.
Расхождение балансаОбычно пропущенный callback или rollback. Выявляется сравнением отчётов о раундах по roundId.Обычно зависший или незавершённый перевод. Выявляется сравнением переводов по txId.

Что выбрать

Выбирайте единый кошелёк, если

  • У вас уже есть сервис кошелька или реестра реального времени.
  • Нужен один баланс для ставок на спорт, казино и промоакций.
  • Нужны данные о ставках в реальном времени для рисков, отыгрыша бонусов или лимитов ответственной игры.
  • Ваша команда может поддерживать сервис с низкой задержкой и высокой доступностью.

Выбирайте трансферный кошелёк, если

  • Вы хотите запуститься быстро с минимумом разработки.
  • У вас пока нет сервиса кошелька реального времени.
  • Вы предпочитаете только исходящие вызовы, без публичного callback, который нужно защищать.
  • Короткие окна зависших балансов допустимы, и вы можете запустить задачу сбора.

Многие операторы запускаются на трансферном кошельке, а затем переходят на единый, когда их собственный сервис кошелька готов. Спросите нас, как организуется переход.

Чек-лист интеграции

  • Уникальный индекс по txId и идемпотентные обработчики для каждого обращения, двигающего деньги
  • Проверка подписи HMAC, допуск по метке времени и список разрешённых IP
  • Безопасные десятичные суммы и проверка валюты
  • Тесты таймаутов, повторов и rollback в песочнице, включая поздний повтор
  • Ежедневная задача сверки по roundId (единый) или txId (трансферный)
  • Мониторинг и оповещения: задержка callback, доля ошибок, незавершённые переводы, зависшие балансы

Поговорить с инженером по интеграции

Мы проведём ваших инженеров по песочнице и поможем выбрать модель, подходящую вашей платформе. Интеграция гарантированно менее чем за семь дней.

Написать в отдел продаж Написать в Telegram Назад к Product API

sales@ssggaming.com