소비 정보 전송
앱 사용자가 환불 요청을 할 때 사용자 소비 정보를 앱 스토어에 전송하는 API를 제공합니다.
'소비 정보 전송' API는 Hive 서버와 앱 서버 간의 Server-to-Server 통신 방식으로 Hive 서버가 앱 서버로 소비 정보 전송 요청을 보내면, 앱 서버에서 응답값을 Hive 서버로 반환합니다.
Note
현재 소비 정보 전송은 Apple App Store만 지원합니다.
동작 플로우¶
'소비 정보 전송' API 호출 및 응답의 전체 동작 흐름을 요약하면 아래와 같습니다.
- 앱: API 엔드포인트를 구성해 서버 URL을 준비
- 앱: Hive 콘솔에서 소비 정보 전송 사용 선택, 서버 URL을 등록
- 앱 클라이언트: 앱을 실행한 상태에서 인앱 상품 소비 정보 전송에 동의
- 앱 사용자: 앱에서 환불 요청
- Apple: Hive 서버로 소비 정보 요청(CONSUMPTION_REQUEST) 발송
- Hive 서버: 앱에서 등록한 서버 URL로 POST API 요청, 앱 서버로부터 응답값으로 소비 정보 데이터 수신
- Hive 서버: 앱 스토어에 소비 정보 전송(성공 시 Apple이 HTTP 202 응답)
Warning
앱 클라이언트에서 동의 팝업에서 정보 전송에 동의하지 않으면, Hive 서버는 앱 서버로부터 데이터를 수신하더라도 이를 앱 스토어에 전송할 수 없습니다. 사용자 동의 여부(customerConsented)는 앱 서버가 전송하지 않으며 Hive 서버가 자체적으로 설정합니다.
앱 스토어에 전송할 소비 정보에는 앱 서버에만 존재하는 데이터도 있습니다. 이 경우에는, Hive 서버가 소비 정보를 앱 스토어에 전송하려면, 앱 서버에서 먼저 Hive 서버에 데이터를 전달해야 합니다.
앱 서버 URL은 앱 서버가 Hive 서버에 데이터를 전달하기 위해, 앱 서버에서 열어놓은 API 엔드포인트입니다. API 엔드포인트를 구성한 후 앱 서버 URL로 등록하면, 사용자가 환불 요청을 할 때마다 Hive 서버가 이 API 엔드포인트로 POST 요청을 하고 필요한 데이터를 앱 서버로부터 전달받습니다. Hive 서버는 이러한 데이터를 취합하고 앱을 대신하여 앱 스토어에 소비 정보 전송을 완료합니다.
API 엔드포인트 구성(서버 URL)¶
앱 서버는 서버 URL로 등록할 API 엔드포인트로 요청을 받을 때 요청 매개변수의 사용자 정보(player_id)와 거래 정보(transaction_id)로 소비 정보를 조회하고, 응답 규약에 맞는 데이터를 반환해야 합니다.
방화벽 규칙 해제¶
Hive 서버가 앱 서버 API 엔드포인트로 요청을 보낼 수 있도록, 앱 서버에서 아래 IP 주소에 대해 방화벽 인바운드 규칙을 해제해야 합니다.
| Hive 서버 IP |
|---|
| 15.165.223.210 |
| 3.34.158.195 |
| 43.202.20.33 |
| 13.209.91.38 |
| 3.34.235.15 |
| 15.165.134.120 |
방화벽 규칙 해제 후, 아래 내용을 참고해 API 엔드포인트를 구성합니다.
API 요청(Hive 서버 → 앱 서버) 구성¶
Hive 서버에서 앱 서버로 보내는 POST 요청 정보입니다.
| API 정보 | 설명 |
|---|---|
| Method | POST |
| Response Format | JSON |
| Content-type | application/json |
Request body¶
요청 본문 정보는 아래와 같습니다.
| 명칭 | 타입 | 필수 여부 (필수: M, 옵션: O) | 설명 |
|---|---|---|---|
| gameindex | Integer | M | 앱 센터 게임 인덱스 |
| appid | String | M | 앱 센터 AppID |
| server_id | String | M | 앱 서버 ID |
| player_id | String | M | 앱 내 사용자 식별자(구매 검증 시 사용하는 사용자 식별 값). V1의 user_seq에 해당 |
| transaction_id | String | M | Apple 원거래 ID(originalTransactionId) |
요청 본문 예시는 아래와 같습니다.
{
"gameindex": 539,
"appid": "com.com2us.hivesdk.normal.freefull.apple.global.ios.universal",
"server_id": "server_01",
"player_id": "222333",
"transaction_id": "2000000123456789"
}
API 응답(앱 서버 → Hive 서버) 구성¶
앱 서버는 처리 결과 코드(code), 결과 메시지(message), 소비 정보(data)를 Hive 서버로 전달합니다.
Response body¶
Hive 서버는 code 값으로 성공 여부를 판별합니다. 200이면 성공으로 보고 data를 사용하며, 그 외 코드는 해당 건을 전송하지 않고 message를 사유로 기록합니다. code는 필수이며, 보내지 않으면 오류로 처리해 해당 건을 전송하지 않습니다.
| 명칭 | 타입 | 필수 여부 (필수: M, 옵션: O) | 설명 |
|---|---|---|---|
| code | Integer | M | 처리 결과 코드(아래 표 참고). 200만 성공이며, 그 외 코드는 오류로 처리 |
| message | String | O | 처리 결과 메시지. 오류 시 사유 설명용 |
| data | Object | M | 응답 데이터(성공 시 필수) |
| ┕ delivery_status | String | M | 소모성 아이템 전달 상태. 아래 전달 상태 값 중 하나 |
| ┕ refund_preference | String | O | 환불 선호도. 아래 환불 선호도 값 중 하나 |
| ┕ consumption_percentage | Integer | O | 소비 비율. millipercent 단위 0~100000 (100000 = 100%) |
| ┕ sample_content_provided | Integer | O | 샘플 콘텐츠 제공 여부. 0 또는 1 |
응답 성공 예시는 아래와 같습니다.
{
"code": 200,
"message": "OK",
"data": {
"delivery_status": "DELIVERED",
"refund_preference": "GRANT_FULL",
"consumption_percentage": 100000,
"sample_content_provided": 0
}
}
응답 코드¶
| 값 | 설명 |
|---|---|
| 200 | 성공 |
| 400 | 잘못된 요청값 |
| 500 | 서버 에러 |
전달 상태(delivery_status)¶
소모성 아이템의 전달 상태를 나타내며, 아래 5개 값 중 하나여야 합니다(필수).
| 값 | 의미 |
|---|---|
| DELIVERED | 소모성 아이템을 정상적으로 전달했고 정상 작동 |
| UNDELIVERED_QUALITY_ISSUE | 품질 문제로 전달하지 못함 |
| UNDELIVERED_WRONG_ITEM | 구매한 것과 다른(잘못된) 아이템을 전달함 |
| UNDELIVERED_SERVER_OUTAGE | 서버 장애로 전달하지 못함 |
| UNDELIVERED_OTHER | 그 외 사유로 전달하지 못함 |
환불 선호도(refund_preference)¶
앱에서 선호하는 환불 처리 방향을 Apple에 전달합니다(선택). 값을 보낼 경우 아래 3개 중 하나여야 합니다.
| 값 | 의미 |
|---|---|
| GRANT_FULL | 전액 환불 부여를 선호 |
| DECLINE | 환불하지 않음(거부)을 선호 |
| GRANT_PRORATED | 부분(비례) 환불 부여를 선호(주로 구독) |
Warning
아래 값이 유효하지 않으면 앱 스토어에 전송되지 않고 해당 건이 제외됩니다.
delivery_status는 필수이며, 위 5개 값 중 하나여야 합니다.refund_preference를 보낼 경우 위 3개 값 중 하나여야 합니다.consumption_percentage를 보낼 경우 0~100000 범위의 정수여야 합니다.
Note
아래는 Hive 서버가 Apple 규칙에 따라 자동으로 조정하는 동작입니다.
delivery_status가DELIVERED가 아니면consumption_percentage는 0으로 전송됩니다.refund_preference가GRANT_PRORATED(구독)이면consumption_percentage는 생략됩니다.