Automatizar la creación y actualización del catálogo mediante API
Puede automatizar la creación y actualización del catálogo con llamadas a la Shop Builder API calls. Con la automatización, puede mantener su catálogo actualizado sin invertir mucho tiempo.
Esto reduce el tiempo necesario para mantener y actualizar:
- catálogos que contienen muchos artículos
- precios locales
Para mantener el compromiso de los usuarios, es esencial mantener actualizado el catálogo de artículos en el lado de Xsolla después de crearlo. Recomendamos actualizar el catálogo en el lado de Xsolla cuando se produzcan actualizaciones en su lado, como cuando se añadan artículos o se cambien los precios.
Puede:
La autorización básica se utiliza para las llamadas API. Introduzca la Authorization:Basic <your_authorization_basic_key>, en la cual <your_authorization_basic_key> es el par Merchant ID:clave de API codificado según el estándar Base64. Vaya a Cuenta del editor para encontrar estos parámetros:
- Merchant ID se muestra:
- En Company settings > Company.
- En la URL de la barra de direcciones del navegador de cualquier página de Cuenta del editor. La URL tiene el siguiente formato:
https://publisher.xsolla.com/<merchant_id>/.
- API key se muestra en Cuenta del editor solo una vez al crearla y deberá guardarla por su parte. Puede crear una nueva clave en la siguiente sección:
Crear y actualizar artículos
Xsolla admite los siguientes tipos de artículos internos del juego:
- artículos virtuales
- monedas virtuales
- paquetes de moneda virtual
- lotes
Para simplificar la integración (p. ej., en aplicaciones móviles), puede utilizar artículos virtuales, un tipo universal para implementar cualquier lógica de compra dentro del juego. Esto unificará el procesamiento de datos y evitará la redundancia en la arquitectura de su catálogo.
Si necesita crear varios artículos, puede crear un script que invoque el método API del tipo de artículo requerido el número de veces que sea necesario.
La lista de parámetros que se devuelve como respuesta a la solicitud de artículos es diferente de la lista de parámetros que debe transmitir al actualizar el catálogo. Además de los parámetros requeridos y actualizados, transmita los parámetros en la llamada de actualización de artículos que se devuelven como respuesta a la solicitud de artículos.
Ejemplo:
En la llamada Obtener artículo virtual, se devuelve un objeto
Para añadir artículos al catálogo, emplee las siguientes llamadas API:
Para actualizar el catálogo:
- Obtenga datos del catálogo con las siguientes llamadas API:
- Transmita los nuevos valores de parámetros con las siguientes llamadas API:
Script para la creación automática de artículos mediante API
Si tiene que crear numerosos artículos a partir de los datos de su sistema, puede automatizar este proceso mediante la API.
Tendrá que:
- Exportar los datos del artículo desde su sistema.
- Transforme los datos exportados a un formato que coincida con el formato de datos de la llamada API del tipo de artículo requerido.
- Para cada artículo de la exportación, cree un script que invoque el método API requerido:
Si quiere utilizar grupos de artículos, créelos antes en Cuenta del editor.
Si desea usar varios tipos de artículos, deben crearse en el siguiente orden:
- Grupos de artículos en Cuenta del editor.
- Monedas virtuales.
- Artículos virtuales.
- Paquetes de moneda virtual.
- Lotes.
A continuación, presentamos un ejemplo de script que invoca repetidamente el método Crear artículo virtual para crear artículos virtuales.
El script se desarrolla utilizando JavaScript y el tiempo de ejecución de JavaScript: Node.js.
- Importe la función
fetchdel módulo“node-fetch”para enviar solicitudes HTTP al servidor de Xsolla.
- javascript
1import fetch from "node-fetch";
- Establezca las constantes necesarias para la autorización de la solicitud. En lugar de
<your project_id from PA>y<your api key from PA>, ingrese sus valores para el ID del proyecto y la clave de API, que se codificarán usando Base64 para su posterior uso en las solicitudes a la 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 un mecanismo de retraso al enviar solicitudes para evitar superar los límites de frecuencia de la API. Puede:
- Usar la función de ayuda
sleeppara establecer un retraso fijo entre solicitudes. - Usar la función de ayuda
delaypara implementar el retroceso exponencial. En este caso, el tiempo de espera entre solicitudes repetidas aumenta después de cada error429 Too Many Requests, con un valor aleatorio adicional (jitter) añadido para distribuir la carga.
- Usar la función de ayuda
- javascript
1function sleep(ms) {
2
3 return new Promise(resolve => setTimeout(resolve, ms));
4
5}
Opción de retroceso 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 la función
getItems, específica de su sistema, para recuperar los datos de los artículos desde su 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 la función
prepareData, específica de su sistema, para dar formato a los datos del artículo según el formato de datos definido en la llamada API Crear artículo virtual.
- javascript
1function prepareData(items) {
2
3 // format items in accordance with API requirements
4
5 return formattedItems;
6
7}
- Agregue la función
createItem, la cual envía una solicitudPOSTa la API de Xsolla para crear un artículo 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}
- Agregue la función
checkItemExist, la cual comprueba si existe un artículo virtual con un código de artículo (SKU) especificado. La función envía una solicitudGETa la API de Xsolla:- Si se recibe una respuesta con un código HTTP
404, el artículo con el SKU especificado no se localiza y hay que crearlo. - Si se recibe una respuesta con un código HTTP
200, el artículo con el SKU especificado se localiza y no hay que crearlo.
- Si se recibe una respuesta con un 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}
- Agregue la función
createItems, la cual analiza la lista de artículos y comprueba si existe un artículo con un código de artículo (SKU) de su sistema en el lado de Xsolla. Si no hay ningún artículo con ese SKU, la función lo crea. La información del progreso se visualiza en la consola.
- 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}
- Agregue la función
runque invoca todas las funciones anteriores en el orden correcto.
- javascript
1async function run() {
2
3 const items = await getItems();
4
5 const formattedItems = prepareData(items);
6
7 await createItems(formattedItems);
8
9}
El código completo
¿Has encontrado una errata u otro error de texto? Selecciona el texto y pulsa Ctrl+Intro.