Сайт (api.liverp.ru) хранит платежи и чеки. Игровой сервер (:63222) проверяет аккаунт и начисляет валюту.
Общий секрет: GAME_SERVER_API_KEY (Bearer). На сайте дополнительно GAME_SERVER_API_URL (например http://144.31.107.67:63222).
---
POST {BACKEND_PUBLIC_URL}/api/v1/payments/check-player — публичный, без Bearer. Backend проксирует на игровой …/users/server/check.
{ "gameId": "12345" }
Ответ: { "data": { "exists": true, "gameId": "12345", "nickname": "Имя Фамилия" } }.
---
POST {GAME_SERVER_API_URL}/api/v1/users/server/check
{ "gameId": "12345" }
| Ответ | Значение |
|---|---|
exists: true | игрок есть, в ответе nickname |
exists: false | сайт вернёт 404 «Игрок с таким ID не найден» |
POST {GAME_SERVER_API_URL}/api/v1/payments/server/approve
{
"gameId": "12345",
"amount": 500,
"invId": 42
}
| Поле | Обязательное | Назначение |
|---|---|---|
gameId | да | ID персонажа — по нему зачисляется баланс |
amount | да | сумма в ₽ |
invId | нет | для логов / сверки |
Игра зачисляет донат сразу на аккаунт (без локальной таблицы платежей). Идемпотентность — на сайте: Payment.creditStatus (pending → crediting → credited / failed). Повторный ResultURL при credited не вызывает approve. Каждую минуту backend ретраит SUCCESS с pending/failed (и зависший crediting старше 2 мин) через services/paymentCredit.ts, пока не станет credited.
Ответ: { "data": { "success": true, "gameId", "amount", "creditedAmount", "balance", "invId", "status": "credited" } }.
На сайте: pending → credited / failed (+ авто-retry).
---
POST {BACKEND_PUBLIC_URL}/api/v1/payments/server/create
Authorization: Bearer <GAME_SERVER_API_KEY>
Content-Type: application/json
| Поле | Тип | Обязательное | Ограничения |
|---|---|---|---|
amount | number | да | 49 – 1 000 000 (₽) |
gameId | string | да | только цифры, 1–6 символов (ID персонажа) |
email | string | нет | для фискального чека |
{
"amount": 500,
"gameId": "12345",
"email": "player@example.com"
}
Ответ 200:
{
"data": {
"paymentUrl": "https://auth.robokassa.ru/Merchant/Index.aspx?...",
"invId": 42,
"nickname": "Имя Фамилия"
}
}
Перед созданием сайт вызывает check на игровом сервере.
| Код | Причина |
|---|---|
| 400 | валидация тела |
| 401 | неверный Bearer |
| 404 | игрок не найден |
| 500 / 502 | ошибка backend / игрового API |
---
Деньги — в кабинете Robokassa. Затем:
POST {BACKEND_PUBLIC_URL}/api/v1/payments/{invId}/refund
Authorization: Bearer <GAME_SERVER_API_KEY>
Content-Type: application/json
Тело опционально: { "amount": 500 } (по умолчанию полная сумма).
Ответ: ok, invId, refundAmount, receiptId, receiptStatus. Статус платежа → REFUNDED + чек CloudKassir IncomeReturn.
| Код | Причина |
|---|---|
| 400 | неверная сумма |
| 401 | нет Bearer |
| 404 | платёж не найден |
| 409 | уже REFUNDED или не SUCCESS |
---
63222 должен быть доступен с VDS сайта (firewall/NAT).