为什么 Google Play 计费订阅会立即被取消?

问题描述

我已将 google play 计费库集成到我的应用程序中以进行订阅购买。它运作良好。用户收到来自谷歌的购买确认邮件confirmation mail from google

在 Play 商店订阅屏幕中也可以看到有效订阅Active subscription showing in play store

在游戏控制台中,订单详细信息表明用户已成功支付订阅费用。但是,它会立即取消。 play console order history

我还检查了购买确认,每次购买都返回 true。最初,我认为我的代码中会有错误。所以,我尝试了 Github 的各种计费库。问题仍然存在。最后,我用 Revenue cat 替换了整个 google billing library。遵循收入猫文档中描述的每一步。尽管如此,还是遇到了同样的问题。

是否有什么我遗漏或做错的地方?请帮帮我。谢谢

获取可用产品的代码

 private fun fetchOffering(){
    Purchases.sharedInstance.getofferingsWith({ error ->
        // An error occurred
        handleBillingError(requireActivity(),error)

    }) { offerings ->
        offerings.current?.availablePackages?.takeUnless { it.isNullOrEmpty() }?.let {
            // All packages from current offering

            if (it.isNotEmpty()){
                it.forEach { p: Package ->
                    offeringPackages.add(p)
                }
                isProductsAvailable = true
            }

            Log.d("RevenueCat","fetchOffering: success: ${it.size}")

        }
    }
}

购买代码

 private fun makePurchase(pack:Package){
    Purchases.sharedInstance.purchasePackageWith(
        requireActivity(),packagetoPurchase = pack /* package from the fetched Offering*/,onError = {error,userCancelled ->
            Log.d("RevenueCat","makePurchase: userCancelled: $userCancelled")
            handleBillingError(requireActivity(),error)
        },onSuccess = { product,purchaserInfo ->
            if (purchaserInfo.entitlements[REVENUE_ENTITLEMENT_ID_PRO]?.isActive == true) {
                Log.d("RevenueCat","makePurchase: success: ${product.originalJson} ")
                afterPurchaseSuccessSetup()
            }
        })
}

解决方法

我不知道你哪里落后了,你应该按照这些步骤进行订阅购买。

private lateinit var billingClient: BillingClient
private val skuListsubscribe = listOf("subscription_1","subscription_2")

初始化计费客户端。

 private fun setupBillingClient() {
    billingClient = BillingClient.newBuilder(BaseActivity.mContext!!)
        .enablePendingPurchases()
        .setListener(this)
        .build()
    billingClient.startConnection(object : BillingClientStateListener {
        override fun onBillingSetupFinished(billingResult: BillingResult) {
            if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {
                // The BillingClient is ready. You can query purchases here.


                loadAllSKUsSubscription()

            }
        }

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

private fun loadAllSKUsSubscription() = if (billingClient.isReady) {
    val params = SkuDetailsParams
        .newBuilder()
        .setSkusList(skuListsubscribe)
        .setType(BillingClient.SkuType.SUBS)
        .build()

    billingClient.querySkuDetailsAsync(params) { billingResult,skuDetailsList ->
        // Process the result.
        if (billingResult.responseCode == BillingClient.BillingResponseCode.OK && skuDetailsList!!.isNotEmpty()) {
            for (skuDetails in skuDetailsList) {
                if (skuDetails.sku == subscribtionId) {

                    tv_full_category_price.text = skuDetails.price
                    realAmountSubscription = skuDetails.price

                    rl_bestvalue_plan.setOnClickListener {
                        isInAppPurchase = false
                        isSubscribtion = true
                        val billingFlowParams = BillingFlowParams
                            .newBuilder()
                            .setSkuDetails(skuDetails)
                            .build()
                        billingClient.launchBillingFlow(requireActivity(),billingFlowParams)
                    }
                }
            }
        }
    }


} else {
    println("Billing Client not ready")
}

覆盖购买更新方法

override fun onPurchasesUpdated(
    billingResult: BillingResult,purchases: MutableList<Purchase>?,) {

   

    if (billingResult?.responseCode == BillingClient.BillingResponseCode.OK && purchases != null) {
        for (purchase in purchases) {

            acknowledgePurchase(purchase)

        }
    } else if (billingResult?.responseCode == BillingClient.BillingResponseCode.USER_CANCELED) {


        //logger("User Cancelled")
        //logger(billingResult?.debugMessage.toString())

  
    } else {
        //logger(billingResult?.debugMessage.toString())

    }
}

 private fun acknowledgePurchase(purchase: Purchase) {

    if (isSubscribtion) {

        handleNonConsumableProduct(purchase = purchase)
    } 
}

fun handleConsumableProduct(purchase: Purchase) {

    val consumeParams =
        ConsumeParams.newBuilder()
            .setPurchaseToken(purchase.purchaseToken)
            .build()

    billingClient.consumeAsync(consumeParams) { billingResult,purchaseToken ->

        if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) {

            if (isVisible && isAdded)
                Snackbar.MakeInternetSnackbar(BaseActivity.mContext!!,subscription_fragment_indicator_layout,"Purchased Successfully")

            InAppPaymentApi(realAmount.toString(),audio_id!!,purchase.purchaseToken)

        }
    }
}