android google billing queryPurchasesAsync & queryProductDetailsAsync不返回任何结果

xwbd5t1u  于 2023-05-15  发布在  Android
关注(0)|答案(3)|浏览(709)

在我的项目中,我试图整合新版本(5.0)的谷歌计费库,我以下谷歌的例子
https://codelabs.developers.google.com/play-billing-codelab#3
例如,有两个功能:

fun queryPurchases() {
   if (!billingClient.isReady) {
       Log.e(TAG, "queryPurchases: BillingClient is not ready")
   }
   // Query for existing subscription products that have been purchased.
   billingClient.queryPurchasesAsync(
       QueryPurchasesParams.newBuilder().setProductType(BillingClient.ProductType.SUBS).build()
   ) { billingResult, purchaseList ->
       if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
           if (!purchaseList.isNullOrEmpty()) {
               _purchases.value = purchaseList
           } else {
               _purchases.value = emptyList()
           }

       } else {
           Log.e(TAG, billingResult.debugMessage)
       }
   }
}

它应该返回purchases that the user has previously made,另一个函数是

fun queryProductDetails() {
   val params = QueryProductDetailsParams.newBuilder()
   val productList = mutableListOf<QueryProductDetailsParams.Product>()
   for (product in LIST_OF_PRODUCTS) {

       productList.add(
           QueryProductDetailsParams.Product.newBuilder()
               .setProductId(product)
               .setProductType(BillingClient.ProductType.SUBS)
               .build()
       )

       params.setProductList(productList).let { productDetailsParams ->
           Log.i(TAG, "queryProductDetailsAsync")
           billingClient.queryProductDetailsAsync(productDetailsParams.build(), this)
       }
   }
}

结果我期望得到available products,然而,这两个函数返回空列表。
我知道这些产品和新的lib版本之前一样存在,我使用了以前的4.x.x,它工作了。
我错过了什么?任何建议赞赏。

csga3l58

csga3l581#

所以,最终在我的情况下,这是一个配置问题,我需要做一些更改(只是为了调试,这不应该在生产中)
(1)

...
    buildTypes {
        release {
            debuggable true
...

1.删除这一行(如果有)

...
applicationIdSuffix '.feature'
...
z5btuh9x

z5btuh9x2#

我刚刚迁移到V5,它对我很有效。
对于queryPurchasesAsync,您确定您有订阅产品吗?你传入BillingClient.ProductType.SUBS作为产品类型?也许这应该是BillingClient.ProductType.INAPP。否则代码看起来没问题。
对于queryProductDetailsAsync,您在循环中多次调用它,而不是在productList填充后调用它。而且let也是不必要的,没有理由创建一个新的作用域。使用map可以将代码简化为:

val products = inAppPurchaseProductIds.map { productId ->
   QueryProductDetailsParams.Product.newBuilder()
      .setProductId(productId)
      .setProductType(BillingClient.ProductType.INAPP)
      .build()
}

val params = QueryProductDetailsParams.newBuilder().setProductList(products).build()
billingClient.queryProductDetailsAsync(params, this)

注意我使用了BillingClient.ProductType.INAPP。如果您有订阅,则需要将其更改为BillingClient.ProductType.SUBS

0mkxixxg

0mkxixxg3#

确保Productlist的ID是您的订阅产品ID,而不是计划ID。产品ID包含“_”,计划ID包含“-”。请勿点击并打开“查看订阅”页面,然后在其中复制计划ID。

相关问题