【问题标题】:Android - BillingClient returns empty purchases listAndroid - BillingClient 返回空的购买列表
【发布时间】:2022-08-09 01:40:57
【问题描述】:

我的一些用户告诉我,我的应用程序时不时会忘记购买的订阅。它可以工作 3-4 天,然后就会忘记它们。这是一个非常重要的问题,因为用户可能会怀疑欺诈。我正在使用计费库 4.0.0,并且按照 Google 的指南实施了计费逻辑。

从我收集到的情况来看,当由于某种原因计费服务连接被中断时,就会发生这种情况。 (例如 Play 商店正在更新)

我设法通过以下方式复制了这种情况

- Disable internet connection
- Clearing Play Store app data
- Fresh launch of my app.
- Call billingClient.startConnection()
    onBillingSetupFinished called with responseCode BILLING_UNAVAILABLE
    user sees -> The app says \"no subscription purchased\"

- Enable internet connection
- re-initialize BillingClient.
    onBillingSetupFinished called with responseCode OK. billingClient.isReady() returns true. 
- Call billingClient.queryPurchasesAsync() and billingClient.querySkuDetailsAsync().
    onSkuDetailsResponse is called with the skuDetailsList filled with all the proper data. However:
    onQueryPurchasesResponse is called with empty purchase list -> Again user sees \"no subscriptions purchased\"

重要的如果此时我打开 Play 商店,它会显示购买的订阅。但该应用程序仍然获得一个空的购买清单。

如果我在大约 10 分钟后的某个时间点继续致电 billingClient.startConnection()billingClient.queryPurchasesAsync(),则一次尝试将成功并返回非空的购买列表。

是否可以告诉 Play 商店为我的应用刷新其订阅数据?有人如何优雅地处理这种情况?

  • 您可以尝试将购买状态保存在本地存储中,例如 DataStoreEncryptedSharedPreferences
  • @DarShan 是的,我考虑过这一点,如果找不到更好的解决方案,我最终可能会这样做。但这基本上是一种绕过应该正常工作但没有正常工作的东西的技巧。正确的解决方案是让计费逻辑工作,因为它应该只依赖于 BillingClient。
  • 抱歉不行。我只是手动处理它。当我成功获得购买时,我将它们保存在本地并带有时间戳。当我遇到本地购买不为空但计费客户端返回空列表的情况时,我相信本地数据,只要它们不太旧。到本地数据“过期”时,计费客户端应该已经恢复到工作状态。当检测到这种情况时,我会继续重试每 1 分钟刷新一次购买最多 20 分钟

标签: android in-app-purchase in-app-billing billingclient


【解决方案1】:

每次购买都需要致电acknowledgePurchase
有关详细信息,请参阅 the official docsthe article

【讨论】:

  • 是的,我知道,我正在这样做。计费流程按照 Google 的指南实施。当出于某种原因 Play 商店由于某种原因无法以正确的数据响应时,就会出现问题。经过几次重试或一段时间后,它最终会返回正确的数据。但这对应用程序和用户来说是个问题
【解决方案2】:

为我工作!

BillingClient billingClient = ...;

billingClient 必须准备好 -> billingClient.isReady() == true;

因此,请始终从以下位置调用 billingClient.queryProductDetailsAsync(...)

                @Override
                public void onBillingSetupFinished(BillingResult billingResult) {
                    if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                        // The BillingClient is ready. You can query purchases here.
                        queryProductDetails();
                        queryPurchases();
                    }
                }

初始化 billingClient 连接时!保持 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-28
    • 2021-10-04
    • 1970-01-01
    • 2018-09-29
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多