Automatisez la création et les mises à jour du catalogue via API
Vous pouvez automatiser la création et les mises à jour du catalogue via les appels Shop Builder API. L’automatisation permet de maintenir le catalogue à jour sans y consacrer beaucoup de temps.
Cela réduit le temps nécessaire à la maintenance et à la mise à jour des :
- catalogues contenant beaucoup d’objets
- prix locaux
Pour maintenir l’engagement des utilisateurs, il est crucial de garder le catalogue des objets à jour côté Xsolla après sa création. Nous recommandons de procéder à ces mises à jour pour refléter chaque modification apportée de votre côté, comme l’ajout de nouveaux objets ou la modification des prix.
Vous pouvez :
Une autorisation de base est requise pour utiliser les appels API de création et de mise à jour des objets et des promotions. Passez le code Authorization:Basic <your_authorization_basic_key>, où <your_authorization_basic_key> est la paire merchant ID:API key encodée conformément à la norme Base64. Accédez au Compte éditeur pour trouver les paramètres suivants :
- Merchant ID est affiché :
- Dans la section Company settings > Company ;
- Dans l'URL de la barre d'adresse du navigateur sur n'importe quelle page du Compte éditeur. L'URL est au format suivant :
https://publisher.xsolla.com/<merchant_id>/.
- L'API key ne s'affiche dans le Compte éditeur qu'une seule fois lors de sa création, vous devez donc la conserver de votre côté. Vous pouvez créer une nouvelle clé dans les sections suivantes :
Création et mise à jour des objets
Xsolla prend en charge les types d’objets en jeu suivants :
- objets virtuels
- monnaies virtuelles
- packages de monnaie virtuelle
- lots
Pour simplifier l’intégration (par exemple dans les applications mobiles), vous pouvez utiliser des objets virtuels, un type universel permettant d’implémenter toute logique d’achat dans le jeu. Cela unifie le traitement des données et évite les redondances dans l’architecture du catalogue.
Pour créer de nombreux objets, créez un script qui appelle la méthode API du type d’objet requis le nombre de fois nécessaire.
La liste des paramètres renvoyés en réponse à la demande des objets diffère de la liste des paramètres que vous devez passer lors de la mise à jour du catalogue. Outre les paramètres requis et mis à jour, passez dans l’appel de mise à jour des objets les paramètres renvoyés en réponse à la demande des objets.
Exemple :
Dans l’appel Lire un objet virtuel, l’objet
Pour ajouter des objets au catalogue, utilisez les appels API suivants :
Pour mettre à jour le catalogue :
- Récupérez les données du catalogue via les appels API suivants :
- Passez les nouvelles valeurs des paramètres via les appels API suivants :
Script pour la création automatique d'objets via API
Pour créer de nombreux objets sur la base de données de votre système, vous pouvez utiliser l’automatisation à l’aide de l’API.
Vous devez :
- Exporter les données sur les objets depuis votre système.
- Convertir les données exportées dans un format correspondant à celui des données de l’appel API pour le type d’objet requis.
- Créer un script qui appelle la méthode API requise pour chaque objet exporté :
Si vous souhaitez utiliser des groupes d’objets, créez-les à l’avance dans le Compte éditeur.
Si vous souhaitez utiliser plusieurs types d’objets, ceux-ci doivent être créés dans l’ordre suivant :
- Groupes d’objets dans le Compte éditeur ;
- Monnaies virtuelles ;
- Objets virtuels ;
- Packages de monnaie virtuelle ;
- Lots.
Voici un exemple de script qui appelle de manière répétée la méthode Créer un objet virtuel afin de créer des objets virtuels.
Le script est développé en utilisant JavaScript et le moteur d’exécution JavaScript — Node.js.
- Importez la fonction
fetchdu module“node-fetch”pour envoyer des requêtes HTTP au serveur Xsolla.
- javascript
1import fetch from "node-fetch";
- Définissez les constantes nécessaires à l’autorisation de la requête. Au lieu de
<your project_id from PA>et<your api key from PA>, insérez vos valeurs pour l’ID de projet et la clé API, qui seront encodées en Base64 pour une utilisation ultérieure dans les requêtes 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')
- Pour éviter de dépasser les limites de débit de l’API, implémentez un mécanisme de délai entre les requêtes. Vous pouvez :
- Utiliser la fonction d’aide
sleeppour définir un délai fixe entre chaque requête. - Utiliser la fonction d’aide
delaypour implémenter un backoff exponentiel. Dans ce cas, le délai entre les tentatives augmente après chaque erreur429 Too Many Requests, avec un temps d’attente aléatoire supplémentaire (jitter) pour mieux répartir la charge.
- Utiliser la fonction d’aide
- javascript
1function sleep(ms) {
2
3 return new Promise(resolve => setTimeout(resolve, ms));
4
5}
Option de backoff exponentiel :
- 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}
- Implémentez la fonction
getItems, spécifique à votre système, pour récupérer les données des objets depuis votre système.
- 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}
- Implémentez la fonction
prepareData, spécifique à votre système, pour formater les données des objets conformément au format de données dans l’appel API Créer un objet virtuel.
- javascript
1function prepareData(items) {
2
3 // format items in accordance with API requirements
4
5 return formattedItems;
6
7}
- Ajoutez la fonction
createItem, qui envoie une requêtePOSTà l’API Xsolla pour créer un objet virtuel.
- 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}
- Ajoutez la fonction
checkItemExist, qui vérifie l’existence d’un objet virtuel avec une UGS spécifique. Cette fonction envoie une requêteGETà l’API Xsolla :- Si la réponse retourne un code HTTP
404, l’objet avec l’UGS spécifiée n’est pas trouvé et doit être créé ; - Si la réponse retourne un code HTTP
200, l’objet avec l’UGS spécifiée est trouvé et n’a pas besoin d’être créé.
- Si la réponse retourne un code 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}
- Ajoutez la fonction
createItems, qui parcourt la liste des objets et vérifie l’existence du côté de Xsolla d’un objet avec une UGS de votre système. Si aucun objet avec une telle UGS n’est trouvé, la fonction le crée. Les informations de progression s’affichent dans la 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}
- Ajouter la fonction
runqui appelle toutes les fonctions ci-dessus dans le bon ordre.
- javascript
1async function run() {
2
3 const items = await getItems();
4
5 const formattedItems = prepareData(items);
6
7 await createItems(formattedItems);
8
9}
Le code complet :
Faute de frappe ou autre erreur dans le texte ? Sélectionnez le texte concerné et appuyez sur Ctrl+Entrée.