尊重 in-app 笔离线购买 + 删除已取消的购买

Honouring in-app purchases offline + removing cancelled purchases

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

很多关于 Stack Overflow 的讨论都已有 2 年多的历史,尚无定论,并且参考了已弃用的 AIDL 库,而不是 Google Play Billing Service。

我想确保用户可以离线访问我的 Android 应用程序的高级版本,该应用程序是通过 one-time non-consumable in-app 产品在 Google 播放。我还想防止客户在应用程序内购买升级,然后激活它 cancelling/requesting 购买退款并保留对高级功能的访问权限。

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

但是我也看到相互矛盾的报告,当客户离线时(例如在长途飞机旅行中)getPurchasesList() 后面的 Google 缓存最终会过期,这将导致客户无法访问优质内容。有些人声称 Google 缓存在大约 12 小时后过期,但是我将我的 phone 置于飞行模式 14 小时并且仍然收到来自 getPurchasesList() 的响应,所以这些说法可能已经过时了。

当 google 计费缓存过期时,响应的结构是什么?从客户没有购买任何商品或已退款的回复中可以看出这一点。假设当缓存过期时我们从 Google 得到一个空响应,我们如何确定两者之间的区别:

关于这个重要场景、缓存生命周期、如何测试它等的官方文档似乎很少,除非我在某处遗漏了一些东西。

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

恕我直言,本地存储 getPurchasesList() 响应绝对没问题。 我再详细说明一下。

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

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

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

我也同意你的看法,Google 没有提供足够的信息来说明如何处理边缘情况,它们只是展示了一切都完美运行的快乐情况。

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