通过API自动更新目录
通过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方法。
虚拟物品
要更新目录:
- 通过获取虚拟物品或获取所有虚拟物品列表API方法从目录获取数据。
- 通过更新虚拟物品API方法传入新参数值。
要创建虚拟物品,请使用创建虚拟物品API方法。
捆绑包
要更新目录:
要创建捆绑包,请使用创建捆绑包API方法。
如要向捆绑包中添加游戏密钥、国家/地区限制或价格,请按照说明进行操作。
创建和更新促销活动
优惠券
要更新促销活动:
- 通过获取优惠券促销活动或获取优惠券促销活动列表API方法从目录获取数据。
- 通过更新优惠券促销活动API方法传入新参数值。
- 通过激活优惠券促销活动API方法激活促销活动。
要创建促销活动,请使用创建优惠券促销活动API方法,然后使用创建优惠券码来创建自定义优惠券码或使用生成优惠券码来生成随机优惠券码。
要停用促销活动,请使用停用优惠券促销活动API方法。
促销码
要更新促销活动:
要创建促销活动,请使用创建促销码活动API方法,然后使用创建促销码活动的促销码来创建自定义促销码或使用生成促销码活动的促销码来生成随机促销码。
要停用促销活动,请使用停用促销码活动API方法。
折扣
要更新促销活动:
- 通过获取商品促销活动或获取商品促销活动列表API方法从目录获取数据。
- 通过更新商品促销活动API方法传入新参数值。
- 通过激活促销活动API方法激活促销活动。
要创建促销活动,请使用为商品创建折扣促销活动API方法。
要停用促销活动,请使用停用促销活动API方法。
奖励
要更新促销活动:
- 通过获取奖励促销活动或获取奖励促销活动列表API方法从目录获取数据。
- 通过更新奖励促销活动API方法传入新参数值。
- 通过激活促销活动API方法激活促销活动。
要创建促销活动,请使用创建奖励促销活动API方法。
要停用促销活动,请使用停用促销活动API方法。
通过API自动创建商品
如需根据自己系统的数据创建大量商品,可使用API自动化该过程。
您需要:
如要使用商品组,请预先通过发布商帐户界面创建组。
如要使用多种商品类型,应按照下列顺序进行创建:
- 在发布商帐户中创建商品组。
- 虚拟货币。
- 虚拟物品。
- 虚拟货币套餐。
- 捆绑包。
下面是一个脚本示例,它重复调用创建虚拟物品方法来创建虚拟物品。
该脚本使用JavaScript和JavaScript运行时引擎 — Node.js开发。
- 导入
“node-fetch”
模块的fetch
函数以向艾克索拉服务器发送HTTP请求。
- javascript
import fetch from "node-fetch";
- 设置请求授权所需的常量。不要插入
<your project_id from PA>
和<your api key from PA>
,而应插入项目ID和API密钥的值,它们将使用Base64编码以便后续在API请求中使用。
- javascript
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')
- 实现辅助函数
sleep
,用于在发送请求时创建延迟。这是为了不超出API请求的流量限制所必需的。
- javascript
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
- 实现您系统专用的
getItems
函数从您的系统获取商品数据。
- javascript
async function getItems() {
// receive items from the original system or read from a pre-prepared file
return items;
}
- 实现您系统专用的
prepareData
函数以根据创建虚拟物品API调用中的数据格式来格式化商品数据。
- javascript
function prepareData(items) {
// format items in accordance with API requirements
return formattedItems;
}
- 添加
createItem
函数,它向艾克索拉API发送POST
请求来创建虚拟物品
- javascript
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),
});
}
- 添加
checkItemExist
函数,它检查指定SKU的虚拟物品是否存在。该函数向艾克索拉API发送一个GET
请求:- 如收到包含
404
HTTP代码的响应,说明指定SKU的商品不存在,需要创建。 - 如收到包含
200
HTTP代码的响应,说明找到了指定SKU的商品,无需创建。
- 如收到包含
- javascript
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;
}
- 添加
createItems
函数,它检查商品列表以查找艾克索拉侧是否存在您系统中SKU指定的商品。如没有该SKU的商品,则该函数创建该商品。进度信息在控制台中显示。
- javascript
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`);
}
- 添加
run
函数,以正确的顺序调用上述所有函数。
- javascript
async function run() {
const items = await getItems();
const formattedItems = prepareData(items);
await createItems(formattedItems);
}
完整代码:
- javascript
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等外部系统导入数据。发现了错别字或其他内容错误? 请选择文本,然后按Ctrl+Enter。