Android Play Billing Library: onSkuDetailsResponse responseCode为0,但是skuDetailsList的size也为0

Android Play Billing Library: onSkuDetailsResponse responseCode is 0, but the size of skuDetailsList is also 0

我现在正在使用新的 Play 结算库

基本上,我按照文档查询了可购买的商品

 SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
            params.setSkusList(skuList).setType(itemType);
            mBillingClient.querySkuDetailsAsync(params.build(),
                    new SkuDetailsResponseListener() {

                        @Override
                        public void onSkuDetailsResponse(int responseCode,
                                                         List<SkuDetails> skuDetailsList) {
                            listener.onSkuDetailsResponse(responseCode, skuDetailsList);
                        }

然而,responseCode为0,列表也为空。但是我检查了 onBillingSetupFinished 是成功的。提供给 SkuDetailsParams.Builder 的 skuList 不为空,并且 skuList (sku_id) 中的值也与 Google Play Console 上指定的产品 ID 相同。

有谁知道原因吗?谢谢!!

听起来您的 Google Play 管理中心设置有问题。

请检查:

  • 您的应用已在 Play 管理中心发布(发布到 PROD 或您的@gmail 帐户在用户的 alpha/beta 群组中)
    • 我还建议将您的测试@gmail 帐户添加到 license testers list 以避免收费和许可证问题
  • 具有正确的签名并且测试应用的版本代码与已发布的相同
  • 您的所有 SKU 也已发布
  • 您的 Play 商店应用在您正在测试的 phone 上正常运行(例如,允许您购买应用)

设置完成后等待一段时间。

您不需要上传您的 apk。

你应该得到 skus。即使您在调试模式下测试 BillingClient 也应该可以正常工作。

确保产品或订阅有效。

给它一些时间。计费过程可能需要几个小时才能更新您的产品。

我也遇到了同样的问题,但是通过执行以下操作,我得到了 SkuDetails。

  • 停止Google播放应用程序
  • 删除 Google Play 应用的缓存
  • 停止并启动应用程序

我花了几个小时解决这个问题,问题是我的调试 build/CI 构建有 applicationIdSuffix。因此只有具有正确 applicationId 的生产构建才能检索产品。

核心问题是Google缓存了你的SKU详情,而且有多层缓存。

您 phone 上的本地 Google Play 商店应用会缓存 SKU 详细信息,Google 的 server-side 也会缓存它们。 ("There are only two hard things in Computer Science: cache invalidation and naming things.")

最终,如果您等待的时间足够长,缓存将过期并且 Google 将开始显示正确的信息。但是谁有时间呢?

由于涉及时间因素,所以很难知道什么有用什么没用,但这对我有用。

  1. 在内部测试轨道上设置您的 APK 版本。 (第一次执行此操作时,您必须等待您的应用完成“待发布”。等待本身可能会解决问题。)

    设置至少一个测试人员,获取 opt-in link(这需要等待您的应用完成“待发布”),以及 opt-in.

  2. 使用“设置”应用的“应用”部分强制停止并删除 Google Play 商店应用的缓存。单击“存储”以访问“清除缓存”按钮。

  3. 通过内部测试轨道下载一个应用程序版本。使用 android.util.Log 记录您的 SKU 详细信息,并使用 Logcat 验证您的 SKU 详细信息是否正确显示。

…但别担心,您不必每次都想测试就这样做。 Google Play 商店缓存更新后,您应该能够使用 Android Studio 在调试版本中访问您的 SKU。

如果它在您的内部测试版本中不起作用

  1. 卸载该应用程序,强制停止 Google Play 商店应用程序,清除其缓存,然后重新下载内部测试版本。
  2. 还是不行?您的 Google Play 开发者控制台出了点问题。也许您的产品尚未激活?也许您在 SKU 列表中拼错了 SKU?

如果它在您的内部测试版本中有效,但在同一设备上的调试版本中无效

在这种情况下,Google Play 商店缓存是正确的,但您的调试版本与您创建的内部测试版本有些不同。

  1. 确认您的调试版本使用与内部测试版本相同的包名。 applicationIdSuffix 是这里的常见罪魁祸首。
  2. 验证您的调试构建版本代码是否与您上传到内部测试的 APK 版本代码匹配。
  3. 尝试在不使用 Google Play 商店的情况下手动安装您的内部测试 APK。如果可行,则您有两个 APK,其中一个有效,另一个无效。检查它们是否存在差异。 (APK 是 zip 文件;您可以在那里四处寻找。)

如果应用程序中集成的产品是订阅,请确保设置 SkuType.SUBS 而不是 SkuType.INAPP

val skuDetailsParams = SkuDetailsParams.newBuilder()
    ...
    .setType(SkuType.SUBS)
    .build()

GL

Source

除了之前的答案外,当您在没有 Internet 连接的情况下执行搜索时,SkuDetailsList 可能为空。所以你也必须在你的代码中管理这种情况。

在应用内购买不可用的国家(古巴、中国等)的用户也会发生这种情况

在游戏控制台的 Pricing & distribution 部分查看国家/地区状态

您的应用必须在 Google Play 商店中获得批准,这可能需要长达 1 周的时间