首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >应用内购买。无法再次购买。物品响应:"7件物品已经拥有“

应用内购买。无法再次购买。物品响应:"7件物品已经拥有“
EN

Stack Overflow用户
提问于 2020-10-29 23:31:54
回答 1查看 117关注 0票数 2

当我第二次尝试通过相同的消耗品时,我就会意识到这个问题。第一次做得很好,但我不能再买了。我正在测试账单,我不支付真实的,但我正在使用测试卡。有人能帮我解决这个问题吗?谢谢

下面是我的代码:

代码语言:javascript
复制
private fun setupBillingClient() {
    billingClient = BillingClient.newBuilder(Dodgers.context!!)
        .enablePendingPurchases()
        .setListener(this@ShopFragment)
        .build()
    billingClient.startConnection(object : BillingClientStateListener {
        override fun onBillingSetupFinished(billingResult: BillingResult) {
            if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
                // The BillingClient is setup successfully
                loadAllSKUs()
            }
        }

        override fun onBillingServiceDisconnected() {
            // Try to restart the connection on the next request to
            // Google Play by calling the startConnection() method.
            Log.e("billing", "error")
        }
    })
}

    private fun loadAllSKUs() = if (billingClient.isReady) {
    val params = SkuDetailsParams
        .newBuilder()
        .setSkusList(skuList)
        .setType(BillingClient.SkuType.INAPP)
        .build()
    billingClient.querySkuDetailsAsync(params) { billingResult, skuDetailsList ->
        // Process the result.
        if (billingResult.responseCode == BillingClient.BillingResponseCode.OK && skuDetailsList!!.isNotEmpty()) {
            this.skuDetailsList = skuDetailsList
        }
    }
} else {
    println("Billing Client not ready")
}

ONCLICK项目:

代码语言:javascript
复制
private fun startBillingAction(shop: Shop) {
    if (skuDetailsList.isNotEmpty()) {
        val skuDetails = skuDetailsList.first { it.sku == shop.sku }
        val billingFlowParams = BillingFlowParams
            .newBuilder()
            .setSkuDetails(skuDetails)
            .build()
        billingClient.launchBillingFlow(requireActivity(), billingFlowParams)
    } else {
        showSnackBar(shop.unit)
    }
}

    override fun onPurchasesUpdated(
    billingResult: BillingResult,
    purchases: MutableList<Purchase>?
) {
    if (billingResult.responseCode == BillingClient.BillingResponseCode.OK && purchases != null) {
        for (purchase in purchases) {
            acknowledgePurchase(purchase.purchaseToken, purchase.sku) <==================== HERE FIRST TIME
        }
    } else if (billingResult.responseCode == BillingClient.BillingResponseCode.USER_CANCELED) {
        // Handle an error caused by a user cancelling the purchase flow.
        Log.e("billing", "error")
    } else {
        // Handle any other error codes.
        Log.e("billing", "error") <==================== HERE SECOND TIME WITH RESPONCE CODE 7
    }
}

    private fun acknowledgePurchase(purchaseToken: String, sku: String) {
    val params = AcknowledgePurchaseParams.newBuilder()
        .setPurchaseToken(purchaseToken)
        .build()
    billingClient.acknowledgePurchase(params) { billingResult ->
        val responseCode = billingResult.responseCode
        val debugMessage = billingResult.debugMessage

        //STUFF IF CORRECT
    }
}

我有6个项目。我可以正确地购买每一件物品,但如果我再次尝试,我总是遇到同样的问题,文档也没有帮助!

编辑:

根据建议,我需要消费物品。因此,我必须将acknowledgePurchase函数修改为:

代码语言:javascript
复制
private fun acknowledgePurchase(purchase: Purchase, sku: String) {
    val params = AcknowledgePurchaseParams.newBuilder()
        .setPurchaseToken(purchase.purchaseToken)
        .build()
    billingClient.acknowledgePurchase(params) { billingResult ->
        val responseCode = billingResult.responseCode
        val debugMessage = billingResult.debugMessage

        CoroutineScope(Dispatchers.Main + exceptionHandler).launch {
            val gemItem = Gem.values().find { it.sku == sku }
            DataManager.instance.user.value!!.gems += gemItem!!.reward
            // TODO add gem animations
            gem_value.text = DataManager.instance.user.value!!.gems.toString()
        }

        // Verify the purchase.
        // Ensure entitlement was not already granted for this purchaseToken.
        // Grant entitlement to the user.
        val consumeParams =
            ConsumeParams.newBuilder()
                .setPurchaseToken(purchase.purchaseToken)
                .build()

        billingClient.consumeAsync(consumeParams) { billingResult, outToken ->
            if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
                // Handle the success of the consume operation.
                LogHelper.log(TAG, "Item Consumed!!!")
            }
        }
    }
}

就是这样:-)。谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-30 01:26:14

购买项目后,您应该consume it以启用购买再次可用

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64594332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档