Automatize a criação do catálogo e as atualizações usando a API
Você pode automatizar a criação e atualização do catálogo com chamadas da Shop Builder API. Com a automação, você pode manter seu catálogo atualizado sem gastar muito tempo nele.
Isso reduz o tempo necessário para gerenciar e atualizar:
- catálogos que contêm diversos itens
- preços locais
Para manter o engajamento do usuário, é importante manter o catálogo de itens atualizado no lado Xsolla depois da criação. Recomendamos atualizar o catálogo no lado Xsolla quando as atualizações ocorrerem do seu lado, tal como ao adicionar itens ou alterar preços.
Você pode:
A autorização básica é usada para chamadas de API para criar e atualizar itens e promoções. Passe o Authorization:Basic <your_authorization_basic_key>, onde <your_authorization_basic_key> é o par merchant ID:API key codificado de acordo com o padrão Base64. Vá para a Conta de Distribuidor para encontrar estes parâmetros:
- O Merchant ID é exibido:
- Na seção Company settings > Company.
- No URL na barra de endereços do navegador em qualquer página da Conta de Distribuidor. O URL tem o seguinte formato:
https://publisher.xsolla.com/<merchant_id>/.
- A API key é mostrada na Conta de Distribuidor apenas uma vez, durante a criação, e deve ser armazenada por você. Você pode criar uma nova chave na seguinte seção:
Criação e atualização de itens
A Xsolla suporta os seguintes tipos de itens de jogo:
- itens virtuais
- moedas virtuais
- pacotes de moedas virtuais
- conjuntos
Para simplificar a integração (por exemplo, em aplicativos móveis), você pode usar itens virtuais — um tipo universal para implementar qualquer lógica de compra no jogo. Isso vai unificar o processamento de dados e evitar a redundância na sua arquitetura de catálogos.
Se você precisar criar diversos itens, você pode criar um script que chama o método API do tipo de item necessário diversas vezes.
A lista de parâmetros retornada em resposta às solicitações de itens difere da lista de parâmetros que você precisa passar ao atualizar o catálogo. Além dos parâmetros necessários e atualizados, passe os parâmetros na chamada de atualização de itens que são retornados em resposta à solicitação dos itens.
Exemplo:
Na chamada Obter item virtual, um objeto
Para adicionar itens ao catálogo, use as seguintes chamadas de API:
Para atualizar o catálogo:
- Obtenha dados do catálogo com as seguintes chamadas de API:
- Passe novos valores de parâmetros com as seguintes chamadas de API:
Script para a criação automática de itens via API
Se você precisa criar diversos itens com base nos dados do seu sistema, você pode automatizar esse processo usando a API.
Você precisa:
- Exportar os dados do item do seu sistema.
- Transforme os dados exportados em um formato que corresponda à chamada API do tipo de item necessário.
- Crie um script que chama o método API necessário para cada item na exportação:
Se você quiser usar grupos de itens, crie-os antecipadamente pela Conta de Distribuidor.
Se quiser usar múltiplos tipos de itens, eles devem ser criados na seguinte ordem:
- grupos de itens na Conta de Distribuidor.
- Moedas virtuais.
- Itens virtuais.
- Pacotes de moedas virtuais.
- Conjuntos.
Abaixo está um exemplo de um script que chama repetidamente o método Obter pedido para criar itens virtuais.
O script é desenvolvido usando JavaScript e o tempo de execução do JavaScript — Node.js.
- Importe a função
fetchdo módulo“node-fetch”para enviar solicitações ao servidor Xsolla.
- javascript
1import fetch from "node-fetch";
- Defina as constantes necessárias para solicitar a autorização. Em vez de
<your project_id from PA>e<your api key from PA>, insira seus valores no ID de projeto e chave API, que será codificado usando Base64 para o uso subsequente nas solicitações API.
- javascript
1const projectId = <your project_id from PA>;
2
3const apiKey = <your api key from PA>;
4
5const buff = new Buffer(`${projectId}:${apiKey}`);
6
7const basicAuth = buff.toString('base64')
- Implemente um mecanismo de atraso ao enviar solicitações para evitar exceder os limites de taxa da API. Você pode:
- Usar a função de ajuda
sleeppara determinar um atraso fixo entre as solicitações. - Usar a função de ajuda
delaypara implementar um atraso exponencial. Neste caso, o tempo de espera entre as solicitações repetidas aumenta após cada erro429 Too Many Requests, com um valor aleatório adicional (jitter) adicionado para distribuir a carga.
- Usar a função de ajuda
- javascript
1function sleep(ms) {
2
3 return new Promise(resolve => setTimeout(resolve, ms));
4
5}
Opção de atraso exponencial:
- javascript
1/** Pause for the specified number of milliseconds */
2function delay(ms) {
3 return new Promise((resolve) => setTimeout(resolve, ms));
4}
5
6/**
7 * A fetch wrapper that handles HTTP 429 responses:
8 * - pure exponential backoff with jitter (ignores Retry-After);
9 * - limited number of retry attempts.
10 */
11async function fetchWithRateLimit(
12 url,
13 options = {},
14 {
15 maxAttempts = 4, // 1 initial attempt + 3 retries (balanced approach)
16 baseDelayMs = 1000, // 1 second base delay (15x the 67ms interval for 15 RPS)
17 factor = 1.5, // gentler backoff multiplier (1s → 1.5s → 2.25s → 3.4s)
18 maxDelayMs = 4000, // 4 seconds max delay (prevents excessive waiting)
19 jitterMs = 300 // 300ms random jitter (spreads retries without long delays)
20 } = {}
21) {
22 let attempt = 0;
23
24 while (true) {
25 attempt += 1;
26 const res = await fetch(url, options);
27
28 if (res.status !== 429) return res;
29
30 // 429: calculate pause (exponential backoff + jitter)
31 const backoff = Math.min(
32 Math.floor(baseDelayMs * Math.pow(factor, attempt - 1)),
33 maxDelayMs
34 );
35 const jitter = Math.floor(Math.random() * (jitterMs + 1)); // 0..jitterMs
36 const waitMs = backoff + jitter;
37
38 if (attempt >= maxAttempts) {
39 // retry limit reached — return the last response
40 return res;
41 }
42
43 await delay(waitMs);
44 }
45}
- Implemente a função
getItems, que é específica ao seu sistema, para receber dados de itens do seu sistema.
- javascript
1async function getItems() {
2
3 // receive items from the original system or read from a pre-prepared file
4
5 return items;
6
7}
- Implemente a função
prepareData, que é específica ao seu sistema, para formatar os dados do item de acordo com o formato de dados na chamada de API Obter pedido.
- javascript
1function prepareData(items) {
2
3 // format items in accordance with API requirements
4
5 return formattedItems;
6
7}
- Adicione a função
createItem, que envia uma solicitaçãoPOSTà API Xsolla para criar um item virtual.
- javascript
1async function createItem(item) {
2
3 const url = `https://store.xsolla.com/api/v2/project/${projectId}/admin/items/virtual_items`;
4
5
6
7 return await fetch(url, {
8
9 method: "POST",
10
11 headers: {
12
13 Authorization: `Basic ${basicAuth}`,
14
15 "Content-Type": "application/json"
16
17 },
18
19 body: JSON.stringify(item),
20
21 });
22
23}
- Adicione a função
checkItemExist, que verifica se um item virtual com um SKU especificado existe. A função envia uma solicitaçãoGETà API Xsolla:- Se uma resposta com um código HTTP
404for recebida, o item com o SKU especificado não foi encontrado, e precisa ser criado. - Se uma resposta com um código HTTP
200for recebido, o item com o SKU especificado foi encontrado e não precisa ser criado.
- Se uma resposta com um código HTTP
- javascript
1async function checkItemExist(sku) {
2
3 const url = `https://store.xsolla.com/api/v2/project/${projectId}/admin/items/virtual_items/sku/${sku}`;
4
5 const response = await fetch(url, {
6
7 method: "GET",
8
9 headers: {
10
11 Authorization: `Basic ${basicAuth}`
12
13 }
14
15 });
16
17 return response.status !== 404;
18
19}
- Adicione a função
createItems, que passa pela lista de itens e verifica se há um item com um SKU do seu sistema no lado Xsolla. Se não houver um item com esse SKU, a função o cria. A informação de progresso é exibida no console.
- javascript
1async function createItems(items) {
2
3 let success = 0;
4
5 let alreadyCreated = 0;
6
7 for (let i = 0; i < items.length; i++) {
8
9 const item = items[i];
10
11 if (item['sku'] === undefined) {
12
13 console.log(`${i} Field "sku" not specified`);
14
15 continue;
16
17 }
18
19 const sku = item['sku'];
20
21 if (await checkItemExist(sku)) {
22
23 console.log(`${i} Item with sku "${sku}" already created`);
24
25 alreadyCreated++;
26
27 continue;
28
29 }
30
31 const response = await createItem(item);
32
33 if (response.status === 201) {
34
35 console.log(`${i} Item with sku "${sku}" successfully created`)
36
37 success++;
38
39 } else {
40
41 const jsonData = await response.json();
42
43 console.log(`${i} An error occurred while creating the items with sku "${sku}"`);
44
45 console.log(jsonData);
46
47 }
48
49 // add a delay so as not to run into rate limits
50
51 await sleep(500);
52
53 }
54
55 console.log(`${success} items out of ${items.length} created. ${alreadyCreated} items already existed`);
56
57}
- Adicione a função
runque chama todas as funções na ordem correta.
- javascript
1async function run() {
2
3 const items = await getItems();
4
5 const formattedItems = prepareData(items);
6
7 await createItems(formattedItems);
8
9}
O código completo:
Encontrou um erro de texto ou digitação? Selecione o texto e pressione Ctrl+Enter.