Android Google BillingClient 如何获取未消耗的物品?

Tob*_*ich 5 android in-app-purchase in-app-billing android-inapp-purchase

问题:使用 Google Play BillingClient 1.1 我怎样才能只获得消费的购买?

背景:

在我们的 Android 应用程序中,我们希望使用新的

com.android.billingclient:billing:1.1
Run Code Online (Sandbox Code Playgroud)

这个想法是使用

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]"
}
Run Code Online (Sandbox Code Playgroud)

所以没有什么似乎是消费状态。

---- 编辑 2 ----

我找到了一个(坏的)解决方案。当尝试消费购买时,谷歌用它的返回码告诉我它是否已经消费。但这对我们来说不是一个解决方案,因为我们希望将其“标记为未消费”,直到它在我们的服务器上被兑换。

Tob*_*ich 5

好吧,我想我找到了答案。如果你和我有同样的问题,这里是解决方案:

billingClient 有两个方法调用。

  • 第一个是

billingClient.queryPurchaseHistoryAsync().

这个异步调用(需要互联网)正在获取用户最近 11 次购买的历史记录。最新的是第一个(列表的元素 0)。然而,这显示了所有购买——无论它们是否被消费。所以如果你想知道他们的状态,你不能在这里做。如果您有后端系统(和有效的网络连接),您可以将它们全部发送到服务器并验证它们。由于我们的应用程序是“离线优先”,这对我们的用户来说并不总是可行的。

但是,您可以在尝试再次购买时检查这一点。调用 billingClient.launchBillingFlow() 将返回 responseCode ITEM_ALREADY_OWNED (7) 但您不想等待用户再次尝试购买。特别是因为我们希望即使没有互联网连接也能保证购买。

  • 解决方法是另一种方法。

BillingClient 提供:

billingClient.queryPurchases(BillingClient.SkuType.INAPP)
Run Code Online (Sandbox Code Playgroud)

这将返回先前购买的缓存列表。API将此声明为

获取在您的应用内购买的所有商品的购买详情。

然而,这似乎只返回非消耗项目的列表。通过这种方式,您可以从所有(最近)购买的列表中获取未消耗的物品。但是请注意,这是由 Playstore 缓存的。如果您需要确切的数据,您仍然需要与谷歌服务器建立连接(当 Playstore 缓存被清除等时)。

这提供了所有购买历史记录的选项,以及有关非消费项目的附加信息,这使您的应用程序(部分)离线可用。

至少这是我想出的最好方法,但它似乎有效。如果您有任何更正或更好的解决方案,请告诉我!!!