我有一个 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 缓存,由于某种原因可能会丢失以前的购买记录?(缓存清除等...)
在应用启动时记住用户购买和启用付费功能的合适方法是什么?