Product API Единый кошелёк или трансферный кошелёк
Единый кошелёк или трансферный кошелёк
Техническое сравнение двух моделей кошелька, связывающих баланс игрока у оператора с API казино-игр: кто хранит деньги, какие обращения идут по сети во время ставки, как восстанавливаются сбои и что нужно построить на вашей стороне.
Коротко
| Аспект | Единый кошелёк | Трансферный кошелёк |
|---|---|---|
| Хранение баланса | Единственный баланс хранится в вашей базе данных. Провайдер никогда не держит средства игроков. | Провайдер хранит отдельный игровой баланс. Средства переводятся туда и обратно обращениями перевода. |
| Обращения во время ставки | Каждая ставка и выигрыш вызывают серверный callback к вам (balance, debit, credit, rollback). | Нет. Игра работает с балансом на стороне провайдера. Обращения происходят только при переводе туда и обратно. |
| Требуемая доступность | Ваши эндпоинты кошелька должны отвечать на каждый callback, обычно за несколько сотен миллисекунд. Если они недоступны, игра останавливается. | Нужна только для переводов. Раунды продолжаются, даже если ваша система ненадолго офлайн. |
| Модель согласованности | Ваш реестр — источник истины в реальном времени. Сверять нужно только игровые раунды, а не балансы. | Два реестра, совпадающие только на границах переводов. Нужна сверка на уровне переводов. |
| Восстановление после сбоев | Таймауты разрешаются идемпотентными повторами и обращениями rollback по ID транзакции. | Переводы двухфазные: pending, затем success или failed. Неизвестный результат выясняется запросом статуса. |
| Трудоёмкость интеграции | Выше. Вы строите и поддерживаете callback-сервис с низкой задержкой, идемпотентностью и реестром. | Ниже. Вы вызываете три-четыре REST-эндпоинта, без входящего трафика, который нужно защищать и масштабировать. |
| Опыт игрока | Один баланс, без шага перевода. Подходит для бонусов, игры в разных продуктах и показа баланса в реальном времени. | Средства переводятся перед игрой и выводятся после. Добавляет небольшую задержку и риск зависшего баланса, если игрок уходит посреди сессии. |
| Кому подходит | Операторам со своим кошельком или платформой и строгим контролем средств и промоакций. | Операторам, которым нужен быстрый запуск или у которых нет кошелька реального времени. |
Единый кошелёк (seamless)
В модели единого кошелька (seamless) кошельком является ваша система. Когда игрок делает ставку, SSG API вызывает ваш callback-эндпоинт, вы меняете баланс в своём реестре и отвечаете новым балансом. Средства никогда не покидают вашу базу данных.
Последовательность обращений
- Запуск: ваш бэкенд запрашивает у SSG URL игры с ID игрока и токеном сессии.
- Ставка: для каждого раунда SSG вызывает debit с уникальным txId. Вы проверяете средства, пишете строку реестра и возвращаете новый баланс.
- Выигрыш: SSG вызывает credit с выплатой (она может быть нулевой) для того же раунда.
- Сбой: если обращение превышает таймаут, 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-вызовы.
Последовательность обращений
- Перевод внутрь: ваш бэкенд вызывает transferIn с уникальным txId и суммой. Результат — PENDING или SUCCESS.
- Игра: запустите игру. Все ставки и выигрыши меняют баланс на стороне провайдера без обращений к вам.
- Перевод наружу: когда игрок уходит, вызовите transferOut на весь баланс и при SUCCESS зачислите его обратно в свой реестр.
- Неизвестный результат: если вызов перевода превысил таймаут, прежде всего запросите 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