我在退款后尝试重新购买 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应用内计费流程中的一个众所周知的问题。解决这个问题的一种方法是消费购买的商品,这样您就可以重新购买该商品。
但是,您也可以修改“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}")
}
}
}