离线接受应用内购买+删除已取消的购买

时间:2020-05-26 17:22:24

标签: android google-play in-app-purchase google-play-services mobile-application

这篇文章标题中涉及两个项目的方法似乎相互冲突并且很难测试,正是这些极端情况导致购买的产品停止工作时客户不满意。

关于Stack Overflow的许多讨论都已经有2年多的历史了,尚无定论,它们引用的是不推荐使用的AIDL库,而不是Google Play计费服务。

我想确保用户可以离线访问我的Android应用程序的高级版本,该高级版本是通过Google Play上一次性的非消耗性应用程序内产品购买的。我还想防止客户购买该应用程序中的升级,然后激活它,然后取消/要求退款,并保留对高级功能的访问权限。

文档指出,我们可以信任getPurchasesList()始终退回客户有权使用的产品:https://developer.android.com/google/play/billing/billing_library_overview

但是,我还看到一些相互矛盾的报告,即当客户下线时(例如,在长途旅行中),getPurchasesList()后面的Google缓存最终会过期,这将导致客户失去对高级内容的访问权限。有人声称Google缓存会在12个小时后过期,但是我将手机置于飞行模式14个小时,并且仍从getPurchasesList()获得响应,因此这些声明可能已过时。

当Google帐单缓存过期时,响应的结构是什么?从客户未进行任何购买或已退还购买商品的响应中可以看出。假设当缓存过期时,我们收到了来自Google的空响应,我们如何确定这些之间的区别:

  • getPurchasesList()不包含任何购买信息,因为客户从未进行过任何购买。
  • getPurchasesList()没有购买任何商品,因为客户获得了退款。
  • getPurchasesList()不包含任何购买商品,因为缓存已过期,因此客户确实购买了商品并拥有了该商品。

除非我在某处丢失了某些内容,否则关于此重要场景,缓存寿命,如何测试等的正式文档似乎很少。

我当然可以维护自己对客户购买的产品的缓存,例如存储一个令牌,令牌必须至少每3天从Google Billing更新一次,否则您将失去访问权限,但这真的是正确的方法吗?

1 个答案:

答案 0 :(得分:2)

恕我直言,在本地存储getPurchasesList()响应是绝对可以的。 我会详细说明。

这完全取决于您的威胁模型:对我而言,用户无法更改应用程序代码本身,也无法访问应用程序的私有存储。如果用户可以这样做,那么一切都会崩溃,因为用户可以愉快地删除或跳过限制应用程序功能的代码。

因此,鉴于用户无法更改应用程序或无法访问应用程序私有存储的威胁模型,您可以轻松缓存getPurchasesList()响应令牌并在设备离线时使用它。

很明显,对令牌的任何更新也必须反映到缓存中。 (例如过期或退款状态)

我也同意您的看法,即Google没有提供有关如何处理极端情况的足够信息,它们只是向人们展示了一切都可以正常运行的令人高兴的情况。

我必须承认,我没有彻底研究他们提供的示例应用程序: https://github.com/android/play-billing-samples