{"templateId":"openapi_docs","sharedDataIds":{"openAPIDocsStore":"oas-@l10n/zh/api/catalog/index.yaml","sidebar":"sidebar-@l10n/zh/catalog-en.sidebars.yaml"},"props":{"definitionId":"@l10n/zh/api/catalog/index.yaml","dynamicMarkdocComponents":[],"baseSlug":"/zh/api/catalog","seo":{"title":"商品目录API","llmstxt":{"hide":false,"sections":[{"title":"Table of contents","includeFiles":["**/*"],"excludeFiles":[]}],"excludeFiles":[]}},"itemId":"","disableAutoScroll":true,"metadata":{"type":"openapi","title":"商品目录API","description":"# 概述\n\n- **版本：** 2.0.0\n- **服务器：** `https://store.xsolla.com/api`\n- [通过电子邮件联系我们](mailto:integration@xsolla.com)\n- **联系网址：** https://xsolla.com/\n- **所需TLS版本：** 1.2\n\n商品目录API可用于在艾克索拉侧配置游戏内购商品目录，并在您的商店中向用户展示该商品目录。\n\n该API可用于管理以下商品目录实体：\n\n* **虚拟物品** — 武器、皮肤、加成道具等游戏内物品。\n* **虚拟货币** — 用于购买虚拟物品的虚拟资金。\n* **虚拟货币套餐** — 预定义的虚拟货币捆绑包。\n* **捆绑包** — 将虚拟物品、货币或游戏Key组合后作为单个SKU销售的组合包。\n* **游戏Key** — 通过Steam等平台或其他DRM提供商分发的游戏和DLC密钥。\n* **组** — 用于在商品目录中组织和排序商品的逻辑分组。\n\n## API调用\n\n该API分为以下组别：\n\n* **<nt>Admin</nt>** — 用于创建、更新、删除和配置商品目录中的商品及分组的调用。通过[基本访问身份认证](https://developers.xsolla.com/zh/payment-ui-and-flow/payment-ui/how-to-get-payment-token/#payments_solution_get_user_auth_token_basic_auth)方式进行身份认证，需使用您的商户或项目凭据。不适用于商店前端调用。\n* **<nt>Catalog</nt>** — 用于检索商品并构建面向最终用户的自定义商店前端。专为高负载场景设计。支持可选的用户JWT授权，可返回个性化数据，例如用户限购额度和当前进行中的促销活动。\n\n# 身份认证\n\nAPI调用需要以用户身份或项目身份进行身份认证。使用的身份认证方案见各调用描述中的**安全性**部分。\n\n## 使用用户JWT进行身份认证\n\n当请求从浏览器、移动应用或游戏发送时，使用用户JWT身份认证。默认情况下，应用`XsollaLoginUserJWT`方案。有关如何创建令牌的详细信息，请参阅[艾克索拉登录管理器API文档](/zh/api/login/authentication-schemes#getting-user-token)。\n\n令牌通过`Authorization`请求头按以下格式传递：`Authorization: Bearer <user_JWT>`，其中`<user_JWT>`为用户令牌。该令牌用于识别用户，并授予其访问个性化数据的权限。\n\n或者，您也可以使用[用于打开支付UI的令牌](/zh/api/pay-station/token/create-token)。\n\n## 基本HTTP身份认证\n\n基本HTTP身份认证用于服务器到服务器交互，即API调用直接从您的服务器发送，而不是从用户的浏览器或移动应用发送。通常使用带有[API密钥](/zh/api/getting-started/#api_keys_overview)的HTTP Basic身份认证。\n\n<div class=\"note\"><b>注：</b><br><br>API密钥属于机密信息，不得在客户端应用中存储或使用。</div>\n\n使用基本服务器侧身份认证时，所有API请求都必须包含以下请求头：\n\n- 对于`basicAuth` — `Authorization: Basic <your_authorization_basic_key>`，其中`your_authorization_basic_key`是以Base64编码的`project_id:api_key`对\n- 对于`basicMerchantAuth` — `Authorization: Basic <your_authorization_basic_key>`，其中`your_authorization_basic_key`是以Base64编码的`merchant_id:api_key`对\n\n您可以在[发布商帐户](https://publisher.xsolla.com/)中找到参数值：\n\n- `merchant_id`显示在：\n  - **公司设置 > 公司**中。\n  - 任意发布商帐户页面的浏览器地址栏URL中。URL格式为：`https://publisher.xsolla.com/<merchant_id>`。\n- `project_id`显示在：\n  - 发布商帐户中项目名称旁边。\n  - 发布商帐户中项目页面的浏览器地址栏URL中。URL格式为：`https://publisher.xsolla.com/<merchant_id>/projects/<project_id>`。\n- `api_key`仅在创建时在发布商帐户中显示，必须在己侧安全存储。您可以在以下部分创建API密钥：\n  - [公司设置 > API密钥](https://publisher.xsolla.com/0/settings/api_key)\n  - [项目设置 > API密钥](https://publisher.xsolla.com/0/projects/0/edit/api_key)\n\n<div class=\"notice\"><b>提示</b><br><br>如果所需的API调用不包含<code>project_id</code>路径参数，请使用对公司所有项目均有效的API密钥进行授权。</div>\n\n有关使用API密钥的更多信息，请参阅[API参考](/zh/api/getting-started/#api_keys_overview)。\n\n## 支持访客访问的身份认证\n\n`AuthForCart`身份认证方案用于购物车购买，支持两种模式：\n\n1. **使用用户JWT进行身份认证。** 令牌通过`Authorization`请求头按以下格式传递：`Authorization: Bearer <user_JWT>`，其中`<user_JWT>`是用户令牌。该令牌用于识别用户，并提供对个性化数据的访问权限。\n或者，您也可以使用[用于打开支付UI的令牌](/zh/api/pay-station/token/create-token)。\n\n2. **不带Authorization请求头的简化模式。** 此模式仅适用于未完成身份认证的用户，且仅可用于[游戏Key销售](/zh/doc/buy-button/how-to/set-up-authentication/#guides_buy_button_selling_items_not_authenticated_users)请求中不使用令牌，而必须包含以下请求头：\n   - `x-unauthorized-id`，值为请求ID\n   - `x-user`，值为使用Base64编码的用户电子邮件地址\n\n## 实用链接\n\n- [按交互模型划分的API调用](https://developers.xsolla.com/zh/api/catalog/)\n- [接口类型](https://developers.xsolla.com/zh/api/catalog/)\n- [错误处理](https://developers.xsolla.com/zh/api/catalog/)\n- [API密钥](https://developers.xsolla.com/zh/api/catalog/)\n\n# 核心实体结构\n\n所有类型的商品（虚拟物品、捆绑包、虚拟货币和密钥）都使用类似的数据结构。了解基本结构有助于简化API使用，并帮助您更轻松地查阅文档。\n\n<div class=\"note\"><b>注：</b><br><br>部分调用可能包含其他字段，但这些字段不会改变基本结构。</div>\n\n**标识信息**\n\n- `merchant_id` — [发布商帐户](https://publisher.xsolla.com/)中的公司ID\n- `project_id` — 发布商帐户中的项目ID\n- `sku` — 商品SKU，在项目内唯一\n\n**商店显示**\n\n- `name` — 商品名称\n- `description` — 商品描述\n- `image_url` — 图片URL\n- `is_enabled` — 商品可用性\n- `is_show_in_store` — 商品是否显示在商品目录中\n\n有关在商品目录中管理商品可用性的更多信息，请参阅[文档](/zh/items-catalog/catalog-features/items-availability/)。\n\n**组织方式**\n\n- `type` — 商品类型，例如虚拟物品（`virtual_item`）或捆绑包（`bundle`）\n- `groups` — 商品所属的组\n- `order` — 在商品目录中的显示顺序\n\n**Sale conditions**\n\n- `prices` — 以真实货币或虚拟货币表示的价格\n- `limits` — 购买限制\n- `periods` — 可用时间段\n- `regions` — 区域限制\n\n**核心实体结构示例：**\n\n```json\n{\n  \"attributes\": [],\n  \"bundle_type\": \"virtual_currency_package\",\n  \"content\": [\n    {\n      \"description\": {\n        \"en\": \"Main in-game currency\"\n      },\n      \"image_url\": \"https://.../image.png\",\n      \"name\": {\n        \"en\": \"Crystals\",\n        \"de\": \"Kristalle\"\n      },\n      \"quantity\": 500,\n      \"sku\": \"com.xsolla.crystal_2\",\n      \"type\": \"virtual_currency\"\n    }\n  ],\n  \"description\": {\n    \"en\": \"Crystals x500\"\n  },\n  \"groups\": [],\n  \"image_url\": \"https://.../image.png\",\n  \"is_enabled\": true,\n  \"is_free\": false,\n  \"is_show_in_store\": true,\n  \"limits\": {\n    \"per_item\": null,\n    \"per_user\": null,\n    \"recurrent_schedule\": null\n  },\n  \"long_description\": null,\n  \"media_list\": [],\n  \"name\": {\n    \"en\": \"Medium crystal pack\"\n  },\n  \"order\": 1,\n  \"periods\": [\n    {\n      \"date_from\": null,\n      \"date_until\": \"2020-08-11T20:00:00+03:00\"\n    }\n  ],\n  \"prices\": [\n    {\n      \"amount\": 20,\n      \"country_iso\": \"US\",\n      \"currency\": \"USD\",\n      \"is_default\": true,\n      \"is_enabled\": true\n    }\n  ],\n  \"regions\": [],\n  \"sku\": \"com.xsolla.crystal_pack_2\",\n  \"type\": \"bundle\",\n  \"vc_prices\": []\n}\n```\n\n# 基本购买流程\n\n艾克索拉API可用于实现游戏内购商店逻辑，包括获取商品目录、管理购物车、创建订单以及跟踪订单状态。根据集成场景，API调用分为**管理**和**商品目录**子部分，使用不同的[身份认证方案](/zh/api/catalog/section/authentication)。\n\n以下示例展示了从创建商品到完成购买的商店设置和运营基本流程。\n\n## 创建商品和组（管理）\n\n为您的商店创建商品目录，例如虚拟物品、捆绑包或虚拟货币。\n\nAPI调用示例：\n- [创建虚拟物品](/zh/api/catalog/virtual-items-currency-admin/admin-create-virtual-item)\n- [创建捆绑包](/zh/api/catalog/bundles-admin/admin-create-bundle)\n- [创建虚拟货币](/zh/api/catalog/virtual-items-currency-admin/admin-create-virtual-currency)\n\n## 设置促销、奖励链和限制（管理）\n\n配置用户拉新和赢利工具，例如折扣、赠品、每日奖励或优惠链。\n\nAPI调用示例：\n- [创建买赠促销活动](/zh/api/liveops/promotions-bonuses/create-bonus-promotion)\n- [创建每日奖励](/zh/api/liveops/daily-chain-admin/admin-create-daily-chain)\n- [创建唯一商品目录优惠促销活动](/zh/api/liveops/promotions-unique-catalog-offers/admin-create-unique-catalog-offer)\n\n## 获取商品信息（客户端）\n\n在您的应用程序中配置商品显示。\n\n<div class=\"notice\">\n  <b>提示</b><br><br>\n    请勿使用管理子部分中的API调用来构建用户商品目录。这些API调用存在<a href=\"https://developers.xsolla.com/zh/api/getting-started/#api_rate_limits\" target=\"_blank\">速率限制</a>，并不适用于用户流量。\n</div>\n\n<br>\n\nAPI调用示例：\n- [获取虚拟物品列表](/zh/api/catalog/virtual-items-currency-catalog/get-virtual-items)\n- [获取商品组列表](/zh/api/catalog/virtual-items-currency-catalog/get-item-groups)\n- [获取捆绑包列表](/zh/api/catalog/bundles-catalog/get-bundle-list)\n- [获取可售商品列表](/zh/api/catalog/common-catalog/get-sellable-items)\n\n<div class=\"note\">\n  <b>注：</b><br><br>\n    默认情况下，商品目录API调用会返回请求时商店中当前可用的商品。如需获取尚未可用或已不再可用的商品，请在商品目录请求中包含参数<code>\"show_inactive_time_limited_items\": 1</code>。\n</div>\n\n## 销售商品\n\n您可以使用以下方法销售商品：\n- 快速购买 — 多次销售同一SKU。\n- 购物车购买 — 用户可在同一订单中向购物车添加商品、移除商品并更新数量。\n\n如果商品使用虚拟货币而非真实货币购买，请使用[创建包含指定商品的订单](/zh/api/catalog/virtual-payment/create-order-with-item-for-virtual-currency) API调用。由于扣款会在执行API调用时处理，因此无需支付UI。\n\n如需购买免费商品，请使用[使用指定商品创建订单](/zh/api/catalog/free-item/create-free-order-with-item) API调用或[使用免费购物车创建订单](/zh/api/catalog/free-item/create-free-order) API调用。无需支付UI — 订单会立即设置为<code>done</code>状态。\n\n### 快速购买\n\n使用客户端API调用[使用指定商品创建订单](/zh/api/catalog/payment-client-side/create-order-with-item)。该调用会返回用于打开支付UI的令牌。\n\n<div class=\"note\">\n  <b>注：</b><br><br>\n    用户只能在支付UI中查看折扣信息。不支持兑换码。\n</div>\n\n### 购物车购买\n\n可以在客户端或服务器侧设置购物车并完成购买。\n\n**在客户端设置和购买购物车商品**\n\n您需要自行实现添加和移除商品的逻辑。在调用用于设置购物车的API之前，您无法获知哪些促销活动会应用于本次购买。这意味着您无法提前获知总费用以及添加的赠品的详细信息。\n\n实现以下购物车逻辑：\n1. 玩家在购物车加购后，使用[向购物车添加商品](/zh/api/shop-builder/operation/cart-fill/) API调用。该调用会返回所选商品的当前信息（折扣前后价格、赠品）。\n2. 根据用户操作更新购物车内容：\n   - 如需添加商品或更改商品数量，请使用[按购物车ID更新购物车商品](/zh/api/shop-builder/operation/put-item-by-cart-id/) API调用。\n   - 如需移除商品，请使用[按购物车ID删除购物车商品](/zh/api/shop-builder/operation/delete-item-by-cart-id/) API调用。\n\n<div class=\"note\">\n  <b>注：</b><br><br>\n    如需获取购物车的当前状态，请使用“获取当前用户的购物车”API调用。\n</div>\n\n3. 使用[创建包含当前购物车中所有商品的订单](/zh/api/shop-builder/operation/create-order/) API调用。该调用返回订单ID和支付令牌。新创建的订单默认设置为<code>new</code>状态。\n\n**在服务器侧设置和购买购物车商品**\n\n这种设置方式可能需要更长的购物车设置时间，因为每次更改购物车都必须伴随API调用。\n\n实现以下购物车逻辑：\n1. 玩家在购物车加购后，使用[向购物车添加商品](/zh/api/catalog/cart-server-side) API调用。该调用会返回所选商品的当前信息（折扣前后价格、赠品）。\n2. 使用[创建包含当前购物车中所有商品的订单](/zh/api/shop-builder/operation/create-order/) API调用。该调用会返回订单ID和支付令牌。新创建的订单默认设置为<code>new</code>状态。\n\n## 打开支付UI\n\n使用返回的令牌在新窗口中打开支付UI。有关打开支付UI的其他方式，请参阅[文档](/zh/payment-ui-and-flow/payment-ui/how-to-open-payment-ui/#open_payment_ui)。\n\n| 操作                          | 接口                                                                  |\n|:--------------------------------|:--------------------------------------------------------------------------|\n| 在生产环境中打开。 | <code>https://secure.xsolla.com/paystation4/?token={token}</code>         |\n| 在沙盒模式中打开。           | <code>https://sandbox-secure.xsolla.com/paystation4/?token={token}</code> |\n\n<div class=\"note\">\n  <b>注：</b><br><br>\n    请在开发和测试期间使用沙盒模式。测试购买不会对真实帐户扣款。您可以使用<a href=\"https://developers.xsolla.com/zh/dev-resources/testing/test-cards/\">测试银行卡</a>。\n\n    完成第一笔真实支付后，严格的沙盒支付策略将生效。沙盒模式下的支付仅对[发布商帐户 > 公司设置 > 用户](https://publisher.xsolla.com/0/settings/users)中指定的用户可用。\n\n    只有在与艾克索拉签署许可协议后，才能使用真实货币购买虚拟货币和商品。如需签署协议，请在[发布商帐户](https://publisher.xsolla.com/)中前往**协议与税务 > 合同与协议**，填写协议表单并等待确认。协议审核最多可能需要3个工作日。\n</div>\n\n如需启用或禁用沙盒模式，请在快速购买和购物车购买请求中更改`sandbox`参数的值。沙盒模式默认关闭。\n\n可能的订单状态：\n- `new` — 订单已创建\n- `paid` — 已收到付款\n- `done` — 商品已交付\n- `canceled` — 订单已取消\n- `expired` — 订单已过期\n\n使用以下任一方式跟踪订单状态：\n- [您服务器上配置的Webhook](/zh/virtual-goods/own-ui/server-side-token-generation/set-up-order-tracking/#payments_integration_order_tracking)\n- [短轮询](/zh/virtual-goods/own-ui/client-side-token-generation/set-up-order-tracking/#guides_shop_builder_integrate_store_get_order_status_via_short_polling)\n- [WebSocket API](/zh/virtual-goods/own-ui/client-side-token-generation/set-up-order-tracking/#guides_shop_builder_integrate_store_get_order_status_via_websocket_api)\n\n## 实用链接\n\n- 身份认证\n- [按交互模型划分的API调用](/zh/api/catalog/section/authentication)\n- [支付测试](/zh/dev-resources/testing/general-info/#general_overview)\n- [设置订单状态跟踪](/zh/virtual-goods/own-ui/client-side-token-generation/set-up-order-tracking/?link=200-api#payments_integration_order_tracking)\n- [Webhook](/zh/webhooks/overview)\n- [速率限制](/zh/api/login/rate-limits)\n- [错误处理](/zh/api/getting-started/#api_errors_handling)\n- [API密钥](/zh/api/getting-started/#api_keys_overview)\n\n# 分页\n\n返回大量记录的API调用（例如构建商品目录时）会按页返回数据。分页是一种限制单个API响应中返回商品数量的机制，并允许您按顺序获取后续页面。\n\n使用以下参数控制返回的商品数量：\n\n- `limit` — 每页商品数量\n- `offset` — 页面中第一个商品的索引（从0开始编号）\n- `has_more` — 指示是否还有下一页\n- `total_items_count` — 商品总数\n\n请求示例：\n\n```\nGET /items?limit=20&offset=40\n```\n\n响应示例：\n\n```json\n{\n  \"items\": [...],\n  \"has_more\": true,\n  \"total_items_count\": 135\n}\n```\n\n建议发送后续请求，直到响应返回`has_more = false`。\n\n# 日期和时间格式\n\n日期和时间值以[ISO 8601](https://en.wikipedia.org/wiki/ISO_8601)格式传递。\n\n支持以下内容：\n\n- UTC偏移量\n- 当商品显示没有时间限制时使用`null`值\n- 部分字段使用的[Unix时间戳](https://www.unixtimestamp.com/)（以秒为单位）\n\n格式：`YYYY-MM-DDTHH:MM:SS±HH:MM`\n\n示例：`2026-03-16T10:00:00+03:00`\n\n# 本地化\n\n艾克索拉支持对商品名称、描述等面向用户的字段进行本地化。本地化值以对象形式传递，其中语言代码作为键。支持的完整语言列表，请参阅[文档](/zh/doc/shop-builder/references/supported-languages/)。\n\n**支持的字段**\n\n可为以下参数指定本地化内容：\n\n- `name`\n- `description`\n- `long_description`\n\n**区域格式**\n\n语言区域键可使用以下任一格式指定：\n\n- 两字母语言代码：`en`、`ru`\n- 五字母语言代码：`en-US`、`ru-RU`、`de-DE`\n\n**示例**\n\n两字母语言代码示例：\n\n```json\n{\n  \"name\": {\n    \"en\": \"Starter Pack\",\n    \"ru\": \"Стартовый набор\"\n  }\n}\n```\n\n五字母语言代码示例：\n\n```json\n{\n  \"description\": {\n    \"en-US\": \"Premium bundle\",\n    \"de-DE\": \"Premium-Paket\"\n  }\n}\n```\n\n# 错误响应格式\n\n如果发生错误，API会返回HTTP状态和JSON响应正文。商店相关错误的完整列表，请参阅[文档](/zh/dev-resources/references/errors/store-errors/)。\n\n**响应示例：**\n\n```json\n{\n  \"errorCode\": 1102,\n  \"errorMessage\": \"Validation error\",\n  \"statusCode\": 422,\n  \"transactionId\": \"c9e1a...\"\n}\n```\n\n- `errorCode` — 错误代码。\n- `errorMessage` — 简短的错误描述。\n- `statusCode` — HTTP响应状态。\n- `transactionId` — 请求ID。仅在部分情况下返回。\n- `errorMessageExtended` — 其他错误详情，例如请求参数。仅在某些情况下返回。\n\n**扩展响应示例：**\n\n```json\n{\n  \"errorCode\": 7001,\n  \"errorMessage\": \"Chain not found\",\n  \"errorMessageExtended\": {\n    \"chain_id\": \"test_chain_id\",\n    \"project_id\": \"test_project_id\",\n    \"step_number\": 2\n  },\n  \"statusCode\": 404\n}\n```\n\n**常见HTTP状态代码**\n\n- `400` — 请求无效\n- `401` — 身份认证错误\n- `403` — 权限不足\n- `404` — 资源未找到\n- `422` — 验证错误\n- `429` — 超出速率限制\n\n**建议**\n\n- 结合HTTP状态和响应正文一起处理。\n- 使用`errorCode`处理与应用程序逻辑相关的错误。\n- 分析错误时，使用`transactionId`更快定位请求。"},"compilationErrors":[],"markdown":{"partials":{},"variables":{"rbac":{"teams":["anonymous"]},"user":{},"remoteAddr":{"hostname":"xsolla.redocly.app","port":4000,"ipAddress":"216.73.216.14"},"lang":"zh","env":{"PUBLIC_REDOCLY_BRANCH_NAME":"realm"}}},"pagePropGetterError":{"message":"","name":""}},"slug":"/zh/api/catalog","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}