본문으로 건너뛰기

Galaxy Store 유저의 구매 완료 데이터를 빌링에 저장 요청 - 게임에서 결제 기능을 직접 구현한 경우

정보

해당 API는 게임에서 결제를 직접 구현한 경우에 구매 완료 데이터를 빌링 시스템에 전송하는 API입니다.

기본 정보​

  1. 협의된 특정 게임은 자체 구현한 결제를 사용할 수 있습니다.
    1. 단, 결제 어뷰징 방지는 게임쪽에서 잘 구현해주셔야합니다.
      1. 예) 저렴한 상품 구매 후 비싼 상품 지급 요청 방지
  2. 게임에서 결제를 구현했지만 매출 인식과 같은 재무 처리 및 플랫폼 기능을 일부 활용하기 위해서 ‘구매 완료 데이터’를 전송해줄 필요가 있습니다.
    1. Samsung IAP Server API의 Verify a Purchase 결과 데이터를 수집합니다. 게임 서버에서는 해당 API로 검증 후 status가 success인 결제 완료 데이터를 전송해주시면 됩니다.
    2. 빌링 서버에서 해당 API로 재 검증은 지원하지 않습니다.
항목내용비고
호출주체게임서버(s2s API)
도메인각 환경별 도메인
인증방식HTTP 헤더 인증 정보
HTTP 메소드POST
Content-Typeapplication/json

Request​

HTTP Request end point​

POST https://각 환경별 빌링시스템 도메인/billing/api-game/v1/purchase/galaxy/store/implement/self/completed/save

HTTP Request Header​

  • 아래의 HTTP Header들을 API 요청에 포함시켜야합니다.
이름값비고
X-Req-Pjid프로젝트ID기술 PM 등에게 전달받은 프로젝트ID
X-Auth-Access-Key인증용 키기술 PM 등에게 전달받은 해당 게임용 인증 키

HTTP Request Parameter​

  • Content-Type: application/json 으로 요청되어야 합니다.
    • 영수증 관련 정보들의 길이 및 escape 등의 문제 때문
key 1key 2데이터 타입필수설명예
pjid String(20)Y

프로젝트ID

  • 동일 게임이라면 서비스ID가 여러개일 수 있지만 프로젝트ID는 같음
1004
playerId String(50)Y주문 완료를 진행하는 유저ID
ipCountry String(10)N

player의 IP기반 국가코드로 법적 대응을 위해서 수집

productId String(200)Y구매를 진행한 상품ID(SKU와 같은 값)

galaxy_gamecode_ruby01

  • 참고) 스토어구분코드_게임구분자_게임에서정의한상품ID
microPrice longY

구매 금액 micro단위

  • 사용측의 부동 소수점 오차등을 방지하기 위해서 micro단위 사용
구매 금액 micro단위(예. $0.99는 990,000 µ$. 100만을 곱함)
currency String(10)Y

구매 금액의 화폐 단위

USD
memo String(2000)N

메모

  • 필요시 옵셔널하게 사용
galaxyPurchaseId String(100)Y

Unique identifier of the in-app item purchase transaction

  • 갤럭시스토어에 verify 요청한 purchaseID
7efef23271b0a48746a9d7c391e367c7a802980d391d7f9b75010e8138c66c36
galaxyVerifyPurchaseResult json arrayY

갤럭시 스토어 Verify a purchase 결과 json

  • status가 success인 경우
packageNameString(200)YPackage name of the app with a completed transactioncom.samsung.android.test
orderIdString(50)Y

Unique identifier assigned to the purchase receipt

  • 빌링 시스템에서 중요 키로 사용 됨
S20191129KRA1908197
modeString(20)Y

IAP operating mode in effect at the time of purchase

  • 참고: TEST인 경우 빌링 시스템에서도 테스트 결제로 처리 됨
TEST 또는 RODUCTION
statusString(20)YProcessing result of the request for the receipsuccess
purchaseDateStringY

Date and time of the item purchase and payment transaction.

  • GMT기준의 YYYY-MM-DD HH:mm:ss 포맷
2019-11-29 01:32:41
currencyCodeString(5)YCurrency code (3 characters) of the purchaser's local currency. (for example, EUR, GBP, USD)KRW
currencyUnitString(3)YSymbol of the purchaser's local currency (for example, €, £, or $)₩
paymentAmountStringYTotal amount, including the in-app item price and all applicable taxes, billed to the user100.000
paymentIdString(50)YUnique identifier assigned to the in-app item payment transaction when it was successful20191129013006730832TRAN
itemIdString(200)YUnique identifier of the in-app item registered in Seller Portalgalaxy_com.hybeim.test_gem_01
itemNameString(200)YTitle of the in-app item registered in Seller PortalTest Pack
itemDescString(2000)NBrief explanation of the in-app item registered in Seller PortalIAP Test Item. Best value!
paymentMethodString(50)YType of payment option used to purchase the itemCredit Card
consumeYNString(1)YFor consumable in-app items only, whether or not the item has been reported as consumed and is available for purchase againY 또는 N
consumeDateStringY

Date and time the consumable item was reported as consumed.

  • GMT기준의 YYYY-MM-DD HH:mm:ss 포맷
2019-11-28 10:18:11
consumeDeviceModelString(50)NModel name of device that reported the item as consumedSM-G965F
passThroughParamString(50)NTransaction ID created by your app for security. Returned only if the pass-through parameter was set.TEST_PASS_THROUGH

HTTP Request Parameter(Sample json)​

  • 요청 샘플 json입니다. 하단 curl 커맨드를 참고하셔도 좋습니다.

    {
    "playerId": "playerId",
    "ipCountry": "KR",
    "productId": "galaxy_gamecode_ruby01",
    "microPrice": 100000000,
    "currency": "KRW",
    "memo": "테스트 메모",
    "pjid": "1201",
    "galaxyPurchaseId": "7efef23271b0a48746a9d7c391e367c7a802980d391d7f9b75010e8138c66c36",
    "galaxyVerifyPurchaseResult": {
    "packageName": "com.samsung.android.test",
    "orderId": "S20191129KRA1908197",
    "mode": "PRODUCTION",
    "status": "success",
    "purchaseDate": "2019-11-29 01:32:41",
    "currencyUnit": "₩",
    "currencyCode": "KRW",
    "paymentAmount": "100.0",
    "paymentId": "20191129013006730832TRAN",
    "itemId": "57515",
    "itemName": "Test Pack",
    "itemDesc": "IAP Test Item. Best value!",
    "paymentMethod": "Credit Card",
    "consumeYN": "Y",
    "consumeDate": "2019-11-28 10:18:11",
    "consumeDeviceModel": "SM-G965F",
    "passThroughParam": "TEST_PASS_THROUGH"
    }
    }

Response​

응답은 JSON형태로 전달됩니다.

Success sample​

  • 성공할 경우 빌링 시스템에는 구매 완료 데이터가 생성되며 이때 boid가 생성됩니다.
  • 아래는 성공의 경우 샘플 json입니다.
{
"resultCode": "SUCCESS",
"resultMessage": "Saving the purchase completion data was successful. The boid generated by the billing system is '417'"
}

Error sample​

  • 이미 전송 완료된 데이터를 다시 요청한 경우
{
"resultCode": "INVALID_PARAMETER",
"resultMessage": "Exist billing paymentOrderId:'S20191129KRA1908197'(boid:'417'). Check your params's Galaxy Store 'orderId'",
"traceId": "b_94c45ca494a4"
}

에러 코드 정의​

  • 아래와 같은 에러코드가 resultCode에 응답될 수 있습니다. (참고 링크)
  • 아래의 에러코드들은 모든 빌링 API에서 발생 가능한 에러 코드들입니다.
    • 해당 에러코드 외에 각 API에서만 발생가능한 에러코드들도 있습니다.
    • 각 에러 코드를 바탕으로 필요시 비즈니스 로직을 작성하시면 됩니다.
에러코드비고
SYSTEM_ERROR

빌링 API에서 발생한 시스템 에러

  • HTTP 상태코드 500 리턴
NOT_ALLOW_AUTHAPI 인증 헤더 누락이거나 기타 권한이 없는 요청에서 발생
  • 아래 에러 코드들은 해당 API에서 발생 가능한 추가 에러 코드들입니다.
에러코드비고
INVALID_PARAMETER

요청 curl 샘플​

  • 도메인 및 인증 헤더 등은 변경 필요
curl -X 'POST' \
'http://localhost:10001/billing/api-game/v1/purchase/galaxy/store/implement/self/completed/save' \
-H 'accept: application/json;charset=UTF-8' \
-H 'X-Req-Pjid: TODO' \
-H 'X-Auth-Access-Key: TODO' \
-H 'Content-Type: application/json;charset=UTF-8' \
-d '{
"playerId": "playerId",
"ipCountry": "KR",
"productId": "galaxy_gamecode_ruby01",
"microPrice": 100000000,
"currency": "KRW",
"memo": "테스트 메모",
"pjid": "1201",
"galaxyPurchaseId": "7efef23271b0a48746a9d7c391e367c7a802980d391d7f9b75010e8138c66c36",
"galaxyVerifyPurchaseResult": {
"packageName": "com.samsung.android.test",
"orderId": "S20191129KRA1908197",
"mode": "PRODUCTION",
"status": "success",
"purchaseDate": "2019-11-29 01:32:41",
"currencyUnit": "₩",
"currencyCode": "KRW",
"paymentAmount": "100.0",
"paymentId": "20191129013006730832TRAN",
"itemId": "57515",
"itemName": "Test Pack",
"itemDesc": "IAP Test Item. Best value!",
"paymentMethod": "Credit Card",
"consumeYN": "Y",
"consumeDate": "2019-11-28 10:18:11",
"consumeDeviceModel": "SM-G965F",
"passThroughParam": "TEST_PASS_THROUGH"
}
}'