跨会话/设备处理应用内购买/消耗品?

Mar*_*ark 4 java android google-api in-app-purchase in-app-billing

我的问题集中在使用 Google 的 In-App Billing API 处理消耗品的应用内购买。(https://developer.android.com/google/play/billing/api.html#consumetypes

他们的文档将消耗品描述为:

消耗品

相比之下,您可以对可以多次购买的产品实施消费。通常,这些产品会提供某些临时效果。例如,用户的游戏角色可能会在他们的库存中获得生命值或获得额外的金币。在您的应用程序中分配所购买产品的好处或效果称为供应被管理产品。您负责控制和跟踪向用户供应被管理产品的方式。

消耗品是可以多次购买的东西(如游戏货币、游戏内物品或使用的升级等),而非消耗品只能购买一次(无广告、皮肤/角色, 等等。)

在消费购买的文档(https://developer.android.com/training/play-billing-library/purchase-iab-products.html)中,它还提到:

您如何在应用中使用消费机制取决于您。通常,您会为用户可能想要多次购买的具有临时利益的产品实施消费,例如游戏货币或可补充的游戏代币。您通常不希望对购买一次并提供永久效果(例如高级升级)的产品实施消费。

您有责任控制和跟踪向用户提供应用内商品的方式。例如,如果用户购买了游戏内货币,您应该使用购买的货币数量更新玩家的库存。

我的问题是如何跟踪消耗品的用户库存?文档和各种视频似乎很快掩盖了这一点,基本上是说应用程序在确认购买成功时必须应用消耗品的效果。但这并不是真正的全貌。如果用户退出并使用不同的帐户重新登录怎么办?或者他们切换到新手机,他们应该在该手机上拥有该产品。

您无法真正将购买记录保存在 SharedPreferences 或持久缓存中,因为它与手机相关联。如果用户在不同的手机上登录,那么他们应该可以享受他们所做的所有购买的好处。

以下面的例子为例:

一场比赛开始时玩家有 1000 金币。玩家通过应用内购买再购买 500 金币,然后花费 200 金币。如果玩家购买新手机并在该手机上安装该应用程序,他们应该有 1300 金币。

这通常是如何实现的?

您是否需要运行一个私人服务器来跟踪这些东西的购买/消费与 Google 分开?

谢谢!!

Kis*_*nav 7

我自己正在实施应用内购买。

您是否需要运行一个私人服务器来跟踪这些东西的购买/消费与 Google 分开?

当然是,正如谷歌在安全最佳实践中所建议的那样

强烈建议在您信任的服务器上验证购买详细信息。但是,如果您无法使用服务器,仍然可以在设备上的应用程序中验证这些详细信息。

你的第二个问题

如果用户退出并使用不同的帐户重新登录怎么办?

绑定orderId到帐户或设备。在第一种情况下,您可以在用户切换设备时轻松管理购买(获得私人服务器的另一个原因)。而在第二种情况下,您可以允许在同一设备上切换帐户。因此,选择哪一个取决于您。

您需要将本地消费同步到服务器。

这是验证购买的流程:

  1. 用户点击“购买”按钮。
  2. 用谷歌付款。
  3. 应用从谷歌接收“收据”并将其存储在本地
  4. 将此“收据”发送到服务器。
  5. 服务器将“purchaseToken”发送到 Google Play Developer API 进行验证
  6. Google Play Developer API 发送带有状态代码的响应。
  7. 将 RECEIPT 存储在服务器数据库中(如果我们保留用户的购买历史)。

这是消费产品的流程:

  1. 用户打开应用程序。
  2. 应用程序通过从本地存储中读取来为资源分配值。
  3. 应用程序尝试与服务器同步。(检查最后更新的时间戳)

不同的场景:

同步成功:从服务器分配资源值。在本地存储中设置新检索的值。

同步失败:保留资源值并重试。

  1. 用户消耗资源。
  2. 应用程序更新资源中的本地值并与服务器同步。(检查上次更新的时间戳)

我使用了以下文章:

  • 教程:如何在 Android LINK 中实现应用内结算
  • 关于实施应用内购买链接的文章
  • 如何在服务器端验证购买 android 应用程序(google play in app billing v3)链接
  • 另一个 SO 回答LINK
  • 另一个 SO 回答LINK
  • 代码项目示例链接