问题:使用 Google Play BillingClient 1.1 如何才能只获得未消费的购买?
背景:
在我们的 Android 应用程序中,我们想使用新的更改“旧的”计费库(使用示例中的 V.3 IabHelper.java 类)
com.android.billingclient:billing:1.1
这个想法是使用
BillingClient.queryPurchases(BillingClient.SkuType.INAPP)
为了获得用户所有购买的“历史记录”。这就是 API 告诉我们的 ( https://developer.android.com/reference/com/android/billingclient/api/BillingClient.html#queryPurchases(java.lang.String) ) 并且它工作正常。 在旧版本中,人们只会获得未消费的元素,这对“购买历史”之类的东西毫无用处。但是如果我想知道是否有未消费的元素,我就无法再获得该信息。
与 queryPurchaseHistoryAsync()
相同。
Purchase 对象似乎不包含有关其消费的任何信息。 我怎样才能只获取未消费的项目(或至少过滤它们)?
请注意,我知道购买最终必须在我们的服务器端进行管理。然而,在这成功之前,最好知道哪些项目已经“兑换”(消费)了。所以我不能只依赖我们的后端。
----编辑----
来自查询的购买对象 (JSON) 如下所示:
{
"orderId": "[Id]",
"packageName": "[just the app's package]",
"productId": "[the SKU name]",
"purchaseTime": 1531224460215,
"purchaseState": 0,
"purchaseToken": "[a purchase token]"
}
所以没有任何东西看起来是消费状态。
---- 编辑 2 ----
我找到了一个(不好的)解决方案。当尝试消费购买时,谷歌告诉我它的返回码是否已经消费。但这对我们来说不是解决方案,因为我们希望在我们的服务器上将其兑换之前将其“标记为未使用”。
最佳答案
好的,我想我找到了答案。如果您遇到与我相同的问题,这里是解决方案:
billingClient 有两个方法调用。
- 第一个是
billingClient.queryPurchaseHistoryAsync()
。
此异步调用(需要互联网)正在获取用户最近 11 次购买的历史记录。最新的是第一个(列表的元素 0)。 然而,这显示了所有购买 - 无论它们是否被消费。所以如果你想知道他们的状态,你不能在这里做。 如果您有后端系统(和有效的网络连接),您可以将它们全部发送到服务器并验证它们。由于我们的应用程序是“离线优先”,这对我们的用户来说并不总是可行的。
不过,您可以在尝试再次购买时检查此项。调用 billingClient.launchBillingFlow() 将返回 responseCode ITEM_ALREADY_OWNED (7) 但您不想等待用户再次尝试购买它。特别是因为即使没有互联网连接,我们也想保证购买。
- 解决方案是另一种方法。
BillingClient 提供:
billingClient.queryPurchases(BillingClient.SkuType.INAPP)
这将返回以前购买的缓存列表。 The API声明为
Get purchases details for all the items bought within your app.
然而,这似乎只返回了一个包含未消耗元素的列表。这样您就可以从所有(最近)购买的列表中获取未消耗的元素。但是请注意,这是由 playstore 缓存的。如果您需要准确的数据,您仍然需要与谷歌服务器建立连接(在清除 Playstore 缓存等情况下也是如此)。
这提供了所有购买历史的选项,以及有关未消耗元素的附加信息,这使您的应用(部分)离线可用。
至少这是我想到的最好的方法,但它似乎有效。 如果您有任何更正或更好的解决方案,请告诉我!!!
关于Android Google BillingClient如何获取未消费的元素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51264669/