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

Gia*_*ini 1 android in-app-purchase google-play sku android-inapp-purchase

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

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

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

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

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

该文件指出:

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

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

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

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

Ces*_*sar 5

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

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

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