在我的项目中,我试图整合新版本(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
,它工作了。
我错过了什么?任何建议赞赏。
3条答案
按热度按时间csga3l581#
所以,最终在我的情况下,这是一个配置问题,我需要做一些更改(只是为了调试,这不应该在生产中)
(1)
1.删除这一行(如果有)
z5btuh9x2#
我刚刚迁移到V5,它对我很有效。
对于
queryPurchasesAsync
,您确定您有订阅产品吗?你传入BillingClient.ProductType.SUBS
作为产品类型?也许这应该是BillingClient.ProductType.INAPP
。否则代码看起来没问题。对于
queryProductDetailsAsync
,您在循环中多次调用它,而不是在productList
填充后调用它。而且let
也是不必要的,没有理由创建一个新的作用域。使用map
可以将代码简化为:注意我使用了
BillingClient.ProductType.INAPP
。如果您有订阅,则需要将其更改为BillingClient.ProductType.SUBS
。0mkxixxg3#
确保Productlist的ID是您的订阅产品ID,而不是计划ID。产品ID包含“_”,计划ID包含“-”。请勿点击并打开“查看订阅”页面,然后在其中复制计划ID。