credit — 입금
라운드 정산 · 이석 때 플레이어 잔액에 금액을 더합니다. 플랫폼은 credit 을 OK 를 받을 때까지 재시도하므로, 오퍼레이터는 같은 tx_id 를 한 번만 반영하고 어떤 경우에도 OK 로 끝내야 합니다.
POST {wallet_base_url}/credit언제 호출되나
reason | 언제 | round_id | amount |
|---|---|---|---|
settle | 베팅형 게임(바카라 · 블랙잭 · 스피드 홀덤)의 라운드 정산 | rnd_… | 돌려받는 원금을 포함한 총 지급액. 지면 0 |
cash_out | 바이인형 게임에서 자리를 떠날 때(이석 · 접속 끊김 정리 · 테이블 종료 · 강제 로그아웃), 그리고 아래 환불 | tss_… | 남은 칩 전부. 다 잃었으면 0 일 수 있음 |
settle은 그 라운드에 확정된 베팅이 있는 플레이어마다 정확히 한 번 옵니다. 당첨이 없어도amount: 0으로 보내므로, 이 credit 으로 플레이어의 라운드가 끝났음을 알 수 있습니다. 베팅을 모두 취소한 플레이어에게는 오지 않습니다. 라운드가 무효가 되면 credit 대신 rollback(round_void)이 옵니다.cash_out은 보통 테이블 세션(tss_…) 하나에 한 번이지만, 다음 경우에는 같은 테이블 세션에 다른tx_id의cash_out이 더 올 수 있습니다.- 바이인 · 칩 추가 debit 이 성공했는데 그 결과가 오기 전에 플레이어가 자리를 떠난 경우 — 그 금액을 돌려줌
- 라이브 홀덤 핸드가 무효가 됐는데 플레이어 좌석이 이미 정리된 경우 — 그 핸드에 낸 칩을 돌려줌
테이블 세션당 credit 이 한 번이라고 가정하지 말고
tx_id로만 중복을 판단하세요.레이크(수수료)는 credit 에서 이미 빠진 금액입니다. 따로 지갑 거래가 생기지 않습니다.
새로운
reason값이 추가될 수 있습니다. 모르는 값이 와도 입금으로 처리하세요.
요청
헤더는 공통 헤더와 같습니다.
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
tx_id | string | ● | 플랫폼 거래 ID. 멱등 키 |
external_id | string | ● | 오퍼레이터 쪽 플레이어 ID |
player_id | string | ● | 플랫폼 플레이어 ID(pl_…), 참고용 |
currency | string | ● | 통화 코드 |
amount | integer | ● | 지급액, 최소 단위 정수, 0 이상 |
reason | string | ● | settle 또는 cash_out |
game_code | string | ● | 게임 코드 |
table_id | string | ● | 테이블 ID (tbl_…) |
round_id | string | ● | 라운드 ID(rnd_…) 또는 테이블 세션 ID(tss_…) |
round_closed | boolean | ● | 이 credit 으로 플레이어의 라운드(테이블 세션)가 끝났는지. 현재는 모든 credit 이 true 입니다 |
operator_session_id | string | null | ● | 게임 실행 때 보낸 값. 없었거나 플랫폼 복구 경로면 null |
created_at | string | ● | 플랫폼이 거래를 만든 시각 (UTC, 밀리초). 재시도해도 바뀌지 않음 |
{
"amount": 30000,
"created_at": "2026-10-19T02:10:41.004Z",
"currency": "PHP",
"external_id": "u-102938",
"game_code": "live_baccarat",
"operator_session_id": "s-88af21",
"player_id": "pl_0199e8b4f2a37c1d8e5b6a4f3c2d1e0b",
"reason": "settle",
"round_closed": true,
"round_id": "rnd_0199f2a0b1c27d3e8f4a5b6c7d8e9f01",
"table_id": "tbl_0199a1b2c3d47e5f8a9b0c1d2e3f4a5b",
"tx_id": "tx_8e2b4d6f1a3c5e7b9d0f2a4c6e8b1d3f"
}{
"amount": 182000,
"created_at": "2026-10-19T03:05:17.880Z",
"currency": "PHP",
"external_id": "u-102938",
"game_code": "holdem_nlh",
"operator_session_id": "s-88af21",
"player_id": "pl_0199e8b4f2a37c1d8e5b6a4f3c2d1e0b",
"reason": "cash_out",
"round_closed": true,
"round_id": "tss_0199f29e7c6b4a5d8e3f2a1b0c9d8e7f",
"table_id": "tbl_0199a1b5d0e47f2a9b8c7d6e5f4a3b2c",
"tx_id": "tx_c4e6a8b0d2f41a3c5e7b9d1f3a5c7e9b"
}{
"amount": 0,
"created_at": "2026-10-19T02:11:39.412Z",
"currency": "PHP",
"external_id": "u-102938",
"game_code": "live_baccarat",
"operator_session_id": "s-88af21",
"player_id": "pl_0199e8b4f2a37c1d8e5b6a4f3c2d1e0b",
"reason": "settle",
"round_closed": true,
"round_id": "rnd_0199f2a3e5c17a9b8d6f4e2c0a1b3d5f",
"table_id": "tbl_0199a1b2c3d47e5f8a9b0c1d2e3f4a5b",
"tx_id": "tx_1f3d5b7a9c0e2f4a6b8d0c2e4f6a8b0d"
}응답
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
status | string | ● | OK 여야 끝납니다 |
balance | integer | ● | 입금 후 잔액. amount: 0 이면 현재 잔액 |
operator_tx_id | string | 오퍼레이터 쪽 거래 ID |
{ "status": "OK", "balance": 1275000, "operator_tx_id": "w-99813" }플랫폼 동작
| 결과 | 플랫폼 처리 |
|---|---|
OK | 확정. 응답 balance 를 플레이어 화면에 반영 |
OK 가 아닌 모든 status (PLAYER_NOT_FOUND · PLAYER_BLOCKED · INVALID_REQUEST · INVALID_SIGNATURE 포함) | 재시도 |
| 5초 타임아웃 · HTTP 200 아님 · 연결 실패 · 잘못된 JSON | 재시도 |
재시도 간격은 1초 → 2초 → 5초 → 15초 → 1분 → 5분이고, 그 뒤로는 5분마다 기한 없이 보냅니다. 재시도 본문은 처음과 바이트 단위로 같습니다(created_at 포함). 서명 헤더만 새로 만듭니다.
credit 은 거절할 수 없습니다
credit 에 OK 가 아닌 응답을 주면 그 거래는 끝나지 않고 계속 재시도됩니다. 다음 경우에도 반영하고 OK 를 돌려주세요.
- 플레이어가 차단 · 자기 배제 중이거나 로그아웃 · 세션 만료된 경우 — 돈을 돌려주는 거래입니다.
operator_session_id가null이거나 이미 끝난 세션인 경우 — 세션 값으로 검사하지 마세요.amount가0인 경우 — 잔액을 바꾸지 말고 현재 잔액으로OK.- 같은
tx_id가 다시 온 경우 — 다시 더하지 말고 처음 응답 그대로OK.
처리 순서
- 서명 검증 → 실패면
INVALID_SIGNATURE(재시도되므로 원인을 바로 고쳐야 합니다) - 필드 검증(
tx_id·external_id존재,amount가 0 이상의 정수) → 실패면INVALID_REQUEST - 같은
tx_id기록이 있으면 → 저장된 응답을 그대로 반환 - 플레이어 행 잠금
amount만큼 더하고(0 이면 그대로)OK+ 입금 후balance+operator_tx_id- 응답과 함께
tx_id기록
credit 은 취소(rollback) 대상이 아닙니다. 잘못된 지급이 의심되면 플랫폼과 운영 절차로 협의합니다.
주의
- 순서: 재시도 중인 credit 은 그 뒤에 생긴 같은 플레이어의 debit 보다 늦게 도착할 수 있습니다. 도착 순서에 의존하지 마세요.
- 플레이어를 지우지 마세요: 오퍼레이터가 플레이어 계정을 삭제해
PLAYER_NOT_FOUND가 나면 그 플레이어의 미처리 credit 이 끝나지 않습니다. 탈퇴 처리 뒤에도 지갑 콜백을 받을 수 있게 계정 기록을 남겨 두세요. - 대사: 플랫폼 쪽 거래 상태는
GET /transactions로 볼 수 있습니다. 재시도 중인 credit 은status: "uncertain"(또는pending)으로 보입니다.