# 从游戏中打开一个网上商店

> 了解游戏如何通过经过身份验证的玩家会话打开网上商店以及如何对玩家进行身份验证。

网上商店在 Unity 游戏上下文之外运行。为了识别网上商店中的玩家，您的游戏会使用包含经过身份验证的玩家会话的出站链接打开商店。这是推荐的开店方式；玩家无需额外的登录步骤即可完成购买。

玩家还可以直接从浏览器、书签、营销链接或共享链接打开商店。如果商店没有收到玩家会话，则会显示未经身份验证的登录页面而不是商品列表。购买后，商店可以使用返回深层链接将玩家返回到您的游戏。商店还使用此链接来自动处理未经身份验证的玩家。有关更多信息，请参阅[处理入站深度链](./integrate-into-game.md#handle-inbound-deep-links)接。

网上商店会处理游戏通过的会话中的身份验证。您无需构建单独的登录流程。有关更多信息，请参阅[身份验证玩家和持久会话](#authenticate-players-and-persist-sessions)。

## 出站链接##outbound-links

游戏使用平台的标准外部 URL 处理方式打开商店 URL。在移动设备上，通常在系统浏览器或应用内 Web 视图中打开商店。

URL 格式如下：

```text
https://shop.unity.com/{studio}/game/{slug}?sessionToken={token}&projectId={projectId}&environment={env}
```

要在运行时为实时发布的商店或环境的预览草案解析此 URL，请参阅将[网上商店集成到 Unity 游戏](./integrate-into-game.md#open-the-webshop-from-your-game)中。

以下查询参数可识别玩家并加载正确的网上商店上下文：

| 参数             | 用途                                                            |
| -------------- | ------------------------------------------------------------- |
| `sessionToken` | Unity Authentication SDK 中的短暂会话令牌。商店在玩家浏览器中交换此令牌以进行身份验证的玩家会话。 |
| `projectId`    | 玩家所属的 Unity Cloud 项目 ID。商店使用此值加载正确的网上商店和目录。                   |
| `environment`  | 要加载的 Unity 环境名称。此参数是可选参数，默认为 `production`。                    |

您还可以传递`locale`和`currency`，以便目录返回玩家所在地区的商品：

```text
https://shop.unity.com/acme/game/dungeons?sessionToken=…&projectId=…&environment=production&locale=ja-JP&currency=JPY
```

商店解析身份验证并存储参数后，会从 URL 中删除这些参数。这有助于防止截屏或意外共享的 URL 暴露会话令牌。

如果忽略`sessionToken`和`projectId`，商店会显示未经身份验证的登录页面，而不是商品列表。没有玩家身份，玩家无法完成购买。

每当游戏打开商店时，都需要经过身份验证的 URL。

## 验证玩家身份并保留会话##authenticate-players-and-persist-sessions

网上商店通过 Unity [身份验证](/authentication.md)对玩家会话进行身份验证。游戏在开店时，会在 `sessionToken` 查询参数中包含短暂的 Unity Authentication 令牌。网上商店在玩家浏览器中交换令牌以进行持久玩家会话。

玩家必须通过身份验证才能查看目录或完成购买。如果玩家在没有身份验证上下文的情况下打开商店，商店将显示未经身份验证的登录页面而不是商品列表。

成功交换`sessionToken`后，商店会将玩家身份存储在浏览器的`localStorage`中。存储的标识范围为项目和环境。如果同一玩家稍后打开商店 URL，例如从浏览器书签打开，商店可以重复使用缓存的身份并跳过身份验证交换。玩家无需在游戏中重新打开商店。

当存储的会话令牌有效时，会话会自动刷新。

从 Dashboard 预览路径 `/_preview/...` 开始的会话使用 `sessionStorage` 而不是 `localStorage`。这会在当前选项卡中的 Stripe 重定向期间保留相同的玩家 ID，但在选项卡关闭后不会保持会话。

有关更多信息，请参阅 [Catalog and payments in webshops](./catalog-and-payments.md)（网上商店目录和付款）。

## 处理未经身份验证的登录页面##handle-the-unauthenticated-landing-page

当玩家打开没有身份验证上下文且没有缓存会话的商店 URL 以`localStorage`项目和环境时，商店会显示未经身份验证的登录页面而不是商品列表。

要访问商品列表，玩家会从您的游戏中打开带有其身份验证会话的网上商店。

登录页面还会显示 **Connect to game** 按钮。当玩家选择此按钮时，商店将通过深层链接打开您的游戏。系统会自动收集玩家的身份验证信息，Unity IAP SDK 会在商品列表中使用经过身份验证的会话重新打开商店。

如果未配置深度链接，该按钮会提示玩家从游戏中打开商店。

对于此登录流程，商店会自动修改 **Deeplink URL**。

## 购买后返回游戏##post-purchase-return-to-the-game

在购买后，Webshop 可以通过返回深层链接将玩家送回游戏。在控制面板中的 **Deeplink URL** 字段中进行配置，例如 `mygame://purchase-success`。对于退货，网上商店会完全按照您输入的链接使用，因此您可以添加自定义购买后路径。

输入值会启用返回链接和从未经身份验证的登录页面启动**连接到游戏**。将字段留空会禁用两者。没有单独的开/关设置。有关字段及其限制的更多信息，请参阅[创建网上商店](./create-a-webshop.md#catalog-and-payment-provider-settings)和[网上商店限制参考](./limits.md#naming-rules)。

> **Note:**
>
> 返回深层链接与支付提供商重定向 URL 分开。结帐后，付款提供商会将玩家重定向回商店，此时将显示购买结果屏幕。返回深层链接是商店从该屏幕返回到游戏的下一步。它显示为 **Back to game** 按钮。配置返回深层链接不会改变提供程序重定向 URL。

启用返回链接后，Webshop 会将购买结果附加为查询参数：

```text
mygame://purchase-success?status=success&playerId={playerId}
```

网上商店在完成购买后附加`status=success`，并在玩家身份可用时附加`playerId`。如果配置的 URL 没有路径，则 Webshop 会直接将参数附加到方案：

```text
mygame://?status=success
```

游戏会注册自定义 URL 方案并读取查询参数以恢复玩家在游戏开始时的状态。

仅当满足以下所有条件时，**Back to game** 按钮才会显示在购买结果屏幕上：

* 玩家通过深层链接从您的游戏中打开了商店。
* 播放器位于移动设备上，例如 iOS 或 Android。
* 该 Webshop 已配置返回深层链接。

在桌面端，或者当玩家没有通过深层链接打开商店时，结果屏幕会显示**继续购物**。**Back to game** 按钮也会显示在失败屏幕上，以便玩家可以在购买取消或失败后返回游戏。
