Android Play Billing Library:onSkuDetailsResponse responseCode为0,但skuDetailsList的大小也为0

The*_*ska 8 android android-billing android-inapp-purchase play-billing-library

我现在正在使用新的Play Billing Library

基本上,我按照文档查询要购买的可用项目

 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);
                        }
Run Code Online (Sandbox Code Playgroud)

但是,responseCode为0,列表也为空.但我检查了BillingSetupFinished是否成功.提供给SkuDetailsParams.Builder的skuList不为空,skuList(sku_id)中的值也与Google Play控制台上指定的产品ID相同.

有谁知道原因?谢谢!!

goR*_*Gon 10

听起来您的Google Play控制台设置存在问题.

请检查:

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

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

  • 谢谢!!最后,我可以查询这些项目,因为我没有把应用程序放到Play Console,只是测试了发布apk.但我很好奇为什么代码实验室样本(https://codelabs.developers.google.com/codelabs/play-billing-codelab)可以直接查询应用内商品而无需在Play控制台中发布应用程序. (2认同)
  • 是否有必要发布未完成的应用程序只是为了测试您的应用内购买?Google 是否有必要审核您未完成的应用程序,以便您可以在应用程序购买中进行测试?这似乎没有意义。您应该能够在应用程序购买中进行测试而无需发布它。所以我不知道这个答案是否正确,或者谷歌只是犯了这个缺陷。 (2认同)
  • 谷歌是一个很大的缺陷 - 他们删除了我的应用程序,只包含内部测试 apk - 正是为了 iap 目的,因为它已经(禁用)了广告库,恕我直言,没有为不被谷歌禁止而付费。所以,是的,你必须发布 apk 来进行测试,是的,如果他们愿意,他们会禁止你的应用程序,甚至是内部应用程序。 (2认同)

tak*_*rom 10

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

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

  • 也解决了我的问题。 (2认同)

hra*_*ach 5

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


Dan*_*ich 5

核心问题是谷歌缓存了你的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 Store 应用程序,清除其缓存,然后再次下载内部测试版本。
  2. 还是行不通?您的 Google Play 开发者控制台出了点问题。也许您的产品尚未激活?也许您拼错了 SKU 列表中的 SKU?

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

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

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