21

我现在正在使用新的 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 上指定的 Product ID 相同。

有谁知道原因?谢谢!!

4

9 回答 9

15

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

于 2018-12-15T17:11:55.467 回答
13

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

请检查:

  • 您的应用已在 Play 管理中心发布(到 PROD 或您的 @gmail 帐户在用户的 alpha/beta 组中)
  • 具有正确的签名和测试应用程序的版本代码等于发布的一个
  • 您的所有 SKU 也已发布
  • 您的 Play 商店应用在您正在测试的手机上正常运行(例如,允许您购买应用)

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

于 2017-10-19T01:27:12.973 回答
12

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

  • 停止 Google Play 应用
  • 删除 Google Play 应用的缓存
  • 停止应用程序并启动它
于 2018-11-09T07:52:05.820 回答
7

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

您手机上的本地 Google Play 商店应用会缓存 SKU 详细信息,而 Google 的服务器端也会缓存它们。(“计算机科学中只有两件难事:缓存失效和命名。”

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

由于涉及到时间因素,因此很难知道什么有帮助,什么没有,但这对我有用。

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

    设置至少一名测试人员,获取选择加入链接(这需要等待您的应用完成“待发布”),然后选择加入。

  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 文件;您可以在其中四处寻找。)
于 2019-05-25T01:58:59.717 回答
3

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

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

总帐

资源

于 2019-08-05T20:26:47.313 回答
1

你不需要上传你的apk。

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

确保产品或订阅处于活动状态。

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

于 2018-07-07T14:41:38.140 回答
1

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

于 2020-03-26T11:33:25.563 回答
0

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

于 2019-11-29T17:13:32.447 回答
0

这也可能发生在应用内购买不可用的国家(古巴、中国等)的用户身上

Pricing & distribution从播放控制台检查国家/地区状态

于 2020-03-04T20:49:28.787 回答