1

我有一个 Android 应用,用户可以在其中购买 1 个应用内产品来解锁某些功能。

我已在以下位置广泛阅读指南:https ://developer.android.com/google/play/billing/billing_library_overview#java

我了解,为了让用户购买 inapp 产品,我必须:

  • 使用调用检索可用 SKU 的列表(在本例中,是我唯一的 1 个应用内产品)querySkuDetailsAsync()。这只是为了仔细检查用户的设备是否能够管理应用内产品。
  • 如果 SKU 出现在上一次调用的结果中,则显示 BUY 按钮(这意味着用户设备中的本地 Google Play 实例可以处理应用内产品)。
  • 调用launchBillingFlow()传递我的应用内产品的 SKU,以启动 Google 支付流程(Google UI、询问卡详细信息的弹出窗口等)
  • 收听回调onPurchasesUpdated()以获取返回码(基本上付款被拒绝、付款成功或付款取消)并采取相应措施。如果付款成功,请继续在本地(使用 Play 开发人员的 RSA 公钥的本地副本)或在我的安全服务器上使用相同的密钥远程验证购买令牌签名。
  • 解锁我的应用上的付费功能

这就是事情变得混乱的地方。从 Google 文档的角度来看,工作已经完成,他们向您解释了如何检索/购买/和验证用户付款。但是,没有说明如何在应用程序启动期间记住付款并解锁付费功能。

该文档指出:

要检索有关用户从您的应用购买的信息,请调用 queryPurchases()

所以看起来应用程序不需要记住任何东西,只需queryPurchases()在启动时调用并检查 SKU 是否存在(用户已经付费)或不存在(用户仍然没有购买应用程序的付费版本)。

所以我的应用程序就是这样做的,queryPurchases()在启动时调用并检查 SKU 是否存在。这种方法效果很好,即使应用程序离线启动。然而,一些用户感叹应用程序有时无法以付费模式启动,因为(我调试了代码)该功能queryPurchases()在设备离线时(有时)会失败。难道queryPurchases()是调用本地 Google Play 缓存,由于某种原因可能会丢失以前的购买记录?(缓存清除等...)

在应用启动时记住用户购买和启用付费功能的合适方法是什么?

4

2 回答 2

5

您可以将自己的“缓存”(SharedPreferences 或数据库)onPurchasesUpdatedqueryPurchaseHistoryAsync. 当应用程序首次启动时,如果您的缓存告诉用户购买了产品,您可以显示付费内容,并同时调用queryPurchaseHistoryAsync以获取用户为每个 SKU 进行的最新购买,此时onPurchaseHistoryResponse您可以更新缓存并隐藏如果购买过期,付费内容。

还要考虑到出于安全目的,建议在您的后端进行购买验证。

如果您不想管理自己的服务器,则可能值得使用像RevenueCat这样的工具,它提供购买/订阅后端即服务。

于 2019-01-25T19:11:51.010 回答
2

它多久发生一次?我的看法是 Google Play 客户端负责缓存,因此如果您只是依赖此服务,则没有直接的方法来处理它。如果用户重新安装或更改他们的设备,这可能会导致麻烦。

另一种方法是构建您自己的后端,如果您想扩展您的应用程序,这将是必要的。

于 2019-01-15T13:34:15.883 回答