在我的Android应用中查询InApp购买情况

时间:2019-01-15 12:08:21

标签: android google-play in-app-purchase android-inapp-purchase sku

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

我已在https://developer.android.com/google/play/billing/billing_library_overview#java

上广泛阅读了该指南。

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

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

这就是令人困惑的地方。从Google文档的角度来看,这项工作已经完成,他们向您解释了如何检索/购买/验证用户付款。但是,在任何地方都没有说明如何在应用启动期间记住付款并解锁付费功能。

文档指出:

  

要检索用户从您的购买中获得的信息   应用,请调用queryPurchases()

因此,似乎该应用程序不需要记住任何内容,只需在启动时调用queryPurchases()并检查是否存在SKU(用户已经为此付款),或者该SKU是否存在(用户仍未购买)应用的付费版本。

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

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

2 个答案:

答案 0 :(得分:4)

您可以使用onPurchasesUpdated的结果保留自己的“缓存”(SharedPreferences或DB),并使用queryPurchaseHistoryAsync。当应用首次启动时,如果您的缓存告诉用户购买了该产品并同时致电queryPurchaseHistoryAsync,则您可以显示付费内容,当{{1 }},如果购买已过期,您可以更新缓存并隐藏付费内容。

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

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

答案 1 :(得分:2)

它多久发生一次?我认为Google Play客户端会负责缓存,因此,如果您仅依赖此服务,则没有直接的方法来处理它。如果用户重新安装或更改其设备,可能会引起麻烦。

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