检测和交付应用内商品

使用集合让一切井井有条 根据您的偏好保存内容并对其进行分类。

本主题介绍当玩家在 Google Play 应用中使用 Play 积分购买应用内商品后,您应如何在游戏内检测和交付相应的应用内商品。

当用户在 Google Play 应用中使用 Play 积分兑换应用内商品后,您就应该立即在游戏中交付相应的商品。下方的屏幕截图显示了用户如何使用 Play 积分购买商品。

1. 点击 Play Points 1. 点击使用标签页以查看商品。 2. 选择一件商品,然后点击使用积分完成购买交易。 3. 接收相应商品。
待定的屏幕截图 待定的屏幕截图 待定的屏幕截图 待定的屏幕截图

在此示例中,当用户购买商品时游戏并未运行。用户还可以在设备上并未安装相应游戏的情况下用 Play 积分兑换商品。因此,您必须将游戏设计为在游戏内商店之外处理应用内商品交付。

准备工作

您必须先创建商品和 Play Points 促销活动,才能检测和交付应用内商品。

交付要求

当您通过 Play Points 促销活动在游戏中交付应用内商品时,必须遵守本部分所述的要求。

交付时间

当玩家使用 Play 积分兑换应用内商品时,您必须立即交付商品,而且不要求玩家重启游戏。如果玩家必须事先完成某项游戏内容(例如学完教程),则您必须在玩家完成该内容后立即交付商品。

交付消息

如果用户在游戏外购买了应用内商品,当用户返回游戏中时,游戏必须显示确认消息,表明商品已成功在游戏中交付。该消息应该会以弹出式对话框或游戏内消息的形式出现。用户应无需执行任何额外的步骤即可收到其商品。

以下是要求使用的消息格式:

  • 一条明确的消息,表示用户已收到相应商品

  • 明确指明商品的名称,并提及“Play 积分”,以确保用户能够将该商品与收到的其他内容区分开来。

  • 商品的名称还必须包含该商品的正确面额(如果存在有多个面额的类似商品)。

  • 弹出式对话框、消息或游戏内通知应该一直显示,直到用户点击继续确定等按钮进行确认为止。 此类消息不应包含“取消”按钮,因为它仅用于通知用户在游戏中收到的商品。如果没有确认按钮,则该消息应至少显示 3 秒后才会消失,以确保用户知道他们已收到相应商品。

下面是一个消息示例:

“已收到商品!您刚刚使用 Play 积分兑换了 100 颗宝石。继续。”

用户应该会看到一个动画或一些视觉确认信息,显示他们的游戏代币余额有所增加。如果相应商品是耐用型或消耗型应用内商品,系统应将用户定向至商品解锁位置或可在游戏中找到该商品的位置。

检测在游戏外收到的商品

如果您的游戏使用 Google Play 结算库,请进行以下更改,以使其能检测在游戏外获得的应用内商品。

  1. 在游戏的 onResume() 回调中,调用 queryPurchases() 方法来检索商品列表,以便确定哪些商品未经确认。

  2. 如果您的游戏有服务器,我们强烈建议您使用 Subscriptions and In-App Purchases API 从服务器中验证购买交易

  3. 如有未经确认的持有商品,请使用 consumeAsync()(适用于消耗型商品)或 acknowledgePurchase()(适用于非消耗型商品)确认购买交易。

  4. 在游戏内向用户授予对已购商品的权限。

检测在分屏模式下收到的商品

如果您的游戏支持多窗口模式,用户有可能在 Play 商店应用和您的游戏同时运行的情况下兑换 Play 积分并获得相应商品。下方的屏幕截图显示了一个示例:

在游戏运行的同时显示“兑换积分”按钮的屏幕截图。

若要借助 Google Play 结算库支持此情形,请采取以下做法:

  1. Google Play 调用 onPurchasesUpdated() 方法来通知您的游戏有新的待处理商品。

  2. 如果您的游戏有服务器,我们强烈建议您使用 Subscriptions and In-App Purchases API 从服务器中验证购买交易

  3. 使用 consumeAsync()(适用于消耗型商品)或 acknowledgePurchase()(适用于非消耗型商品)确认购买交易。

  4. 在游戏内向用户授予对已购商品的权限。

显示交付确认消息

当用户兑换 Play 积分并获得兑换的商品时,他们希望游戏显示游戏内消息,或通过某种通知告知自己游戏已正确接收并处理该商品。以下是一些交付确认消息方案:

  • 显示游戏内弹出式消息。

  • 将消息传送到游戏内消息箱,并清楚地指出游戏内消息箱中有新消息。

  • 使用操作系统通知消息。

在用户获得促销商品时,游戏可能处于任何状态,包括并未安装在设备上。无论在用户获得促销商品时游戏处于何种状态,您都必须检测促销商品。不过,在一些例外情况下,不立即通知用户已收到商品或许是可以接受的。例如:

  • 当用户在玩游戏时,显示消息可能会让用户分心。在这种情况下,必须待游戏结束后再通知用户。

  • 在出现过场动画时,显示消息可能会让用户分心。在这种情况下,必须待过场动画结束后再通知用户。

  • 当用户在游戏中学习初始教程和进行用户设置时。我们建议您在新用户打开游戏后立即将奖励通知用户,或在用户进行初始设置期间通知他们。不过,您也可以等到用户正式进入游戏环节时再通知用户。

如果您的应用中有多个角色或帐号可以接受该商品,我们建议您提示用户选择要接收促销商品的帐号。

在决定向用户显示促销商品相关通知的时机和方式时,应考虑用户的需求。 如果用户没有立即收到通知,他们可能会感到困惑,并可能会停止玩游戏,与用户支持团队联系,或在社交媒体上抱怨。

适用于特定游戏引擎的更新

以下是一些针对特定游戏引擎的注意事项:

  • 如果您的游戏是使用 Unity 构建的,我们建议您验证您所使用的 IAP 实现是否已支持 Play Points 促销活动。

  • 如果您的游戏是使用 Cocos2d-x 或 Unreal Engine (C/C++) 构建的,那么您很可能需要编写 JNI 代码来调用您 C/C++ 代码中的 Java API。

服务器端最佳做法

本部分包含适用于 Play Points 促销活动的服务器端最佳做法:

  • 如果您在服务器上调用 Purchases.products: get,请确认您是否需要根据 productId 值将 Play 奖励兑换商品与其他应用内商品分开处理。

  • 如果您在服务器上使用 Inappproducts: list,请确认您是否需要通过 productId 值将 Play 奖励兑换商品与其他应用内商品区分开。

  • 查看以下最佳做法,确认您是否需要进行其他更改:

问题排查

本部分包含针对可导致客户咨询问题的情形给出的建议。

多个用户帐号

如果用户的设备上有多个 Google 帐号,而用户在错误的帐号中兑换了 Play 积分,那么 Google 无法将相关商品转移到其他帐号。同样,您的应用也无法通过调用 getPurchases() 方法转移相关商品。在这种情况下,不妨考虑通过客户服务人员的人工操作向用户提供应用内商品。

商品交付延迟或丢失

如果玩家遇到奖励商品交付延迟或丢失的情况,请参阅 Google Play 帮助文档中的应用内购买问题排查指南