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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Honouring应用内购买离线+删除已取消的购买相关的知识,希望对你有一定的参考价值。

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

关于堆栈溢出的许多讨论都已经有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计费中更新一次,否则您将失去访问权限,但这真的是正确的方法吗?

答案
恕我直言,本地存储getPurchasesList()响应绝对正确。我会详细说明。

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

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

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

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

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

以上是关于Honouring应用内购买离线+删除已取消的购买的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中取消或退款已购买的消耗品应用内购买?

itunesconnect - 应用内购买产品 ID 已更改

Android 应用内结算:退款的应用内购买未取消

已退款的应用内购买订阅是不是显示为已过期? [关闭]

Apple iOS 应用内购买服务器到服务器通知的“取消”通知案例?

由于应用内购买而被应用商店拒绝