播放结算库 - V3与异步vs同步 - 不同的结果

bra*_*all 10 android in-app-purchase in-app-billing android-billing play-billing-library

我的用户SkuType.INAPP已从我的应用程序中购买了items().

在前面推荐的在应用程序内结算的实施IabHelper.QueryInventoryFinishedListener会返回一个Inventory包含任何项目,他们所拥有.

在新的Play Billing Library中,我使用以下方法:

Purchase.PurchasesResult purchasesResult = mBillingClient.queryPurchases(BillingClient.SkuType.INAPP);
Run Code Online (Sandbox Code Playgroud)

假设响应代码成功,我查询:

purchasesResult.getPurchasesList()
Run Code Online (Sandbox Code Playgroud)

对于这一小部分用户,列表为空.

作为故障保护,对于上面的否定结果,我继续尝试:

mBillingClient.queryPurchaseHistoryAsync(BillingClient.SkuType.INAPP, this);
Run Code Online (Sandbox Code Playgroud)

onPurchaseHistoryResponse(final int responseCode, final List<Purchase> purchasesList)

成功详细购买.

对此感到困惑,我要求运行这两个实现的受影响用户确认以下内容:

  • 他们在设备上只有一个Google帐户
  • 一个帐户收到了购买确认电子邮件
  • 这是Google Play商店应用中唯一的帐户选项
  • Google Play商店应用"订单历史记录"详细介绍了购买情况

根据这个帖子的建议,我让他们:

  • 从Google Play商店应用中清除数据和缓存
  • 重启
  • 重新登录Google Play商店
  • 再次打开我的应用

尽管如此,仍然只能queryPurchaseHistoryAsync正确识别他们的帐户拥有的项目.

问题:为什么?

结算图书馆实现状态:

queryPurchaseHistoryAsync()返回用户为每个SKU进行的最新购买,即使该购买已过期,取消或已消耗.尽可能使用queryPurchases()方法,因为它使用本地缓存,而不是queryPurchaseHistoryAsync()方法.

我已在订单管理中确认购买有效且尚未取消.我不消耗它们,因此它们不能过期.

现在我有一个问题

鉴于对于这些用户我只能以上述方式识别他们的购买,我被迫为所有人实现这种故障保护.

除了因为必须这样做而感到沮丧之外,在您再次阅读之前,这似乎不是太大的问题:

queryPurchaseHistoryAsync()返回用户为每个SKU进行的最新购买,即使该购买已过期,取消或已消耗

因此,在我的标准实施中,我需要检查此购买是否仍然有效.

不幸的是,Purchase对象没有这样的方法来检查其有效性.

所以,我可能需要进行外部检查.


所有当我的应用程序启动时,我的逻辑决定是否显示广告.


救命.请.