빌링에 구매 예약을 진행하며, 유저가 결제를 진행할 수 있는 XSOLLA 결제 URL을 요청
기본 정보
- XSOLLA를 이용해서 유저가 결제를 진행할 수 있도록 결제 URL을 요청하는 API입니다
- XSOLLA의 ‘구매용 결제 토큰 생성하기’ API를 랩핑해서 제공해드립니다.
- 빌링 API에서 제공하지 않는 기능이지만, 필요하다면 위 XSOLLA 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/xsolla/reserve/withGetPaymentUrl
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 으로 호출하면 됩니다.
| 이름(Key) | 데이터 타입 | 필수 Y/N | 설명 | 예 |
|---|---|---|---|---|
| reqId | String(100) | Y | 중복 요청을 막거나 요청 추적을 위한 값 | userId_UUID 등과 같은 방식으로 생성 userId_reserve_98b50907-0928-493b-a816-dac8dbca1f53 |
| pjid | String(20) | Y | 프로젝트ID * 동일 게임이면 svcId가 달라도 동일 | 1202 |
| svcId | String(20) | Y | 서비스ID * 플랫폼실 → 기술PM을 통해서 생성 | 120010101 |
| imid | String(40) | Y | IMID * 회원 플랫폼의 IMID로 로그인 후 얻을 수 있음 * playerId를 수집하지만 imid도 수집하는 이유는, 예약 단계에서 imid를 수집하여 한도 제한 기능 등을 구현할 때 사용 | |
| playerId | String(50) | Y | 주문 완료를 진행하는 유저ID | |
| ipCountry | String(10) | Y | 엑솔라 측에서 결제 통화 등을 판단하는데 국가코드가 중요하게 사용 player의 IP기반 국가코드로 법적 대응을 위해서 수집 서버IP 기반의 국가코드가 아니라, end 유저의 국가코드입니다. * 3166-1 alpha-2 국가코드 | KR |
| payment | String(20) | Y | 결제가 진행된 수단, 스토어 * 돈을 지급한 행위가 발생한 결제수단의 코드로 스토어코드와 일치하지 않을수 도 있음 | GOOGLE_PLAY, APPLE_APP, XSOLLA 등 |
| appStore | String(20) | Y | 앱을 다운로드한 플랫폼 스토어 * 개발사 입장에서는 배포한 스토어로 BIFROST 등 | BIFROST 등 |
| productId | String(200) | Y | 구매 진행하는 상품ID(SKU와 같은 값) | xsolla_test_gem_01 |
| os | String(10) | Y | 구매가 진행되는 디바이스의 OS 종류 | 코드표 OS참고 |
| microPrice | long | Y | 구매 금액 micro단위 * 사용측의 부동 소수점 오차를 방지하기 위해서 micro단위로 사용 * 국가별 한도처리 기능 제공을 위해서 예약 단계에서도 필요 | 구매 금액 micro단위(예. $0.99는 990,000 µ$. 100만을 곱함) |
| currency | String(10) | Y | 구매 금액의 화폐 단위 * 3글자 포맷의 ISO-4217 * 국가별 한도처리 기능 제공을 위해서 필요 | USD |
| playerNameValue | String(250) | Y | 엑솔라 결제 화면에서 보여지는 사용자 이름 * 인게임의 닉네임, 케릭터명 사용 가능 | 닉네임, 케릭터명 |
| playerLang | String(2) | Y | 엑솔라 결제 인터페이스의 언어로 두 자리의 소문자 언어코드 * 엑솔라 페이 스테이션의 현지화 언어코드 지원(링크) * 인게임내에서 지원하는 언어팩의 값을 활용 추천 | ko, en, cn, tw 등 |
Response
응답은 JSON형태로 전달됩니다.
Success sample
- 성공으로 응답하면 게임 서버는 게임 클라이언트에 paymentUrl을 리턴하여 웹브라우저(또는 웹뷰)를 이용해서 결제를 유도할 수 있습니다.
- 웹뷰를 사용할 경우 페이지 이동이 자유롭지 않으면 결제가 진행되지 않을 수 있습니다.
- 웹뷰 사용 시 해당 내용을 주의해야하며 특정 앱으로 이동하거나 새로운 창이 띄워지는 부분을 웹뷰에서 허용해야합니다
- 즉, 상세한 테스트가 필요하기에 외부 브라우저 사용을 추천드립니다.
{
"resultCode": "SUCCESS",
"resultMessage": "request success",
"resultData": {
"xsollaEnv": "SANDBOX",
"xsollaOrderId": 95132267,
"xsollaToken": "ziqkqzWcKJkRyLASVlx562QuJDWWa1H6_lc_ko_bg_FFFFFF_tb_3D46F5",
"paymentUrl": "https://sandbox-secure.xsolla.com/paystation4/?token=ziqkqzWcKJkRyLASVlx562QuJDWWa1H6_lc_ko_bg_FFFFFF_tb_3D46F5"
}
}
Response property
- 응답 성공인 경우의 resultData에 json 필드 설명입니다.
| key | data type | description | example |
|---|---|---|---|
| boid | String | 빌링에서 생성된 유니크한 id | 57 |
| xsollaEnv | String | 엑솔라 환경 * 빌링 시스템에 셋팅된 엑솔라 결제 환경 | PROD 또는 SANDBOX |
| xsollaOrderId | int | 엑솔라 주문ID로 게임에는 참고 목적으로 응답 유저의 영수증에 표시되는 ID는 아님 | 12345 |
| paymentUrl | String(500) | 결제 URL(해당 URL을 유저에게 보여줘서 결제를 유도) | 결제 URL(Success sample 참고) |
Error sample
- reqId 중복 요청
{
"resultCode": "INVALID_PARAMETER",
"resultMessage": "duplicated reqeust. Check your 'reqId' or duplicated request data."
}
- 한도 제한으로 추가 처리가 필요한 경우 에러
- PURCHASE_MONTHLY_LIMITED 에러코드가 리턴됩니다.
- 게임쪽에서 추가 로직을 구현에 사용하실 수 있도록 해당 에러코드가 리턴되면 monthlyLimitedDetail을 추가로 응답합니다.
- 추가 정보 필드들에 대한 설명
| key | data type | description | example |
|---|---|---|---|
| appliedPolicy | String | 한도제한이 적용된 정책코드 |
|
| currency | String | 통화 | KRW, JPY |
| limitConfigMircoPrice | Long | 설정된 한도 금액 micro단위 | 30000000000 |
| thisMonthAmountMircoPrice | Long | 이번달 구매 금액의 micro단위
| 29500000000 |
| countryCreated | String | 해당 유저 계정에 생성된 국가 코드
| JP, KR |
| debugMessage | String | 개발자 디버깅 참고용 응답 메시지
| 일본 미성년자('16세') 한도 초과로 구매 중단. 한도 설정: '30000' | 이번달 구매한 대상 금액(JPY):'29500.0000' | 추가 구매하려는 금액:'550.950000' | 총합:'30050.950000 |
- 한국 한도제한 적용됨: KR_MINOR
{
"resultCode": "PURCHASE_MONTHLY_LIMITED",
"resultMessage": "Requests exceeding the monthly purchase limit.",
"resultData": {
"monthlyLimitedDetail": {
"appliedPolicy": "KR_MINOR",
"limitConfigMircoPrice": 70000000000,
"currency": "KRW",
"thisMonthAmountMircoPrice": 68000000000,
"countryCreated": "KR",
"debugMessage": "한국 한도 초과로 구매 중단('9세'). 한도:'70000' | 이번달 구매한 대상 금액(특정 다운로드 앱 스토어 & KRW):68000.0000 | 추가 구매하려는 금액:'59000.000000' | 총합:127000.000000"
}
}
}
- 한국 한도제한 적용됨: KR_ADULT
{
"resultCode": "PURCHASE_MONTHLY_LIMITED",
"resultMessage": "Requests exceeding the monthly purchase limit.",
"resultData": {
"monthlyLimitedDetail": {
"appliedPolicy": "KR_ADULT",
"limitConfigMircoPrice": 1000000000000,
"currency": "KRW",
"thisMonthAmountMircoPrice": 990000000000,
"countryCreated": "KR",
"debugMessage": "한국 한도 초과로 구매 중단('22세'). 한도:'1000000' | 이번달 구매한 대상 금액(특정 다운로드 앱 스토어 & KRW):990000.0000 | 추가 구매하려는 금액:'120000.000000' | 총합:1110000.000000"
}
}
}
- 일본 한도제한 적용됨: JP_MINOR_UNDER_AGE_16
{
"resultCode": "PURCHASE_MONTHLY_LIMITED",
"resultMessage": "Requests exceeding the monthly purchase limit.",
"resultData": {
"monthlyLimitedDetail": {
"appliedPolicy": "JP_MINOR_UNDER_AGE_16",
"limitConfigMircoPrice": 5000000000,
"currency": "JPY",
"thisMonthAmountMircoPrice": 4800000000,
"countryCreated": "JP",
"debugMessage": "일본 미성년자('10세') 한도 초과로 구매 중단. 한도 설정: '5000' | 이번달 구매한 대상 금액(JPY):'4800.0000' | 추가 구매하려는 금액:'550.950000' | 총합:'5350.950000'"
}
}
}
- 일본 한도제한 적용됨: JP_MINOR_UNDER_AGE_18_OVER_16
{
"resultCode": "PURCHASE_MONTHLY_LIMITED",
"resultMessage": "Requests exceeding the monthly purchase limit.",
"resultData": {
"monthlyLimitedDetail": {
"appliedPolicy": "JP_MINOR_UNDER_AGE_18_OVER_16",
"limitConfigMircoPrice": 30000000000,
"currency": "JPY",
"thisMonthAmountMircoPrice": 29500000000,
"countryCreated": "JP",
"debugMessage": "일본 미성년자('16세') 한도 초과로 구매 중단. 한도 설정: '30000' | 이번달 구매한 대상 금액(JPY):'29500.0000' | 추가 구매하려는 금액:'550.950000' | 총합:'30050.950000'"
}
}
}
에러 코드 정의
- 아래와 같은 에러코드가 resultCode에 응답될 수 있습니다.
- 아래의 에러코드들은 모든 빌링 API에서 발생 가능한 에러 코드들입니다.
- 해당 에러코드 외에 각 API에서만 발생가능한 에러코드들도 있습니다.
- 각 에러 코드를 바탕으로 필요시 비즈니스 로직을 작성하시면 됩니다.
| 에러코드 | 비고 |
|---|---|
| SYSTEM_ERROR | 빌링 API에서 발생한 시스템 에러
|
| NOT_ALLOW_AUTH | API 인증 헤더 누락이거나 기타 권한이 없는 요청에서 발생 |
- 아래 에러 코드들은 해당 API에서 발생 가능한 추가 에러 코드들입니다.
- 특정 결제 수단인 경우 아래와 같은 에러 코드가 resultCode에 응답될 수 있습니다.
- 특정 국가에서 요구하는 월 구매금액 한도 제한을 빌링 시스템에서 제공하기 위한 에러코드가 포함됩니다.
- 한국: ‘결제 한도 자율 규제’에 따라서 PC 자체 서비스에 대해서, 한국에서 생성된 계정에 대한 정책
- 일본: ‘일본 청소년 소셜 게임 결제 자율 규제’에 따라서 1) 성인 2)18세 미만~16세 이상 3)16세 미만
| 에러코드 | 비고 |
|---|
| 에러코드 | 비고 |
|---|---|
| INVALID_PARAMETER | 요청된 파라미터 오류 |
| EXTERNAL_API_ERROR | 빌링 API가 호출하는 외부 API가 에러인 경우 |
| JAPANESE_DATE_BIRTH_REQUIRED | 일본 IP에서 생성된 계정(imid)인데 생년월일 정보를 입력하지 않아서 입력 필요
|
| PURCHASE_MONTHLY_LIMITED | 한국 또는 일본에서 생성된 계정이고, 한도 체크 대상에 포함되는 대상인데 이번달 결제 금액이 한도를 초과
|
요청 curl 샘플
- 도메인 및 인증 헤더 등은 변경 필요
curl -X 'POST' \
'도메인/billing/api-game/v1/purchase/xsolla/reserve/withGetPaymentUrl' \
-H 'accept: application/json;charset=UTF-8' \
-H 'X-Req-Pjid: 입력필요' \
-H 'X-Auth-Access-Key: 입력필요' \
-H 'Content-Type: application/x-www-form-urlencoded' \
-d 'appStore=BIFROST&os=WIN64µPrice=990000&playerNameValue=%EB%8B%89%EB%84%A4%EC%9E%84&payment=XSOLLA&productId=xsolla_test_group_item_01&ipCountry=KR&playerLang=ko¤cy=USD&pjid=1201&reqId=playerId_1reserve_98b50907-0928-493b-a816-dac8dbca1f53&svcId=12010020&playerId=test_playerId&imid=DJ883RWED6N2HYP5XGGA'