Android Google BillingClient如何获取未消费的元素?

标签 android in-app-purchase in-app-billing android-inapp-purchase

问题:使用 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/

相关文章:

使用同一测试帐户在多台设备上进行 Android 应用内结算 v3 测试

java - Android - 如何从一张大位图创建小位图?

javascript - 在 Android 服务中运行 JavaScript

Android 2.2 实现 Runnable Public void run() 未被调用

Android - NotificationCompat.Builder 堆叠通知与 setGroup(group) 不工作

android - 如何在本地最好地保存应用内购买状态?

android - 取消应用程序自动续订订阅android

android - 更新后应用内计费不起作用 - Google 商店

ios - 尝试购买时应用内购买崩溃

iphone - 自动续订订阅在自动续订时是否会发送 SKPaymentTransactionStatePurchased 交易?