【问题标题】:Handling in-app purchases / consumable products across sessions/devices?跨会话/设备处理应用内购买/消耗品?
【发布时间】:2018-08-26 21:47:02
【问题描述】:

我的问题集中在使用 Google 的应用内结算 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 的私人服务器来跟踪此类物品的购买/消费情况?

谢谢!!

【问题讨论】:

  • 基本上,Google 只会帮助您进行购买并通知您是否完成了购买,它不会通知您购买了多少次。假设如果用户购买了 500 个硬币,那么您必须维护一个服务器来跟踪用户的硬币,并且在购买时,您必须将服务器中的用户硬币设置为 1000 + 500。当用户花费 200 个硬币时,然后设置用户投币到 1300。但请记住,购买必须在 Google 的服务器中消费,然后只有用户才能再次购买相同的东西。

标签: java android google-api in-app-purchase in-app-billing


【解决方案1】:

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

您是否需要运行独立于 Google 的私人服务器来跟踪此类物品的购买/消费情况?

当然,正如 Google 在 Security Best Practices 中建议的那样

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

你的第二个问题

如果用户退出并使用其他帐户重新登录会怎样?

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

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

这是验证购买的流程:

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

这是消费产品的流程:

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

不同的场景:

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

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

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

我使用了以下文章:

  • 教程:如何在 Android 中实现应用内计费LINK
  • 实施InApp购买的文章LINK
  • 如何在服务器端验证 Android 应用的购买(Google Play in App Billing v3)LINK
  • 另一个 SO 答案LINK
  • 另一个 SO 答案 LINK
  • 代码项目示例LINK

【讨论】:

  • 感谢您的回答!安全最佳实践似乎集中在验证购买上,无论是消耗品还是非消耗品,还是订阅。我更感兴趣的是在确认购买后如何处理玩家账户/库存的变化。 Firebase 数据库是否足以用于安全最佳实践或存储玩家库存?我在想那个或者 AWS,而不是做一个私有服务器。
  • 您可以使用任何服务提供商或技术。谷歌似乎建议除了他们的服务器 API 之外的任何东西。使用数字签名来识别当事人。
  • 为了保证消费安全,您必须使用可信赖的服务器。我建议在我的回答中消费一种产品。使用服务器记录消费的好处是你可以处理和监控用户的购买和恢复消费产品会很容易(我认为)
  • 如果我的回答令人满意,请将其标记为答案。这将帮助我获得第一分
猜你喜欢
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多