> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# PC 上的 XStore — DRM、许可证令牌和沙盒

> PC 特有的 XStore 注意事项：基础 DRM、用于服务端验证的许可证令牌、商店账号不匹配的处理，以及沙盒切换。

Windows PC 引入了 XBOX 上 XStore 所没有的一些复杂情况：PC 上的 Microsoft Store 账号可能与玩家的 XBOX 账号不同，沙盒会以不同方式影响商店操作，而许可证令牌流程可让你的服务在不信任客户端的情况下验证所有权。

## 基础 DRM 与许可证检查

PC 上的 XStore 包含基础 DRM 检查：游戏在允许进行游戏之前会验证是否有活跃许可证。该检查通过 `XStoreQueryGameLicenseAsync` 在启动时运行。

如果未找到许可证：

1. 向玩家显示商店 UI 以进行购买或登录。
2. 未取得活跃许可证前，不要让游戏继续进行。

对于盗版风险较高的游戏，请叠加额外的检查：

* 通过你的服务的[许可证令牌](#license-tokens-for-service-validation)验证许可证。
* 在游戏过程中定期重新调用 `XStoreQueryGameLicenseAsync`；如果许可证丢失则撤销。

## 开放式与限制式授权

两种 PC 授权模型：

* **开放式授权** — 玩家可以使用任何拥有许可证的 Microsoft Store 账号运行游戏。适用于共享 PC。
* **限制式授权** — 玩家必须使用拥有许可证的 Microsoft 账户登录。用于希望获得更强反盗版保护的游戏。

在合作伙伴中心的产品 Properties 下进行配置。

## 用于服务端验证的许可证令牌

如果你的游戏服务器需要确认玩家拥有该游戏（例如在授予游戏内资产之前），请使用 **许可证令牌**：

1. 客户端调用 `XStoreQueryLicenseTokenAsync` 获取短期签名令牌。
2. 客户端将令牌发送到你的服务。
3. 你的服务使用 Microsoft 公钥验证令牌的签名。
4. 你的服务信任令牌中关于许可证状态的声明。

这可以避免客户端在没有证据的情况下声明所有权，并避免你的服务每个会话轮询 Microsoft Store API。

## 商店账号不匹配的场景

一个常见的 PC 问题：玩家使用一个 Microsoft 账户登录 Windows/XBOX 应用，但使用不同的账号登录 **Microsoft Store**。

XStore API 会遵循商店的登录账号，这可能导致：

* 尽管登录 XBOX 的玩家在另一个账号上拥有该游戏，游戏仍显示 “购买 (buy)”。
* 购买针对错误账号成功完成。

处理方法：

1. 检测不匹配 — 将 `XUserGetId` 与 `XStoreQueryGameLicenseAsync` 信息进行比较。
2. 显示 UI 解释不匹配并提供切换选项。
3. 如果玩家无法切换，提供跳转到 XBOX 应用以修复商店账号的选项。

## 商店操作的沙盒切换

XBOX 服务沙盒（通过 `XblPCSandbox.exe` 设置）并不能完全控制 PC 上商店使用的沙盒。商店操作需要额外的步骤：

1. 切换 XBOX 服务沙盒。
2. 在新的沙盒上下文中重新启动 **Microsoft Store 应用**。
3. 通过 `XStoreQueryGameLicenseAsync` 验证是否返回开发沙盒数据。

未能正确切换商店会导致混乱的测试结果，其中 XBOX 服务看到的是开发沙盒，但商店调用命中的是 RETAIL。

## PC 商务测试清单

提交前：

1. **使用一无所有的测试账号进行测试** — 验证购买/试玩/登录流程。
2. **使用拥有基础游戏的测试账号进行测试** — 验证不会出现“购买”提示。
3. **测试商店账号不匹配的场景** — 使用一个账号登录 Windows，使用另一个账号登录商店。
4. **测试试玩 → 购买流程** — 验证试玩许可证无需重启即可切换为完整许可证。
5. **测试离线启动** — PC 游戏必须能在合理的缓存许可证时间窗内离线启动和游玩（不接触商店）。
6. **测试沙盒切换** — 确认切换后商店调用返回开发沙盒中的产品。

## 相关 API 文档

* [XStore API 参考](/reference/system/xstore/xstore_members) — `XStoreQueryGameLicenseAsync`、`XStoreQueryLicenseTokenAsync`
* [XUser API 参考](/reference/system/xuser/xuser_members) — `XUserGetId`、`XUserIsStoreUser`

## 另请参阅

* [XStore 深入指南](/publishing/xstore-commerce/xstore-overview)
* [XStore S2S API](/publishing/xstore-commerce/xstore-authenticating-service)
* [PC Sandbox Switcher](/tools/tools-services/live-pc-sandbox-switcher)
* [在 PC 上启动](/tools/tools-pc/launching-on-pc)


## Related topics

- [基础 DRM 与许可证检查](/zh-CN/publishing/xstore-commerce/xstore-basic-drm.md)
- [XStoreQueryLicenseTokenAsync](/zh-CN/reference/system/xstore/functions/xstorequerylicensetokenasync.md)
- [使用许可证令牌在你的服务上校验授权](/zh-CN/publishing/xstore-commerce/xstore-license-tokens.md)
- [XStore 商务概述](/zh-CN/publishing/xstore-commerce/xstore-commerce-overview.md)
- [启用授权测试](/zh-CN/publishing/xstore-commerce/xstore-licensing-setup.md)
