34

我正在使用 Play Billing Library 来触发和管理购买,这反过来又解锁了应用程序中的额外功能。这部分正在工作。

但是,“恢复”购买的最佳方式是什么。例如,购买了该应用程序的人购买了一部新手机。登录 Play 商店,下载我的应用程序,然后发现正在显示“升级”的支付屏幕。iOS 对此有一种特定的方法,但我不知道有一种适用于 Android 的方法。

我的想法是查询Play商店并确认该帐户之前是否成功购买过该物品,如果是,我将调用应用程序内的本地升级功能。

似乎有两种类似的方法。但是在这种情况下我应该使用哪一个?用户在哪里擦除了手机或购买了新手机?

queryPurchases()? 或者queryPurchaseHistoryAsync()

4

3 回答 3

23

你应该使用queryPurchases. 这将为您提供每个 SKU 的所有当前有效(未消费、未取消、未过期)购买。

queryPurchaseHistoryAsync不会做您需要的事情,因为它只会为您提供每个 SKU 的最新购买列表。它们可能已经过期、被取消或被消耗,而且无法判断。因此,此响应不能用于说明要在您的应用中应用哪些购买。

据我所知,唯一有效的用途queryPurchaseHistoryAsync是为用户提供他们的购买历史列表。这有点奇怪。

另请注意:queryPurchases是同步的,因此在大多数情况下,它需要在某种后台工作线程中运行。我在一个AsyncTask.

于 2018-03-07T22:48:15.883 回答
15

每个文档queryPurchases使用 Play 商店应用程序缓存来获取结果,同时queryPurchaseHistoryAsync实际检查购买 AP 以获取最近的购买。因此,在您的情况下,您应该检查该Async方法。

queryPurchases

获取在您的应用内购买的所有商品的购买详情。此方法使用 Google Play Store 应用程序的缓存,无需发起网络请求。

queryPurchaseHistoryAsync

返回用户为每个 SKU 进行的最近一次购买,即使该购买已过期、取消或消耗。

另外,请务必检查文档。它建议Cache purchase details on your servers. https://developer.android.com/google/play/developer-api.html#practices

于 2018-03-06T15:06:07.847 回答
5

我知道这有点晚了,但我自己发现了这一点。分享我的答案让其他人受益。

所以我了解到它queryPurchases()在您的设备上本地缓存,但在您调用时会更新queryPurchaseHistoryAsync()

我从这里的 Stackoverflow 答案中发现

所以我的解决方案是,当想要在新设备上恢复购买或全新安装我的应用程序时。调用queryPurchaseHistoryAsync()然后在回调onPurchaseHistoryResponse()调用中queryPurchases()查找用户过去购买List<Purchase>PurchasesResult任何购买状态。

如果有预期购买,您的应用可以授予他们过去购买的权利。

于 2021-05-25T17:24:44.860 回答