我在退款进行内部测试后重新购买 Google Play 应用内商品时遇到问题,如何解决该问题?

问题描述 投票:0回答:1

我在退款后尝试重新购买 Google Play 应用内商品时,在应用的内部测试过程中遇到了问题。该应用程序目前已发布到内部测试频道。

最初,我出于测试目的使用以下代码成功购买了 Google Play 应用内商品。然而,当我从 Google Play 控制台退款并尝试重新购买该商品以进行进一步测试时,我遇到一条警告消息,指出“您已拥有该商品。”

据我所知,即使在退款后,Google Play 也会将已购买的商品标记为 PurchaseState.PURCHASED。尽管如此,我需要找到一种方法以编程方式重新购买 Google Play 应用内商品以进行内部测试。

这是我处理购买的相关代码片段:

private fun processPurchases(purchasesResult: Set<Purchase>) {
    val validPurchases = HashSet<Purchase>(purchasesResult.size)
    purchasesResult.forEach { purchase ->
        if (purchase.purchaseState == Purchase.PurchaseState.PURCHASED) {
            if (purchase.skus.contains(purchaseItem)) {  
                if (isSignatureValid(purchase)) {
                    validPurchases.add(purchase)
                }
            }
        } else if (purchase.purchaseState == Purchase.PurchaseState.PENDING) {
            Log.e(LOG_TAG, "Received a pending purchase of SKU: ${purchase.skus}")
            // Handle pending purchases, e.g., confirm with users about the pending
            // purchases, prompt them to complete it, etc.
            mContext.toast(R.string.msgOrderPending)
        } else {
            mContext.toast(R.string.msgOrderError)
        }
    }

    acknowledgeNonConsumablePurchasesAsync(validPurchases.toList())
}
android kotlin android-studio google-play in-app-purchase
1个回答
0
投票

这是退款后Android应用内计费流程中的一个众所周知的问题。解决这个问题的一种方法是消费购买的商品,这样您就可以重新购买该商品。

但是,您也可以修改“consumeAsync”方法以实际消费购买。我假设您在调用“consumeAsync”方法之前已经在代码中初始化了“BillingClient”。

private fun processPurchases(purchasesResult: Set<Purchase>) 
{
    val validPurchases = HashSet<Purchase>(purchasesResult.size)
    purchasesResult.forEach { purchase ->
        if (purchase.purchaseState == Purchase.PurchaseState.PURCHASED) 
        {
            if (purchase.skus.contains(purchaseItem)) 
            {  
                if (isSignatureValid(purchase)) 
                {
                    validPurchases.add(purchase)
                    
                    // Check if the purchase needs to be consumed
                    if (!purchase.isAcknowledged) 
                    {
                        consumePurchase(purchase)
                    }
                }
            }
        } 
        else if (purchase.purchaseState == Purchase.PurchaseState.PENDING) 
        {
            Log.e(LOG_TAG, "Received a pending purchase of SKU: ${purchase.skus}")
            // Handle pending purchases, e.g., confirm with users about the pending
            // purchases, prompt them to complete it, etc.
            mContext.toast(R.string.msgOrderPending)
        } 
        else 
        {
            mContext.toast(R.string.msgOrderError)
        }
    }
    acknowledgeNonConsumablePurchasesAsync(validPurchases.toList())
}

private fun consumePurchase(purchase: Purchase) 
{
    val consumeParams = ConsumeParams.newBuilder()
        .setPurchaseToken(purchase.purchaseToken)
        .build()

    billingClient.consumeAsync(consumeParams) 
    { 
        result, _ ->
        if (result.billingResult.responseCode == BillingClient.BillingResponseCode.OK) 
        {
            Log.d(LOG_TAG, "Purchase consumed successfully: ${purchase.skus}")
        } 
        else 
        {
            Log.e(LOG_TAG, "Failed to consume purchase: ${result.billingResult.debugMessage}")
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.