android - Android Google BillingClient 如何获取未消费项目?
问题描述
问题:使用 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()
.
购买对象似乎不包含有关其消费的任何信息。我怎样才能只获得未消费的物品(或至少过滤它们)?
请注意,我知道购买最终必须在我们的服务器端进行管理。然而,在这成功之前,最好知道哪个项目已经“兑换”(消费)了。所以我不能只依赖我们的后端。
- - 编辑 - -
来自查询的购买对象 (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()
.
此异步调用(需要 Internet)正在获取用户最近 11 次购买的历史记录。最新的是第一个(列表的元素 0)。然而,这显示了所有购买 - 无论它们是否被消费。所以如果你想知道他们的状态,你不能在这里做。如果您有一个后端系统(和一个有效的网络连接),您可以将它们全部发送到服务器并验证它们。由于我们的应用是“离线优先”的,这对我们的用户来说并不总是可行的。
但是,当您再次尝试购买它们时,您可以检查这一点。billingClient.launchBillingFlow() 的调用将返回 responseCode ITEM_ALREADY_OWNED (7) 但您不想等待用户再次尝试购买它。特别是因为我们希望即使没有互联网连接也能保证购买。
- 解决方案是另一种方法。
BillingClient 提供:
billingClient.queryPurchases(BillingClient.SkuType.INAPP)
这将返回以前购买的缓存列表。API 将其声明为
获取在您的应用内购买的所有商品的购买详情。
然而,这似乎只返回了一个未消费项目的列表。通过这种方式,您可以从所有(最近)购买的列表中获取未消耗的物品。但是请注意,这是由 playstore 缓存的。如果您需要确切的数据,您仍然需要与 google 服务器建立连接(在清除 playstore 缓存时等)。
这提供了所有购买历史的选项以及有关未消费项目的附加信息,这使您的应用程序(部分)离线可用。
至少这是我想出的最好的方法,但它似乎有效。如果您有任何更正或更好的解决方案,请告诉我!!!
推荐阅读
- java - 为什么这种排序算法不起作用?
- mapping - 调用映射getter时Solidity函数错误的参数数量无效
- javascript - Redux - 我的操作没有调用我的减速器
- c++ - nullptr 是如何定义的?
- c - C 程序中的 Gnuplot - 仅允许绘制特定长度的文件
- ruby - capistrano 安装在 ubuntu 18.04 中不起作用
- python - 如何将使用 google oauth 的访问权限限制在一个特定的域
- vue.js - JQuery 在“this”div 中不起作用
- php - PHP PDO 准备和执行
- python - OpenCV/Python - 按边界框面积查找异常值