Android Play计费库:onSkuDetailsResponseCode为0,但skuDetailsList的大



我现在正在使用新的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);
}

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

有人知道原因吗?谢谢

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

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

我花了几个小时处理这个问题,问题是我的调试构建/CI构建有applicationIdSuffix。因此,只有具有适当applicationId的生产构建才能检索产品。

听起来你的Google Play控制台设置有问题。

请检查:

  • 您的应用程序在Play控制台中发布(到PROD或您的@gmail帐户在用户的alpha/beta组中)
    • 我还建议将您的test@gmail帐户添加到许可证测试人员列表中,以避免收费和许可证问题
  • 具有正确的签名,测试应用程序的版本代码与发布的版本代码相同
  • 您的所有SKU也已发布
  • 你的Play Store应用程序在你测试的手机上正常工作(例如,允许你购买应用程序)

安装完成后等待一段时间。

核心问题是Google缓存您的SKU详细信息,并且存在多层缓存。

你手机上的本地Google Play Store应用程序会缓存SKU详细信息,谷歌的服务器端也会缓存这些信息。("在计算机科学中只有两件困难的事情:缓存失效和命名。")

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

由于涉及到时间因素,很难知道什么有帮助,什么没有帮助,但以下是对我有效的方法

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

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

  2. 强制停止并删除Google Play Store应用程序的缓存;"应用程序";设置应用程序的部分。点击";存储";以访问";清除缓存";按钮

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

…但别担心,你不必每次都这样测试。一旦Google Play Store缓存是最新的,您应该能够使用Android Studio在调试构建中访问SKU。

如果它在您的内部测试构建中不起作用

  1. 卸载应用程序,强制停止Google Play Store应用程序,清除其缓存,然后再次下载内部测试版本
  2. 还是没用?您的Google Play开发者控制台出现问题。也许你的产品还没有激活?也许您拼错了SKU列表中的SKU

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

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

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

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

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

GL-

您不需要上传您的apk。

你应该得到sku。即使在调试模式下进行测试,BillingClient也应该可以工作。

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

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

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

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

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

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

对于后来的谷歌用户,我的问题是我使用了一个无法支付测试应用程序费用的帐户。当我在测试设备上切换我的谷歌账户时,所有信息都如预期的那样出现了。要想快速的如果账户有支付能力,请尝试开通"最高支付";图表在谷歌播放商店,如果列表是空的,这个帐户肯定不会工作,不管怎样。

花了几天时间来查找这个问题。

最新更新