In-Game Store / Как автоматизировать обновление каталога
  На главную

In-Game Store

Как автоматизировать обновление каталога

Вы можете автоматизировать создание и обновление каталога, используя методы In-Game Store API. Благодаря автоматизации вы сможете поддерживать каталог в актуальном состоянии, не тратя на это много времени. Автоматизация каталога позволяет создавать и обновлять товары и акции и импортировать данные из внешних систем.

Это упростит и ускорит работу:

  • с каталогом, в котором содержится большое количество товаров;
  • большим количеством акций любого типа;
  • страноцентричными ценами.

Внимание

Чтобы поддерживать активность пользователей, важно обеспечивать актуальность каталога товаров на стороне Xsolla после его создания. Мы рекомендуем обновлять каталог на стороне Xsolla при обновлениях на вашей стороне, например при добавлении товаров или изменении цен.

Вы можете:

Методы API создания и обновления товаров и акций требуют базовой аутентификации. Передайте в запросе параметр Authorization:Basic <your_authorization_basic_key>, где <your_authorization_basic_key> — пара ID продавца:ключ API, закодированная по стандарту Base64. Значения параметров вы можете найти в Личном кабинете:

  • ID продавца указан:
    • В разделе Настройки компании > Компания.
    • Aдресной строке браузера на любой странице Личного кабинета. URL-адрес имеет вид https:​//publisher.xsolla.com/<merchant ID>/<Publisher Account section>.

  • Ключ API отображается в Личном кабинете только при создании и должен храниться на вашей стороне. Создать ключ можно в разделах:
    • Настройки компании > Ключи API;
    • Настройки проекта > Ключи API.

Создание и обновление товаров

Если вам нужно создать большое количество товаров, вы можете создать скрипт, который вызовет метод API нужного типа товаров необходимое количество раз.

Внимание

Список параметров, который возвращается в ответе на запрос товаров, отличается от списка параметров, который вам требуется передать при обновлении каталога. Кроме обязательных и обновленных параметров, передайте в методе обновления товаров те параметры, которые вернулись в ответе на запрос товаров.

Пример:

В методе Получение виртуального предмета вернулся объект limits с данными об ограничениях на пользователя. Если вы хотите обновить только цену или название товара, в методе Обновление виртуального предмета передайте текущие данные объекта limits. Если вы не передадите объект limits, данные об ограничениях удалятся при обновлении товара методом Обновление виртуального предмета.

Виртуальные предметы

Чтобы обновить каталог:

  1. Получите данные из каталога с помощью методов API Получение виртуального предмета или Получение списка всех виртуальных предметов.
  2. Передайте новые значения параметров с помощью метода API Обновление виртуального предмета.

Чтобы создать виртуальные предметы, воспользуйтесь методом API Создание виртуального предмета.

Виртуальная валюта

Чтобы обновить каталог:

  1. Получите данные из каталога с помощью метода API Получение списка виртуальных валют.
  2. Передайте новые значения параметров с помощью метода API Обновление виртуальной валюты.

Чтобы создать виртуальную валюту, воспользуйтесь методом API Создание виртуальной валюты.

Пакеты виртуальной валюты

Чтобы обновить каталог:

  1. Получите данные из каталога с помощью метода API Получение списка пакетов виртуальной валюты.
  2. Передайте новые значения параметров с помощью метода API Обновление пакета виртуальной валюты.

Чтобы создать пакет виртуальной валюты, воспользуйтесь методом API Создание пакета виртуальной валюты.

Бандлы

Чтобы обновить каталог:

  1. Получите данные из каталога с помощью метода API Получение списка бандлов.
  2. Передайте новые значения параметров с помощью метода API Обновление бандла.

Чтобы создать бандл, воспользуйтесь методом API Создание бандла.
Если вы хотите добавить в бандлы игровые ключи, региональные ограничения или цены, воспользуйтесь инструкцией.

Создание и обновление акций

Внимание
Список параметров, который возвращается в ответе при использовании методов API получения акций, отличается от списка параметров, который вы передаете в методах обновления акций. Кроме обязательных и обновленных параметров, передайте в методе обновления каталога те параметры, которые вернулись в ответе на запрос к методу получения акций.

Купоны

Примечание
Чтобы акции типа Купон работали корректно, сначала нужно создать акцию, а потом сгенерировать коды к этой акции.

Чтобы обновить акцию:

  1. Получите данные из каталога с помощью методов API Получение акции с купонами или Получение списка акций с купонами.
  2. Отправьте обновленные значения с помощью метода API Обновление акции с купонами.
  3. Активируйте акцию с помощью метода API Активация акции с купонами.

Чтобы создать акцию, воспользуйтесь методами API Создание акции с купонами для создания акции, затем Создание кода купона для создания собственных кодов купонов или Генерация кодов купонов для генерации случайных кодов купонов.
Чтобы деактивировать акцию, воспользуйтесь методом API Деактивация акции с купонами.

Промокоды

Примечание
Чтобы акции типа Промокод работали корректно, сначала нужно создать акцию, а потом сгенерировать коды к этой акции.

Чтобы обновить акцию:

  1. Получите данные из каталога с помощью методов API Получение акции с промокодами, или Получение списка акций с промокодами.
  2. Отправьте обновленные значения с помощью метода API Обновление акции с промокодами.
  3. Активируйте акцию с помощью метода API Активация акции с купонами.

Чтобы создать акцию, воспользуйтесь методами API Создание акции с промокодами для создания акции, затем Создание кода для акции с промокодами для создания собственных промокодов или Генерация кодов для акции с промокодами генерации случайных промокодов.
Чтобы деактивировать акцию, воспользуйтесь методом API Деактивация акции с промокодами.

Скидки

Чтобы обновить акцию:

  1. Получите данные из каталога с помощью методов API Получение акции со скидками или Получение списка акций со скидками.
  2. Отправьте обновленные значения с помощью метода API Обновление акции со скидками.
  3. Активируйте акцию с помощью метода API Активация акции.

Чтобы создать акцию, воспользуйтесь методом API Создание акции со скидками для товара.
Чтобы деактивировать акцию, воспользуйтесь методом API Деактивация акции.

Бонусы

Чтобы обновить акцию:

  1. Получите данные из каталога с помощью методов API Получение акции с бонусами или Получение списка акций с бонусами.
  2. Отправьте обновленные значения с помощью метода API Обновление акции с бонусами.
  3. Активируйте акцию с помощью метода API Активация акции.

Чтобы создать акцию, воспользуйтесь методом API Создание акции с бонусами.
Чтобы деактивировать акцию, воспользуйтесь методом API Деактивация акции.

Автоматическое создание товаров через API

Если вам нужно создать большое количество товаров на основе данных из вашей системы, вы можете автоматизировать этот процесс с помощью API.

Вам потребуется:

Если вы хотите использовать группы товаров, предварительно создайте их через интерфейс Личного кабинета.

Если вы хотите использовать несколько типов товаров, они должны быть созданы в следующем порядке:

  1. Группы товаров в Личном кабинете.
  2. Виртуальные валюты.
  3. Виртуальные предметы.
  4. Пакеты виртуальной валюты.
  5. Бандлы.

Далее рассмотрен пример скрипта, который многократно вызывает метод API Создание виртуального предмета для создания виртуальных предметов.

Скрипт разработан с применением JavaScript и среды выполнения JavaScript — Node.js.

  1. Импортируйте функцию fetch модуля “node-fetch” для отправки HTTP-запросов к серверу Xsolla.
Copy
Full screen
Small screen
import fetch from "node-fetch";
  1. Задайте константы, необходимые для авторизации запросов. Вместо <your project_id from PA> и <your api key from PA> подставьте ваши значения ID проекта и ключа API, которые будут закодированы по стандарту Base64 для последующего использования в API запросах.
Copy
Full screen
Small screen
const projectId = <your project_id from PA>;

const apiKey = <your api key from PA>;

const buff = new Buffer(`${projectId}:${apiKey}`);

const basicAuth = buff.toString('base64')
  1. Реализуйте вспомогательную функцию sleep, которая используется для создания задержки при отправке запросов. Это необходимо для того, чтобы не превышать ограничения частоты запросов к API.
Copy
Full screen
Small screen
function sleep(ms) {

   return new Promise(resolve => setTimeout(resolve, ms));

}
  1. Реализуйте функцию getItems, специфичную для вашей системы, которая позволит получать данные о товарах из вашей системы.
Copy
Full screen
Small screen
async function getItems() {

   // receive items from the original system or read from a pre-prepared file

   return items;

}
  1. Реализуйте функцию prepareData, специфичную для вашей системы, которая форматирует данные о товарах в соответствии с форматом данных в методе API Создание виртуального предмета.
Copy
Full screen
Small screen
function prepareData(items) {

   // format items in accordance with API requirements

   return formattedItems;

}
  1. Добавьте функцию createItem, которая отправляет POST-запрос к Xsolla API для создания виртуального предмета.
Copy
Full screen
Small screen
async function createItem(item) {

   const url = `https://store.xsolla.com/api/v2/project/${projectId}/admin/items/virtual_items`;



   return await fetch(url, {

       method: "POST",

       headers: {

           Authorization: "Basic " + basicAuth,

           "Content-Type": "application/json"

       },

       body: JSON.stringify(item),

   });

}
  1. Добавьте функцию checkItemExist, которая проверяет, существует ли виртуальный товар с заданным артикулом (SKU). Для этого функция отправляет GET-запрос к Xsolla API:
    • Если получен ответ с 404 HTTP-кодом, товар с заданным артикулом не найден, его требуется создать.
    • Если получен ответ с 200 HTTP-кодом, товар с заданным артикулом найден и его не требуется создавать.
Copy
Full screen
Small screen
async function checkItemExist(sku) {

   const url = `https://store.xsolla.com/api/v2/project/${projectId}/admin/items/virtual_items/sku/${sku}`;

   const response = await fetch(url, {

       method: "GET",

       headers: {

           Authorization: "Basic " + basicAuth

       }

   });

   return response.status !== 404;

}
  1. Добавьте функцию createItems, которая проходит по списку товаров, и проверяет, есть ли товар с артикулом из вашей системы на стороне Xsolla. Если товара с таким артикулом нет, функция создает его. Информация о прогрессе выводится в консоль.
Copy
Full screen
Small screen
async function createItems(items) {

   let success = 0;

   let alreadyCreated = 0;

   for (let i = 0; i < items.length; i++) {

       const item = items[i];

       if (item['sku'] === undefined) {

           console.log(`${i} Field "sku" not specified`);

           continue;

       }

       const sku = item['sku'];

       if (await checkItemExist(sku)) {

           console.log(`${i} Item with sku "${sku}" already created`);

           alreadyCreated++;

           continue;

       }

       const response = await createItem(item);

       if (response.status === 201) {

           console.log(`${i} Item with sku "${sku}" successfully created`)

           success++;

       } else {

           const jsonData = await response.json();

           console.log(`${i} An error occurred while creating the items with sku "${sku}"`);

           console.log(jsonData);

       }

       // add a delay so as not to run into rate limits

       await sleep(500);

   }

   console.log(`${success} items out of ${items.length} created. ${alreadyCreated} items already existed`);

}
  1. Добавьте функцию run, которая вызывает все вышеперечисленные функции в правильном порядке.
Copy
Full screen
Small screen
async function run() {

 const items = await getItems();

 const formattedItems = prepareData(items);

 await createItems(formattedItems);

}

Полный код:

Copy
Full screen
Small screen
import fetch from "node-fetch";

const projectId = <your project_id from PA>;
const apiKey = <your api key from PA>;
const buff = new Buffer(`${projectId}:${apiKey}`);
const basicAuth = buff.toString('base64')

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}

async function getItems() {
    // receive items from the original system or read from a pre-prepared file
    return items;
}

function prepareData(items) {
    // format items in accordance with API requirements
    return formatedItems;
}

async function createItem(item) {
    const url = `https://store.xsolla.com/api/v2/project/${projectId}/admin/items/virtual_items`;

    return await fetch(url, {
        method: "POST",
        headers: {
            Authorization: "Basic " + basicAuth,
            "Content-Type": "application/json"
        },
        body: JSON.stringify(item),
    });
}

async function isItemExisted(sku) {
    const url = `https://store.xsolla.com/api/v2/project/${projectId}/admin/items/virtual_items/sku/${sku}`;
    const response = await fetch(url, {
        method: "GET",
        headers: {
            Authorization: "Basic " + basicAuth
        }
    });
    return response.status !== 404;
}

async function createItems(items) {
    let success = 0;
    let alreadyCreated = 0;
    for (let i = 0; i < items.length; i++) {
        const item = items[i];
        if (item['sku'] === undefined) {
            console.log(`${i} Field "sku" not specified`);
            continue;
        }
        const sku = item['sku'];
        if (await isItemExisted(sku)) {
            console.log(`${i} Item with sku "${sku}" already created`);
            alreadyCreated++;
            continue;
        }
        const response = await createItem(item);
        if (response.status === 201) {
            console.log(`${i} Item with sku "${sku}" successfully created`)
            success++;
        } else {
            const jsonData = await response.json();
            console.log(`${i} An error occurred while creating the items with sku "${sku}"`);
            console.log(jsonData);
        }
        // add a delay so as not to run into rate limits
        await sleep(500);
    }
    console.log(`${success} items out of ${items.length} created. ${alreadyCreated} items already existed`);
}

async function run() {
  const items = await getItems();
  const formattedItems = prepareData(items);
  await createItems(formattedItems);
}

run(); 

Обновление с помощью импорта из внешних систем

Если вы используете внешние системы PlayFab или Google Play, вы можете импортировать данные из них. Для этого воспользуйтесь инструкцией.

Была ли статья полезна?
Спасибо!
Что может сделать страницу еще лучше? Сообщение
Жаль, что так произошло
Расскажите, почему статья не была полезна. Сообщение
Спасибо за обратную связь!
Ваши мысли и идеи помогут нам улучшить ваш пользовательский опыт.
Последнее обновление: 3 октября 2024

Нашли опечатку или ошибку в тексте? Выделите ее и нажмите Ctrl+Enter.

Сообщите о проблеме
Мы постоянно улучшаем качество нашей документации. Ваш отзыв поможет нам в этом.
Укажите email-адрес, чтобы мы могли связаться с вами
Спасибо за обратную связь!