Google Play 미 완료 및 소모(Consume) 처리 누락된 리스트 조회 -게임서버 재처리 필요
기본 정보
- 빌링에 검증(verify)까지 완료 후 빌링 완료 및 consume(소모) 처리 누락된 리스트를 조회하는 API
- 유저에게 결제가 완료되어 돈은 청구되었지만, 상품 지급이 누락되었을 가능성이 높은 리스트
- 소모성 상품의 경우 최종 소모(consume)처리를 진행하지 않는다면 유저는 해당 상품을 다시 구매할 수 없습니다.
- 3일간 방치되면 구글이 자동 환불 처리를 진행합니다.
- 게임은 해당 API로 리스트를 조회하여 상품 지급 누락인 경우 지급하거나 상품은 지급했지만 빌링 완료 및 소모 처리를 누락한 경우 재 처리를 구현할 수 있습니다.
- 예) 구글앱의 경우 인게임의 상점 진입 시점 등에 미 처리 데이터 존재 여부를 API로 확인
- 재 처리 기능을 구현할 때는 게임서버의 상품(아이템) 지급 결과와 비교하여 중복 지급되지 않도록 주의
위험
- Client의 재처리는 SDK가이드 확인 후 구현하셔야합니다.
- 해당 API는 게임서버에서 최종 완료 및 소모를 누락하여 3일 후 Google에 의한 자동 결제 취소 등을 방어하기 위한 기능 구현용 API입니다.
| 항목 | 내용 | 비고 |
|---|---|---|
| 호출주체 | 게임서버(s2s API) | |
| 도메인 | 각 환경별 도메인 | |
| 인증방식 | HTTP 헤더 인증 정보 | |
| HTTP 메소드 | POST | |
| Content-Type | application/x-www-form-urlencoded |
Request
HTTP Request end point
POST https://각 환경별 빌링시스템 도메인/billing/api-game/v1/purchase/google/play/consumable/retry/list
HTTP Request Header
- 아래의 HTTP Header들을 API 요청에 포함시켜야합니다.
| 이름 | 값 | 비고 |
|---|---|---|
| X-Req-Pjid | 프로젝트ID | 기술 PM 등에게 전달받은 프로젝트ID |
| X-Auth-Access-Key | 인증용 키 | 기술 PM 등에게 전달받은 해당 게임용 인증 키 |
HTTP Request Parameter
- 아래 파라미터들을 Content-Type: application/x-www-form-urlencoded 으로 호출하면 됩니다.
| 이름 | 데이터 타입 | 설명 | 예 |
|---|---|---|---|
| pjid | String(20) | 프로젝트ID
| 1004 |
| playerId | String(50) | 결제를 진행하는 유저의 ID
| |
| maxLimit | Integer | 최대 조회 건수: 최대 값 5
| 1 |
Response
- 응답은 JSON형태로 전달됩니다.
- 응답 데이터가 리턴되는 경우 resultData 필드에 셋팅되어 응답됩니다.
// API 요청이 성공했으며 추가 데이터 리턴되는 경우 json 구조 예
{
"resultCode": "SUCCESS",
"resultMessage": "success request",
"resultData": {
"키1": '값1',
"키2": '값2',
}
}
Response property
| key(1 depth) | key(2 depth) | data type | not null Y/N | description | example |
|---|---|---|---|---|---|
| retryAbleList | list | 재 처리 가능한 리스트 | |||
| boid | String(20) | Y | 빌링 시스템의 주문ID | 4 | |
| playerId | String(50) | Y | 결제를 진행했던 유저의 ID | ||
| payment | String(20) | Y | 결제가 진행된 스토어(돈을 지급한 행위가 발생한 스토어) | ||
| appStore | String(20) | Y | 앱을 다운로드한 플랫폼 스토어(개발사 입장에서는 배포한 스토어) | ||
| productId | String(200) | Y | 예약 시점에 요청된 상품ID | ||
| purchaseStatus | String(30) | Y | 빌링시스템에 구매 상태 | 코드 표 참고 | |
| totalPrice | Decimal(14,4) | N
| 구매 금액
| ||
| totalMicroPrice | Long | N
| 구매 금액 micro단위 | ||
| currency | String(10) | N
| 구매 금액의 화폐 단위
| ||
| completedAt | String | N
| 구매 완료 일시
| 2023-11-26T14:56:38.000+09:00 | |
| completedAtUnixTS | Long | N
| 구매 완료 일시의 Unix Timestamp 타입 | 1707219996 |
Success sample
- 재 처리 가능한 리스트가 list로 리턴
- 단, 해당 데이터로 다시 빌링 완료 및 Google 소모처리를 요청해도, 중간에 운영툴 등에서 소모 처리가 진행되었다면 실제 완료API에서는 에러가 리턴될 수 있음
- Google API가 장애 등으로 요청 결과를 응답받지 못하면 해당 데이터는 응답 리스트에서 제외 됨
{
"resultCode": "SUCCESS",
"resultMessage": "success api request.",
"resultData": {
"retryAbleList": [
{
"boid": "1",
"playerId": "playerId",
"payment": "GOOGLE_PLAY",
"appStore": "GOOGLE_PLAY",
"productId": "google_play_gem_01",
"purchaseStatus": "VERIFY_SUCCESS",
"totalPrice": 2200.0000,
"totalMicroPrice": 2200000000,
"currency": "JPY",
"completedAt": "2023-11-26T16:28:08.000+09:00",
"completedAtUnixTS": 1706528450
}
]
}
}
- API 요청이 성공했지만 대상 데이터 없는 경우
{
"resultCode": "SUCCESS",
"resultMessage": "success api request.",
"resultData": {
"retryAbleList": null
}
}
Error sample
- 최대 조회 갯수인 5개보다 더 많은 수를 요청한 경우
{
"resultCode": "INVALID_PARAMETER",
"resultMessage": "'maxLimit' must be between 1 and 5"
}
에러 코드 정의
- 아래와 같은 에러코드가 resultCode에 응답될 수 있습니다. (참고 링크)
- 아래의 에러코드들은 모든 빌링 API에서 발생 가능한 에러 코드들입니다.
- 해당 에러코드 외에 각 API에서만 발생가능한 에러코드들도 있습니다.
- 각 에러 코드를 바탕으로 필요시 비즈니스 로직을 작성하시면 됩니다.
| 에러코드 | 비고 |
|---|---|
| SYSTEM_ERROR | 빌링 API에서 발생한 시스템 에러
|
| NOT_ALLOW_AUTH | API 인증 헤더 누락이거나 기타 권한이 없는 요청에서 발생 |
- 아래 에러 코드들은 해당 API에서 발생 가능한 추가 에러 코드들입니다.
| 에러코드 | 비고 |
|---|---|
| INVALID_PARAMETER | |
| EXTERNAL_API_ERROR | 빌링 API가 호출하는 외부 API가 에러인 경우 |
요청 curl 샘플
- 도메인 및 인증 헤더 등은 변경 필요
curl --location 'https://billing-game-api-dev.pub-dev.hybegames.io/billing/api-game/v1/purchase/google/play/consumable/consumable/beforeConsume/list' \
--header 'X-Req-Pjid: 9001' \
--header 'X-Auth-Access-Key: test-auth-key' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'pjid=9001' \
--data-urlencode 'playerId=playerId' \
--data-urlencode 'maxLimit=5'