Katalogerstellung und ‑aktualisierung mithilfe von API automatisieren
Sie können die Katalogerstellung und ‑aktualisierung mithilfe der Shop Builder API automatisieren. So können Sie Ihren Katalog ohne viel Zeitaufwand auf dem neuesten Stand halten.
Dadurch reduziert sich der Zeitaufwand für Wartung und Aktualisierung von:
- Katalogen mit einer Vielzahl von Artikeln
- länderspezifischen Preisen
Damit die Nutzerinteraktionsrate nicht einbricht, ist es wichtig, den Artikelkatalog nach der Erstellung aufseiten von Xsolla aktuell zu halten. Wir empfehlen, den Katalog bei Xsolla zu aktualisieren, wenn Sie Ihrerseits Aktualisierungen vorgenommen haben, z. B. Artikel hinzugefügt oder Preise geändert haben.
Sie können:
Die Basisauthentifizierung wird für API-Aufrufe genutzt, um Artikel und Werbeaktionen zu erstellen und zu aktualisieren. Übermitteln Sie Authorization:Basic <your_authorization_basic_key>, wobei <your_authorization_basic_key> das gemäß dem Base64-Standard kodierte Paar Händler-ID:API-Schlüssel ist. Die Parameter finden Sie im Kundenportal:
- Die Händler-ID finden Sie:
- unter Firmeneinstellungen > Firma.
- in der URL in der Adresszeile des Browsers auf einer beliebigen Seite im Kundenportal. Die URL weist das folgende Format auf:
https://publisher.xsolla.com/<merchant_id>/.
- Der API-Schlüssel wird im Kundenportal nur einmal angezeigt, nämlich dann, wenn er erstellt wird. Sie sind selbst dafür verantwortlich, den Schlüssel zu speichern. Einen neuen Schlüssel können Sie in den folgenden Abschnitten erstellen:
Artikel erstellen und aktualisieren
Xsolla unterstützt die folgenden Arten von Ingame-Items:
- virtuelle Gegenstände
- virtuelle Währungen
- virtuelle Währungspakete
- Bundles
Zur Vereinfachung der Integration (beispielsweise in mobilen Anwendungen) können Sie virtuelle Gegenstände verwenden. Hierbei handelt es sich um einen universellen Typ zur Implementierung beliebiger Ingame-Kauflogiken. Dies vereinheitlicht die Datenverarbeitung und vermeidet Redundanzen in Ihrer Katalogarchitektur.
Wenn Sie eine Vielzahl von Artikeln erstellen müssen, können Sie ein Skript erstellen, das die API-Methode des gewünschten Artikeltyps dementsprechend oft aufruft.
Die Liste der Parameter, die als Antwort auf die Artikelabfrage zurückgegeben wird, unterscheidet sich von der Liste der Parameter, die Sie beim Aktualisieren des Katalogs übermitteln müssen. Übermitteln Sie zusätzlich zu den erforderlichen und aktualisierten Parametern im Artikelaktualisierungsaufruf die Parameter, die als Antwort auf die Artikelanfrage zurückgegeben werden.
Beispiel:
Im Aufruf Virtuelle Gegenstände abrufen wird das
Artikel dem Katalog hinzuzufügen, ist mit den folgenden API-Aufrufe möglich:
- Virtuellen Gegenstand erstellen
- Virtuelle Währung erstellen
- Virtuelles Währungspaket erstellen
- Bundle erstellen
So aktualisieren Sie den Katalog:
- Daten aus dem Katalog abzurufen, ist mit den folgenden API-Aufrufen möglich:
- Neue Parameterwerte zu übermitteln, ist mit den folgenden API-Aufrufen möglich:
Skript für die automatische Erstellung von Artikeln über die API
Wenn Sie eine Vielzahl von Artikeln auf der Grundlage von Daten aus Ihrem System erstellen müssen, können Sie den Vorgang mithilfe der API automatisieren.
Dazu müssen Sie:
- die Artikeldaten aus Ihrem System exportieren,
- Konvertieren Sie die exportierten Daten in ein Format, das dem Datenformat des API-Aufrufs des gewünschten Artikeltyps entspricht.
- ein Skript erstellen, das die erforderliche API-Methode für jeden exportierten Artikel aufruft:
Wenn Sie Gegenstandsgruppen verwenden möchten, müssen Sie diese im Voraus im Kundenportal erstellen.
Wenn Sie mehrere Artikeltypen verwenden möchten, sollten diese in der folgenden Reihenfolge erstellt werden:
- Gegenstandsgruppen im Kundenportal
- virtuelle Währungen
- virtuelle Gegenstände
- virtuelle Währungspakete
- Bundles
Nachfolgend sehen Sie ein Beispielskript, das die Methode Virtuellen Gegenstand erstellen wiederholt aufruft, um virtuelle Gegenstände zu erstellen.
Das Skript wurde mit JavaScript und Node.js, der JavaScript-Laufzeitumgebung, entwickelt.
- Importieren Sie die
fetch-Funktion des Moduls“node-fetch”, um HTTP-Anfragen an den Xsolla-Server senden zu können.
- javascript
1import fetch from "node-fetch";
- Legen Sie die für die Anfrageautorisierung benötigten Konstanten fest. Fügen Sie anstelle von
<your project_id from PA>und<your api key from PA>Ihre Werte für die Projekt-ID und den API-Schlüssel ein, die für die spätere Verwendung in API-Anfragen mit Base64 kodiert werden.
- 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')
- Implementieren Sie einen Mechanismus, bei dem Anfragen verzögert versendet werden. So lässt sich eine Überschreitung der API-Ratenbegrenzungen vermeiden. Sie haben folgende Möglichkeiten:
- Mit der Hilfsfunktion
sleeplässt sich eine feste Verzögerung zwischen den Anfragen festlegen. - Mit der Hilfsfunktion
delaylässt sich ein exponentielles Backoff implementieren. Hierbei erhöht sich die Wartezeit zwischen aufeinanderfolgenden Anfragen nach jedem Fehler (429 Too Many Requests) um einen zusätzlichen Zufallswert (Jitter), um die Auslastung zu reduzieren.
- Mit der Hilfsfunktion
- javascript
1function sleep(ms) {
2
3 return new Promise(resolve => setTimeout(resolve, ms));
4
5}
Exponentielles Backoff:
- 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}
- Implementieren Sie die Funktion
getItems, um Artikeldaten aus Ihrem System abzurufen.
- 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}
- Implementieren Sie die für Ihr System spezifische Funktion
prepareData, um die Artikeldaten gemäß dem erforderlichen Datenformat des API-Aufrufs Virtuellen Gegenstand erstellen zu formatieren.
- javascript
1function prepareData(items) {
2
3 // format items in accordance with API requirements
4
5 return formattedItems;
6
7}
- Ergänzen Sie die Funktion
createItem. Diese Funktion sendet einePOST-Anfrage an die Xsolla-API, um einen virtuellen Gegenstand zu erstellen.
- 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}
- Ergänzen Sie die Funktion
checkItemExist, um zu prüfen, ob ein virtueller Gegenstand mit der angegebenen SKU existiert. Die Funktion sendet eineGET-Anfrage an die Xsolla-API:- Enthält die Antwort den HTTP-Statuscode
404, wurde der Gegenstand mit der angegebenen SKU nicht gefunden und muss erstellt werden. - Enthält die Antwort den HTTP-Statuscode
200, wurde der Gegenstand mit der angegebenen SKU gefunden und muss nicht erstellt werden.
- Enthält die Antwort den HTTP-Statuscode
- 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}
- Ergänzen Sie die Funktion
createItems, die die Liste der Gegenstände durchgeht und prüft, ob es aufseiten von Xsolla einen Gegenstand mit einer SKU aus Ihrem System gibt. Wurde kein Gegenstand mit einer solchen SKU gefunden, erstellt die Funktion einen Gegenstand. Der Fortschritt wird in der Konsole angezeigt.
- 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}
- Ergänzen Sie die Funktion
run. Diese Funktion ruft alle oben genannten Funktionen in der richtigen Reihenfolge auf.
- javascript
1async function run() {
2
3 const items = await getItems();
4
5 const formattedItems = prepareData(items);
6
7 await createItems(formattedItems);
8
9}
Der vollständige Code:
Haben Sie einen Tippfehler oder einen anderen Textfehler gefunden? Wählen Sie den Text aus und drücken Sie Strg+Eingabe.