Transaction.PurchaseApprovalResult
구매 승인 요청이 해결될 때 발생합니다. 부모가 승인했거나, 부모가 거부했거나, 답변 없이 만료된 경우입니다. 이것은 /transaction/request-purchase 호출에 대한 답변이며 제품이 결과를 알 수 있는 유일한 방법입니다.
k-ID는 Transaction.PurchaseApprovalResult를 구독한 엔드포인트에만 전달하고, 나머지에는 전달 시도나 오류 없이 버립니다. 제품의 Developer Settings 페이지에서 엔드포인트에 대해 선택하세요. 시작하기 전에를 참조하세요.
하나의 요청에 대해 Transaction.PurchaseApprovalResult는 정확히 한 번 발생합니다. /transaction/request-purchase에 제품이 보낸 id와 같은 값인 data.id로 요청과 연결하세요.
필드
| 필드 | 유형 | 필수 | 설명 |
|---|---|---|---|
eventType | string | 예 | 항상 "Transaction.PurchaseApprovalResult" |
data | object | 예 | 구매 승인 결과 데이터 |
data.id | string (UUID) | 예 | 승인 요청 ID로, 제품이 /transaction/request-purchase에 보낸 id와 일치합니다 |
data.sessionId | string (UUID) | 예 | 구매가 요청된 세션 ID |
data.productId | number | 예 | 제품 ID |
data.status | string | 예 | approved, denied 또는 expired |
data.resolvedAt | string (date-time) | 예 | 요청이 이 결과에 도달한 시각으로, RFC 3339 형식입니다 |
예시
{
"eventType": "Transaction.PurchaseApprovalResult",
"data": {
"id": "9d4e2f81-7a3b-4c56-8e90-1f2a3b4c5d6e",
"sessionId": "b1a6482d-5242-4b4a-aa88-3fa52595a672",
"productId": 42,
"status": "approved",
"resolvedAt": "2026-06-24T15:12:00Z"
}
}
상태
status | 의미 | 대응 |
|---|---|---|
approved | 부모가 구매를 승인했습니다. | 구매를 완료합니다. |
denied | 부모가 구매를 거절했습니다. | 청구하지 마세요. 부모가 거절했음을 플레이어에게 알립니다. |
expired | 요청 후 24시간 안에 부모가 답변하지 않았습니다. | 청구하지 마세요. 플레이어에게 구매를 다시 제안할 수 있습니다. |
expired는 오류가 아니며 전달 실패도 아닙니다. 요청이 만료된 후 플레이어에게 구매를 다시 제안할 수 있습니다.
청구하기 전에 승인받으세요
결과는 구매를 게이트하며, 구매를 기록하는 것이 아닙니다. approved일 때만 구매를 완료하고, denied와 expired는 모두 "청구하지 않음"으로 처리하세요. 요청은 24시간 후에 만료되므로 웹훅을 무한정 기다리지 마세요. /transaction/request-purchase가 반환한 expiresAt이 그 이후로는 답변이 오지 않는 시점입니다.
전달은 최소 한 번이므로 같은 결과가 두 번 이상 도착할 수 있습니다. 웹훅 개요의 설명대로 핸들러를 data.id에 대해 멱등하게 만드세요.
발생하지 않는 경우
- 구매에 대해 승인이 요청되지 않았습니다.
- 제품에서 Purchase Controls 기능(Transactions 필요)이 꺼져 있어
/transaction/request-purchase가FEATURE_DISABLED를 반환하고 요청이 생성되지 않습니다.