如何自动化目录更新

通过In-Game Store API调用,您可以实现自动创建和更新目录。通过自动化,您无需花费大量时间即可让目录保持最新。目录自动化可以让您创建及更新商品和促销活动,并从外部系统导入数据。

自动化可以减少维护和更新以下项的时间:

  • 包含大量商品的目录
  • 任意类型的促销活动
  • 基于国家/地区的价格

注意

为保持用户参与度,创建商品目录后在艾克索拉侧及时更新目录十分重要。建议在己侧发生更新时(如添加了商品或更改了价格)同步更新艾克索拉侧的目录。

您可以:

通过API调用来创建及更新商品和促销活动时使用基本认证。请传入Authorization:Basic <your_authorization_basic_key>,其中<your_authorization_basic_key>是按照Base64标准加密的商户ID: API密钥对。请前往发布商帐户找到以下参数:

  • 商户ID在以下位置显示:
    • 公司设置 > 公司部分。
    • 在发布商帐户任意页面的浏览器地址栏的URL中。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. 捆绑包。

下面是一个脚本示例,它重复调用创建虚拟物品方法来创建虚拟物品。

该脚本使用JavaScript和JavaScript运行时引擎 — Node.js开发。

  1. 导入“node-fetch”模块的fetch函数以向艾克索拉服务器发送HTTP请求。
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函数,它向艾克索拉API发送POST请求来创建虚拟物品
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的虚拟物品是否存在。该函数向艾克索拉API发送一个GET请求:
    • 如收到包含404 HTTP代码的响应,说明指定SKU的商品不存在,需要创建。
    • 如收到包含200 HTTP代码的响应,说明找到了指定SKU的商品,无需创建。
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函数,它检查商品列表以查找艾克索拉侧是否存在您系统中SKU指定的商品。如没有该SKU的商品,则该函数创建该商品。进度信息在控制台中显示。
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等外部系统导入数据。

本文对您的有帮助吗?
谢谢!
我们还有其他可改进之处吗? 留言
非常抱歉
请说明为何本文没有帮助到您。 留言
感谢您的反馈!
我们会查看您的留言并运用它改进用户体验。
上次更新时间: 2024年10月3日

发现了错别字或其他内容错误? 请选择文本,然后按Ctrl+Enter。

报告问题
我们非常重视内容质量。您的反馈将帮助我们做得更好。
请留下邮箱以便我们后续跟进
感谢您的反馈!