Partner API
Tài liệu tổng hợp các API mà đối tác / aggregator có thể sử dụng trên gameserver, bao gồm API HMAC partner-facing, route public đổi token, và các API player-facing dùng JWT. Phục vụ tích hợp 5 game của hệ thống A3 Gaming.
Luồng tích hợp
Đối tác / aggregator tích hợp với gameserver theo 5 bước chuẩn dưới đây. Ba bước đầu dùng API HMAC-signed, hai bước cuối là gameplay sau khi client đã vào game service.
gameserver trả về token đăng nhập tạm thời.POST /api/user/token để đổi sang sessionToken.sessionToken để kết nối WebSocket vào game service tương ứng.spin, getLogs, getLogDetail...) chạy theo luồng game/player.Base URL
HTTP Base URL
WebSocket Game Services
Mỗi game có một WebSocket service riêng. Sau khi đổi sessionToken, client kết nối trực tiếp tới service tương ứng theo gameId:
Xác thực HMAC
Các API partner-facing dưới /api/partner/*, /api/user/login, và /api/user/register đều đi qua HMAC-SHA256. Mọi request phải kèm 4 header dưới đây:
x-api-key: <partner_api_key> x-timestamp: <unix_time_ms> x-signature: <hmac_sha256_hex> Content-Type: application/json
3.1 Công thức ký
Payload ký được ghép theo thứ tự cố định, ngăn cách bằng ký tự |:
METHOD|PATH|TIMESTAMP|RAW_JSON_BODY
Ví dụ thực tế cho request đăng nhập:
POST|/api/user/login|1714546800000|{"username":"testuser1","password":"123456"}
3.2 Quy tắc verify thực tế
METHODdùng HTTP method chuẩn, thực tế là chữ in hoa nhưGET,POST.PATHchỉ lấy phần path, không bao gồm query string.- Nếu request không có body thì body được xử lý thành
{}. x-signaturelà HMAC SHA256 dạng hex chữ thường.x-timestampdùng Unix time milliseconds.- Request hết hạn nếu lệch quá 5 phút so với server.
secret_key là tài sản nhạy cảm. Không commit vào source code, không gửi qua email/chat công khai. Mọi nghi ngờ rò rỉ phải báo ngay để được rotate key.
API đối tác qua HMAC
Bộ 8 endpoints partner-facing. Tất cả đều yêu cầu HMAC. Bảng tổng hợp:
| Method | Endpoint | Mục đích |
|---|---|---|
| GET | /api/partner/games | Danh sách game khả dụng |
| GET | /api/partner/balance | Số dư partner |
| GET | /api/partner/player/:playerId/balance | Số dư của 1 player |
| POST | /api/partner/player/deposit | Cộng tiền cho player |
| POST | /api/partner/player/withdraw | Trừ tiền player |
| POST | /api/partner/player/wallet | Tạo ví game cho player |
| POST | /api/user/register | Đăng ký player |
| POST | /api/user/login | Đăng nhập player |
4.1 · Lấy danh sách game
HMAC
Lấy danh sách game đang available cho partner.
Response — field chính
| Field | Kiểu | Mô tả |
|---|---|---|
| gameId | number | ID game (1001..1005) |
| gameName | string | Tên hiển thị của game |
| gameType | string | Loại game (slot, table, ...) |
| active | boolean | Game hiện đang bật cho partner hay không |
4.2 · Lấy số dư partner
HMAC
Kiểm tra số dư hiện tại của partner trên hệ thống A3.
Response — field chính
| Field | Kiểu | Mô tả |
|---|---|---|
| partnerId | number | ID partner |
| partnerName | string | Tên partner |
| balance | number | Số dư hiện tại |
4.3 · Lấy số dư player
HMAC
Kiểm tra số dư của player thuộc partner.
Path params
| Field | Kiểu | Mô tả |
|---|---|---|
| playerId | number | ID người chơi |
Response — field chính
- Thông tin player (id, username, ...)
- Tổng
balance locked balance(đang trong round chưa settle)- Danh sách ví theo từng
gameId
4.4 · Cộng tiền cho player
HMAC
Cộng tiền vào tài khoản player.
Request body
{
"playerId": 123,
"amount": 1000,
"description": "manual deposit"
}
Field
| Field | Kiểu | Mô tả |
|---|---|---|
| playerIdRequired | number | ID người chơi |
| amountRequired | number | Số tiền cộng vào ví |
| descriptionOptional | string | Ghi chú giao dịch |
4.5 · Trừ tiền của player
HMAC
Trừ tiền khỏi tài khoản player.
Request body
{
"playerId": 123,
"amount": 1000,
"description": "manual withdraw"
}
Field
| Field | Kiểu | Mô tả |
|---|---|---|
| playerIdRequired | number | ID người chơi |
| amountRequired | number | Số tiền trừ khỏi ví |
| descriptionOptional | string | Ghi chú giao dịch |
4.6 · Tạo ví game cho player
HMAC
Tạo ví game cho player theo từng gameId. Mỗi ví là độc lập per-game.
Request body
{
"playerId": 123,
"gameId": 1003,
"currency": "VND"
}
Field
| Field | Kiểu | Mô tả |
|---|---|---|
| playerIdRequired | number | ID người chơi |
| gameIdRequired | number | ID game (1001..1005) |
| currencyOptional | string | Mã tiền tệ (VND, USD...) |
4.7 · Đăng ký player
HMAC
Tạo người chơi mới. Có thể khởi tạo ví game đầu tiên ngay tại bước này.
Request body
{
"username": "player123",
"password": "password123",
"initGameId": 1003,
"gameUsername": "player123"
}
Field
| Field | Kiểu | Mô tả |
|---|---|---|
| usernameRequired | string | Tên đăng nhập trên A3 |
| passwordRequired | string | Mật khẩu player |
| initGameIdRequired | number | Game tạo ví đầu tiên |
| gameUsernameRequired | string | Username hiển thị trong game |
4.8 · Đăng nhập player
HMAC
Đăng nhập người chơi và nhận token tạm thời để đổi sang sessionToken ở bước kế tiếp.
Request body
{
"username": "testuser1",
"password": "123456"
}
Response — field chính
| Field | Kiểu | Mô tả |
|---|---|---|
| token | string | Login token tạm, đổi tiếp sang sessionToken |
| user.userId | number | ID người chơi nội bộ A3 |
| user.username | string | Username người chơi |
API đổi token game session
5.1 · Đổi token sang sessionToken
Public · No HMAC
Đổi token đăng nhập sang sessionToken dùng cho game. Đây là route public, không yêu cầu HMAC — thay vào đó nó verify trực tiếp token đã được cấp ở bước trước.
Request body
{
"token": "<login_token>"
}
Response — field chính
| Field | Kiểu | Mô tả |
|---|---|---|
| sessionToken | string | Token dùng để kết nối WebSocket game |
API sau khi player đăng nhập
Các API dưới đây không phải partner HMAC API trực tiếp. Chúng dùng Authorization: Bearer <token> của player session — phục vụ luồng player-facing trong app/web client của A3.
6.1 · Lấy profile người chơi
JWT Bearer
Lấy thông tin profile và số dư của player hiện tại (theo JWT đính kèm).
6.2 · Cập nhật balance từ phía player
JWT Bearer
Tăng hoặc giảm balance theo luồng player.
Request body
{
"amount": 1000,
"type": "increase",
"reason": "manual adjustment"
}
6.3 · Lấy danh sách log chơi game
JWT Bearer
Lấy danh sách log của player.
Query params hỗ trợ
| Field | Kiểu | Mô tả |
|---|---|---|
| limit | number | Số bản ghi tối đa |
| skip | number | Phân trang (offset) |
| gameId | number | Lọc theo game |
| sort | string | Trường & chiều sort (vd t.desc) |
| dateFrom | ISO date | Từ thời điểm |
| dateTo | ISO date | Đến thời điểm |
| datePreset | string | today | week |
6.4 · Lấy chi tiết log
JWT Bearer
Lấy chi tiết một bản ghi log theo ID.
Nhóm API thường được đối tác quan tâm
Map nhanh từ use case → endpoint:
| Use case | Method | Endpoint |
|---|---|---|
| Lấy danh sách game | GET | /api/partner/games |
| Đăng ký user | POST | /api/user/register |
| Đăng nhập user | POST | /api/user/login |
| Đổi session token | POST | /api/user/token |
| Tạo ví game | POST | /api/partner/player/wallet |
| Lấy số dư partner | GET | /api/partner/balance |
| Lấy số dư player | GET | /api/partner/player/:playerId/balance |
| Cộng tiền | POST | /api/partner/player/deposit |
| Trừ tiền | POST | /api/partner/player/withdraw |
| Lấy danh sách log | GET | /api/player/logs |
| Lấy chi tiết log | GET | /api/player/logs/:id |
Điểm quan trọng cần nhớ
- Các API dưới
/api/partner/*là API partner-facing rõ ràng, đều yêu cầu HMAC. POST /api/user/registervàPOST /api/user/logincũng đi qua HMAC và phục vụ tích hợp partner.POST /api/user/tokenlà route public, không verify HMAC. Đổi từ login token sang sessionToken.GET /api/player/logsvàGET /api/player/logs/:idhiện là API player-facing dùng Bearer JWT, không phải route/api/partner/*.- Thao tác
spinkhông phải HTTP API public riêng cho partner —spindiễn ra trong luồng gameplay sau khi client đã vào game service WebSocket tương ứng.
/api/user/token. JWT Bearer dành cho client-side player UI — không phải kênh dành cho partner.