플레이어 인벤토리

엑솔라 플레이어 인벤토리는 파트너에게 다음을 허용합니다:

  • 모든 플랫폼 상에서 사용자의 모든 구매 및 프리미엄 보상을 동기화.
  • 엑솔라 API를 사용하여 사용자 인벤토리에서 아이템과 화폐를 부여 및 취소.

글로서리

인벤토리

인벤토리는 사용자가 구매, 수입 혹은 지출할 수 있는 모든 아이템 세트를 뜻합니다.

소모성 아이템

소모성 아이템은 반복하여 구매 및 인벤토리에 누적이 가능하며 사용하면 수량이 줄어드는 아이템을 말합니다. 아이템 재고는 보충할 수 있습니다. 예: 적 공격에 사용할 수류탄,탄환, 코인 등.

비소모성 아이템

비소모성 아이템은 인벤토리에 한 번만 누적하거나 구매할 수 있는 아이템을 말합니다. 인벤토리에 항상 있습니다. 예: 위치에 접근, 상태, 구독.

인게임 스토어

인게임 스토어는 인게임 구매 관리 서비스입니다. 개발자에게 게임 생태계에서 광대한 맞춤형 가상 상품 카탈로그로 소액 거래를 할 수 있는 기회를 제공합니다.

작동 방식

플레이어 인벤토리는 사용자 ID를 통해 사용자 인벤토리를 관리합니다. 사용자 식별은 엑솔라 로그인을 통해 이루어집니다. 사용자 식별 시스템을 자체적으로 구축하려면 클라이언트 API 메소드용 Pay Station Access Token을 사용할 수 있습니다.

플레이어 인벤토리 API 메소드를 사용하려면, 인증을 구성해야 합니다.

사용자 인벤토리는 소모품 및 비소모성 아이템을 포함할 수 있습니다. 소모품 아이템은 게임 클라이언트를 통해 여러 번 구매 및 인벤토리 추가와 제거가 가능합니다. 비소모성 아이템은 구매 및 인벤토리에의 추가가 한 번만 가능합니다. 구매 취소 및 인벤토리에서 제거는 게임 서버를 통하여 이루어집니다.

위의 구성표는 다음과 같은 플레이어 인벤토리 운용 원리를 보여줍니다:

1 - 인벤토리 가져오기

  1. 게임 내 사용자 식별은 엑솔라 로그인 계정 혹은 여러분 자체적인 식별 메소드를 통해 이루어집니다.
  2. 여러분의 어플리케이션 (클라이언트)이 Get user’s inventory 메소드를 호출하여 구매 및 보상 목록을 가져오거나 Get user’s virtual balance 메소드를 호출하여 가상통화 잔고를 확인할 수 있습니다.
  3. 엑솔라 인벤토리 서버는 사용자가 현재 소유 한 구매, 보상 또는 잔액에 대한 정보를 고객에게 반환합니다.

2 - 엑솔라 스토어를 통한 인게임 구매

  1. 게임 내에서 사용자는 엑솔라 로그인 계정 혹은 여러분 자체적인 식별 메소드를 통해 식별됩니다.
  2. 사용자는 엑솔라 스토어에서 구매할 수 있습니다.
  3. 콘텐츠 구매 이벤트는 엑솔라 인벤토리 서버로 전송되며 구매한 아이템은 자동으로 사용자 인벤토리에 부여됩니다.

Note: 알고리즘이 엑솔라 측에서 완벽하게 구현되어 있으므로 게임 서버 측에서 할 작업은 없습니다.

3 - 서드파티 플랫폼을 통한 인 앱 구매(스팀, 플레이스테이션, 기타)

  1. 사용자는 플랫폼 계정을 사용하여 게임에 로그인합니다.
  2. 사용자는 플랫폼 결제 시스템을 통해 구매합니다.
  3. 게임 서버는 Grant items by purchase to users 메소드를 호출하는데 게임 내 사용자 고유 ID를 엑솔라 인벤토리 서버에 전송하여 구매를 승인합니다.
  4. 엑솔라 인벤토리 서버는 지정된 ID로 사용자 인벤토리에 구매 항목을 추가합니다.

Note: 게임의 서버 측면에서, 여러 다양한 게시 플랫폼 사용자 계정 사이의 동기화를 확실히 할 필요가 있습니다.

4 - 사용자에게 보상 제공

  1. 게임 내 사용자 식별은 엑솔라 로그인 계정 혹은 여러분 자신의 식별 메소드를 통해 이루어집니다.
  2. 여러분의 서버는 보상을 제공하기 위하여 다음의 Grant items to users 메소드를 호출하며, 이 때 고유의 게임 내 사용자 ID를 전송합니다.
  3. 엑솔라 인벤토리 서버는 지정된 ID의 사용자 인벤토리에 보상을 추가합니다.

Note: 게임의 서버 측면에서, 여러 다양한 게시 플랫폼 사용자 계정 사이의 동기화를 확실히 할 필요가 있습니다.

5 - 인벤토리 동기화

  1. 게임 내에서 사용자는 엑솔라 로그인 계정, 여러분 자체적인 식별 메소드 혹은 서드파티 플랫폼 계정을 통해 식별됩니다.
  2. 필요한 경우 게임 서버가 사용자 계정을 동기화합니다.
  3. 게임 클라이언트는 Get user’s inventory 메소드를 호출하여 사용 가능한 인게임 구매 항목을 확인하고 고유의 사용자 ID를 송부합니다.
  4. 엑솔라 인벤토리 서버는 특정 ID에 대하여 사용 가능한 항목의 목록을 반환합니다.

통합 플로우

플레이어 인벤토리 활성화 방법:

  1. 다음 엑솔라 게시자 계정을 등록합니다.
  2. 다음에서 프로젝트를 생성 및 구성합니다 게시자 계정.
  3. 여러분의 게시자 계정에서 다음을 설정: 가상 아이템가상 화폐 모듈.
  4. 인게임 스토어 연결: API 혹은 Unity/Unreal SDK.
  5. 인증 설정.
  6. 인벤토리 관리를 위하여 메소드구현.

프로젝트 생성

  1. 프로젝트로 이동하여 프로젝트 생성 버튼을 클릭합니다.
  2. 프로젝트 이름을 추가하고 생성을 클릭.

  1. 프로젝트 설정 > 통합 설정으로 이동하여 스토어 API 메소드를 연결합니다.

  1. 스토어를 여러분의 프로젝트에 연결합니다.

게임 아이템 설정

  1. 게임 아이템 모듈을 연결합니다.

  1. 아이템 그룹을 생성합니다(선택 사항).

  1. 아이템을 생성합니다.

게임머니 설정

  1. 게임머니 모듈을 연결합니다.

  1. 게임머니를 생성합니다.

인증 설정

보안을 위하여 게임 서버가 부여 및 취소 메소드를 호출합니다. 위에서 언급한 메소드를 위하여 다음 기본 접근 인증을 구현해야 합니다.

SDK 혹은 API를 통해 게임 클라이언트의 사용자 인벤토리 가져오기와 아이템 사용 메소드는 호출이 이루어집니다. 사용할 수 있는 인증 옵션은 다음과 같습니다:

  1. 만약 엑솔라 로그인이 연결된 경우, 인증 요청을 위해 엑솔라 로그인 JWT 사용합니다.
  2. 자체적인 식별 시스템을 갖춘 경우, Pay Station Access Token을 이용하여 인증 요청합니다.

Note: 자체적인 사용자 식별 메소드를 사용하는 경우, 서버 기반의 아이템 부여 및 취소 메소드에 user.id를 전달합니다. 이는 반드시 여러분이 Pay Station Access Token에 사용한 user.id와 일치해야 합니다.

엑솔라 로그인을 통한 인증

  1. 게시자 계정 프로젝트를 지침에 따라 설정합니다.
  2. JSON 웹 토큰 혹은 OAuth 2.0 프로토콜을 통하여 인증 메소드 호출을 구현합니다.

사용자 데이터가 엑솔라 데이터 스토리지에 보관되는 경우, 다음 메소드 호출을 구현합니다:

사용자 데이터가 PlayFab 데이터 스토리지에 보관되는 경우, PlayFab 레시피 사용.

사용자 데이터를 여러분 자신이 보관하는 경우, 사용자 정의 스토리지 레시피.

Pay Station Access Token을 통한 인증

인증 절차:

  1. 앱(클라이언트)에서 서버에 인증 요청을 보냅니다.
  2. 야러분의 서버에서 엑솔라 서버로 판매자 ID 및 API 키를 보내고 access_token를 요청합니다.
  3. 엑솔라 서버는 access_token를 여러분의 서버 보냅니다.
  4. 여러분의 서버는 access_token를 여러분 클라이언트에게 송부합니다.

반환된 access_token는 스토어 API 인증 및 스토어 인터페이스 구축에 인증 토큰으로 사용됩니다.

기본 접근 인증 설정

엑솔라 API 인벤토리에 항목을 부여취소하는 서버 명령은 기본 접근 인증을 사용합니다. API에의 모든 요청은 Authorization: Basic <your_authorization_basic_key> 헤더를 반드시 포함해야 하며, <your_authorization_basic_key>는 Base64 표준에 따라 인코딩된 merchant_id:api_key 쌍입니다.

엑솔라 게시자 계정으로 이동하여 project_idapi_key 매개변수 값을 찾습니다:

  • project_id: 프로젝트 설정 > 웹훅
  • api_key: 회사 설정 > API 키

Copy
Full screen
  • http
  • curl
  • php
  • C#
  • python
  • ruby
  • java
  • js
POST https://store.xsolla.com/api/v2/project/{project_id}/inventory/reward
Headers:
  Authorization: Basic <your_authorization_basic_key>
curl --request POST \
--url 'https://store.xsolla.com/api/v2/project/{project_id}/inventory/reward' \
--header 'authorization: Basic <your_authorization_basic_key>'
<?php

// if you use Xsolla SDK for PHP
use Xsolla\SDK\API\XsollaClient;
$xsollaClient = XsollaClient::factory(array(
    'project_id' => PROJECT_ID,
    'api_key' => API_KEY
));
$eventsList = $client->ListEvents(array());

// if you don’t use Xsolla SDK for PHP
$client = new http\Client;
$request = new http\Client\Request;

$request->setRequestUrl('https://store.xsolla.com/api/v2/project/{project_id}/inventory/rewards');
$request->setRequestMethod('POST');
$request->setHeaders(array(
  'authorization' => 'Basic <your_authorization_basic_key>'
));

$client->enqueue($request)->send();
$response = $client->getResponse();

echo $response->getBody();
var client = new RestClient("https://store.xsolla.com/api/v2/project/{project_id}/inventory/reward");
var request = new RestRequest(Method.POST);
request.AddHeader("authorization", "Basic <your_authorization_basic_key>");
IRestResponse response = client.Execute(request);
import http.client

conn = http.client.HTTPSConnection("api.xsolla.com")

headers = { 'authorization': "Basic <your_authorization_basic_key>" }

conn.request("POST", "https://store.xsolla.com/api/v2/project/{project_id}/inventory/reward", headers=headers)

res = conn.getresponse()
data = res.read()

print(data.decode("utf-8"))
require 'uri'
require 'net/http'

url = URI("https://store.xsolla.com/api/v2/project/{project_id}/inventory/reward
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

request = Net::HTTP::Get.new(url)
request["authorization"] = 'Basic <your_authorization_basic_key>'

response = http.request(request)
puts response.read_body
OkHttpClient client = new OkHttpClient();

Request request = new Request.Builder()
  .url("https://store.xsolla.com/api/v2/project/{project_id}/inventory/reward")
  .post()
  .addHeader("authorization", "Basic <your_authorization_basic_key>")
  .build();

Response response = client.newCall(request).execute();
var data = null;

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("POST", "https://store.xsolla.com/api/v2/project/{project_id}/inventory/reward");
xhr.setRequestHeader("authorization", "Basic <your_authorization_basic_key>");

xhr.send(data);

인벤토리 관리 방식

인벤토리 관리 메소드는 다음 메소드 그룹을 포함합니다:

Grant Items to Users

Grant items to users API 메소드를 구현하여 특정 아이템을 사용자 인벤토리에 추가하거나 가상 화폐를 잔고에 추가하기.

요청

<?php
$uri = 'https://store.xsolla.com/api/v2/project/44056/inventory/reward';
$body = '
    [
        {
          "user": {
            "id": "0125760a-6810-11e9-84c0-42010aa80029"
          },
          "comment": "Quest completed",
          "platform": "xsolla",
          "items": [
            {
              "sku": "boots_1",
              "quantity": 5
            },
            {
              "sku": "crystal_pack_1",
              "quantity": 3
            }
          ]
        },
        {
          "user": {
            "id": "a7d10a4e-3f68-43cc-a6b2-893d2c68fd14"
          },
          "comment": "Daily reward",
          "platform": "xsolla",
          "items": [
            {
              "sku": "helmet_1",
              "quantity": 2
            },
            {
              "sku": "minigun_1",
              "quantity": 3
            }
          ]
        }
    ]';

$auth = base64_encode('44056:your_merchant_api_key');

$headers = [
    'Authorization: Basic ' . $auth,
    'Content-type: application/json'
];

$request = curl_init($uri);
curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
curl_setopt($request, CURLOPT_POSTFIELDS, $body);
curl_setopt($request, CURLOPT_HTTPHEADER, $headers);

$response = curl_exec($request);

응답

{
    "count": 2,
    "operations": [
        {
            "user_id": "0125760a-6810-11e9-84c0-42010aa80029",
            "platform": "xsolla",
            "comment": "Quest completed",
            "items": [
                {
                    "sku": "boots_1",
                    "quantity": 5
                },
                {
                    "sku": "crystal_pack_1",
                    "quantity": 3
                }
            ]
        },
        {
            "user_id": "a7d10a4e-3f68-43cc-a6b2-893d2c68fd14",
            "platform": "xsolla",
            "comment": "Daily reward",
            "items": [
                {
                    "sku": "helmet_1",
                    "quantity": 2
                },
                {
                    "sku": "minigun_1",
                    "quantity": 3
                }
            ]
        }
  ]
}

Revoke Inventory Items

Revoke inventory items API 메소드를 구현하여 사용자의 인벤토리에서 특정 아이템을 취소하거나 잔고에서 가상 화폐를 취소.

요청

<?php
$uri = 'https://store.xsolla.com/api/v2/project/44056/inventory/revoke';
$body = '
    [
        {
          "user": {
            "id": "0125760a-6810-11e9-84c0-42010aa80029"
          },
          "comment": "Remove from inventory",        
          "items": [
            {
              "sku": "boots_1",
              "quantity": 5
            },
            {
              "sku": "crystal_pack_1",
              "quantity": 3
            }
          ]
        },
        {
          "user": {
            "id": "a7d10a4e-3f68-43cc-a6b2-893d2c68fd14"
          },
          "comment": "Cheater",
          "items": [
            {
              "sku": "helmet_1",
              "quantity": 2
            },
            {
              "sku": "minigun_1",
              "quantity": 3
            }
          ]
        }
    ]';

$auth = base64_encode('44056:your_merchant_api_key');

$headers = [
    'Authorization: Basic ' . $auth,
    'Content-type: application/json'
];

$request = curl_init($uri);
curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
curl_setopt($request, CURLOPT_POSTFIELDS, $body);
curl_setopt($request, CURLOPT_HTTPHEADER, $headers);

$response = curl_exec($request);
print_r($response);

응답

{
    "count": 2,
    "operations": [
        {
            "user_id": "0125760a-6810-11e9-84c0-42010aa80029",
            "platform": "xsolla",
            "comment": "Remove from inventory",
            "items": [
                {
                    "sku": "boots_1",
                    "quantity": 5
                },
                {
                    "sku": "crystal_pack_1",
                    "quantity": 3
                }
            ]
        },
        {
            "user_id": "a7d10a4e-3f68-43cc-a6b2-893d2c68fd14",
            "platform": "xsolla",
            "comment": "Cheater",
            "items": [
                {
                    "sku": "helmet_1",
                    "quantity": 2
                },
                {
                    "sku": "minigun_1",
                    "quantity": 3
                }
            ]
        }
    ]
}

Grant Items by Purchase to Users

Grant items by purchase to users API 메소드를 구현하여 서드파티 플랫폼 상에서 구매가 이루어진 경우 아이템을 사용자 인벤토리에 추가.

요청

<?php
$uri = 'https://store.xsolla.com/api/v2/project/44056/inventory/purchase';
$body = '
    [
        {
          "user": {
            "id": "0125760a-6810-11e9-84c0-42010aa80029"
          },
          "comment": "Purchase in App Store",
          "platform": "app_store_ios",
          "purchase": {
            "amount": "3.99",
            "currency": "USD",
            "external_purchase_id": "MS6TGW7023",
            "external_purchase_date": "2020-01-25T05:00:00+05:00"
          },        
          "items": [
            {
              "sku": "boots_1",
              "quantity": 5
            },
            {
              "sku": "crystal_pack_1",
              "quantity": 3
            }
          ]
        },
        {
          "user": {
            "id": "a7d10a4e-3f68-43cc-a6b2-893d2c68fd14"
          },
          "comment": "Purchase in Google Play",
          "platform": "google_play",
          "purchase": {
            "amount": "1.99",
            "currency": "EUR",
            "external_purchase_id": "GPA.3357-9348-5932-89841",
            "external_purchase_date": "2020-02-14T05:00:00+05:00"
          },
          "items": [
            {
              "sku": "helmet_1",
              "quantity": 2
            },
            {
              "sku": "minigun_1",
              "quantity": 3
            }
          ]
        }
    ]';

$auth = base64_encode('44056:your_merchant_api_key');

$headers = [
    'Authorization: Basic ' . $auth,
    'Content-type: application/json'
];

$request = curl_init($uri);
curl_setopt($request, CURLOPT_RETURNTRANSFER, true);
curl_setopt($request, CURLOPT_POSTFIELDS, $body);
curl_setopt($request, CURLOPT_HTTPHEADER, $headers);

$response = curl_exec($request);
print_r($response);

응답

{
    "count": 2,
  "operations": [
    {
      "user_id": "0125760a-6810-11e9-84c0-42010aa80029",
      "platform": "app_store_ios",
      "comment": "Purchase in App Store",
      "items": [
        {
          "sku": "boots_1",
          "quantity": 5
        },
        {
          "sku": "crystal_pack_1",
          "quantity": 3
        }
      ],
      "order_id": 4125,
      "external_purchase_id": "MS6TGW7023",
      "external_purchase_date": "2020-01-25T05:00:00+05:00",
      "amount": "3.99",
      "currency": "USD"
    },
    {
      "user_id": "a7d10a4e-3f68-43cc-a6b2-893d2c68fd14",
      "platform": "google_play",
      "comment": "Purchase in Google Play",
      "items": [
        {
            "sku": "helmet_1",
          "quantity": 2
        },
        {
            "sku": "minigun_1",
          "quantity": 3
        }
      ],
      "order_id": 4126,
      "external_purchase_id": "GPA.3357-9348-5932-89841",
      "external_purchase_date": "2020-02-14T05:00:00+05:00",
      "amount": "1.99",
      "currency": "EUR"
    }
  ]
}

Get User’s Inventory

Get user’s inventory API 메소드를 구현하여 구매 후 사용자 인벤토리에 추가된 아이템 목록 가져오기.

요청

var data = null;

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("GET", "https://store.xsolla.com/api/v2/project/44056/user/inventory/items");
xhr.setRequestHeader("authorization", "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE5NjIyMzQwNDgsImlzcyI6Imh0dHBzOi8vbG9naW4ueHNvbGxhLmNvbSIsImlhdCI6MTU2MjE0NzY0OCwidXNlcm5hbWUiOiJ4c29sbGEiLCJ4c29sbGFfbG9naW5fYWNjZXNzX2tleSI6IjA2SWF2ZHpDeEVHbm5aMTlpLUc5TmMxVWFfTWFZOXhTR3ZEVEY4OFE3RnMiLCJzdWIiOiJkMzQyZGFkMi05ZDU5LTExZTktYTM4NC00MjAxMGFhODAwM2YiLCJlbWFpbCI6InN1cHBvcnRAeHNvbGxhLmNvbSIsInR5cGUiOiJ4c29sbGFfbG9naW4iLCJ4c29sbGFfbG9naW5fcHJvamVjdF9pZCI6ImU2ZGZhYWM2LTc4YTgtMTFlOS05MjQ0LTQyMDEwYWE4MDAwNCIsInB1Ymxpc2hlcl9pZCI6MTU5MjR9.GCrW42OguZbLZTaoixCZgAeNLGH2xCeJHxl8u8Xn2aI");

xhr.send(data);

응답

{
  "items": [
    {
      "description": "Conquer your foes with vindication using the Basic Blaster! ",
      "image_url": "https://cdn.xsolla.net/img/misc/images/0c59a7698d4f66c1008b27ee752089b7.png",
      "instance_id": null,
      "long_description": "Conquer your foes with vindication using the Basic Blaster! Conquer your foes with vindication using the Basic Blaster! ",
      "name": "Xsolla Basic Blaster 1",
      "quantity": 22,
      "sku": "gun_1",
      "type": "virtual_good"
    },
    {
      "description": "Protect your noggin' with style",
      "image_url": "https://cdn.xsolla.net/img/misc/images/b79342cdf24f0f8557b63c87e8326e62.png",
      "instance_id": null,
      "long_description": "merchant_virtual_items_virtual_item_long_description_159429",
      "name": "Xsolla Helmet",
      "quantity": 18,
      "sku": "helmet_1",
      "type": "virtual_good"
    }
  ]
}

Get User’s Virtual Balance

Get user’s virtual balance API 메소드를 구현하여 현재 사용자의 가상 화폐 잔고 정보를 가져오기.

요청

var data = null;
var xhr = new XMLHttpRequest();
xhr.withCredentials = true;
xhr.addEventListener("readystatechange", function () {
    if (this.readyState === this.DONE) {
        console.log(this.responseText);
    }
});
xhr.open("GET", "https://store.xsolla.com/api/v2/project/44056/user/virtual_currency_balance");
xhr.setRequestHeader("authorization", "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE5NjIyMzQwNDgsImlzcyI6Imh0dHBzOi8vbG9naW4ueHNvbGxhLmNvbSIsImlhdCI6MTU2MjE0NzY0OCwidXNlcm5hbWUiOiJ4c29sbGEiLCJ4c29sbGFfbG9naW5fYWNjZXNzX2tleSI6IjA2SWF2ZHpDeEVHbm5aMTlpLUc5TmMxVWFfTWFZOXhTR3ZEVEY4OFE3RnMiLCJzdWIiOiJkMzQyZGFkMi05ZDU5LTExZTktYTM4NC00MjAxMGFhODAwM2YiLCJlbWFpbCI6InN1cHBvcnRAeHNvbGxhLmNvbSIsInR5cGUiOiJ4c29sbGFfbG9naW4iLCJ4c29sbGFfbG9naW5fcHJvamVjdF9pZCI6ImU2ZGZhYWM2LTc4YTgtMTFlOS05MjQ0LTQyMDEwYWE4MDAwNCIsInB1Ymxpc2hlcl9pZCI6MTU5MjR9.GCrW42OguZbLZTaoixCZgAeNLGH2xCeJHxl8u8Xn2aI");
xhr.send(data);

응답

{
  "items": [
    {
      "amount": 683,
      "description": "Main in-game currency",
      "image_url": "https://cdn3.xsolla.com/img/misc/images/91df536af4616519f639664854c13d75.png",
      "name": "Crystals",
      "sku": "crystal",
      "type": "virtual_currency"
    },
    {
      "amount": 450,
      "description": "Money for in-store purchases",
      "image_url": "https://cdn3.xsolla.com/img/misc/images/fda67a3feedaa706b4e4ae05a9edd6ab.png",
      "name": "Gold",
      "sku": "gold",
      "type": "virtual_currency"
    }
  ]
}

Consume Item

사용자 인벤토리의 아이템을 소모하는 Consume item API 방식을 구현합니다.

요청

let data = JSON.stringify({
  "sku": "gun_1",
  "quantity": 1,
  "instance_id": null
});

let xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === this.DONE) {
    console.log(this.responseText);
  }
});

xhr.open("POST", "https://store.xsolla.com/api/v2/project/44056/user/inventory/item/consume");
xhr.setRequestHeader("content-type", "application/json");
xhr.setRequestHeader("authorization", "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJleHAiOjE5NjIyMzQwNDgsImlzcyI6Imh0dHBzOi8vbG9naW4ueHNvbGxhLmNvbSIsImlhdCI6MTU2MjE0NzY0OCwidXNlcm5hbWUiOiJ4c29sbGEiLCJ4c29sbGFfbG9naW5fYWNjZXNzX2tleSI6IjA2SWF2ZHpDeEVHbm5aMTlpLUc5TmMxVWFfTWFZOXhTR3ZEVEY4OFE3RnMiLCJzdWIiOiJkMzQyZGFkMi05ZDU5LTExZTktYTM4NC00MjAxMGFhODAwM2YiLCJlbWFpbCI6InN1cHBvcnRAeHNvbGxhLmNvbSIsInR5cGUiOiJ4c29sbGFfbG9naW4iLCJ4c29sbGFfbG9naW5fcHJvamVjdF9pZCI6ImU2ZGZhYWM2LTc4YTgtMTFlOS05MjQ0LTQyMDEwYWE4MDAwNCIsInB1Ymxpc2hlcl9pZCI6MTU5MjR9.GCrW42OguZbLZTaoixCZgAeNLGH2xCeJHxl8u8Xn2aI");

xhr.send(data);

오류 목록

사용자 혹은 사용자 인벤토리 오류:

코드 설명 동작
0401-5002 사용자 아이템 인벤토리 추가 시 잘못된 데이터 오류. item_id는 반드시 지정해야 하며 instance_id 혹은 quantity은 값을 입력해야 합니다null.
0401-5003 사용자 ID를 지정해야 합니다. 요구 사항에 사용자 ID가 있는지 확인하세요.
0401-5004 사용자 인벤토리에서 항목을 찾을 수 없습니다. 아이템이 인벤토리에 있는지 확인하세요. 인벤토리 상태는 Get user's inventory 메소드로 확인할 수 있습니다.
0401-5006 가상화폐 잔액이 부족하여 구매할 수 없습니다. -
0401-5007 비소모성 아이템을 소모하려 시도했습니다. -
0401-5008 사용자를 찾을 수 없습니다. -
0401-5009 서드파티 플랫폼 구매 시 purchase 통과 실패. -

아이템 관리 오류:

코드 설명 동작
0401-4001 기준에 의한 항목을 찾을 수 없습니다. 아이템 목록은 Get user's inventory 메소드로 확인할 수 있습니다.

스토어 API 관리 오류:

코드 설명 동작
0401-1101 서비스 사용 불가(잘못된 주소, 연결 문제). 시스템 상태는 status.xsolla.com에서 확인합니다; 엑솔라 고객 지원 팀 혹은 여러분의 계정 관리자에게 문의하세요
0401-1102 요청 항목 데이터 오류. API 스펙 확인.
0401-1016 요청 매개변수 중 하나에 인코딩 오류. 요청 콘텐츠 확인.
0401-1019 지원되지 않는 메소드. 요청 확인. 지원되는 메소드는 응답에서 찾을 수 있습니다.
0401-1020 판매자 키 해쉬 이용 시 인증 오류. API 키 확인.