升级Google Play Billing Library 3到4后,如何修复purchase.sku相关代码问题?
修复Billing Library 4.x下非消耗型购买自动退款问题
问题根源
你遇到的3分钟自动退款,本质是购买确认逻辑未被触发:Billing Library 4.x将Purchase.sku(单个字符串)改为Purchase.skus(List<String>),你原来用equals判断列表和字符串,条件永远不成立,导致有效购买未被加入validPurchases,最终没执行acknowledgePurchase,Google Play会自动退款未确认的非消耗型订单。
修复后的代码
private fun processPurchases(purchasesResult: Set<Purchase>) { val validPurchases = HashSet<Purchase>(purchasesResult.size) purchasesResult.forEach { purchase -> when (purchase.purchaseState) { Purchase.PurchaseState.PURCHASED -> { // 正确判断订单是否包含目标SKU if (purchase.skus.contains(purchaseItem)) { if (isSignatureValid(purchase)) { validPurchases.add(purchase) } } } Purchase.PurchaseState.PENDING -> { // 适配List类型的SKU输出(单个SKU场景取第一个) val pendingSku = purchase.skus.firstOrNull() ?: "unknown" Log.d(LOG_TAG, "Received a pending purchase of SKU: $pendingSku") mContext.toast(R.string.msgOrderPending) } else -> { mContext.toast(R.string.msgOrderError) } } } acknowledgeNonConsumablePurchasesAsync(validPurchases.toList()) }
关键修改说明
- SKU判断逻辑修正:把
purchase.skus.equals(purchaseItem)改成purchase.skus.contains(purchaseItem)。因为skus是列表类型,直接用equals会拿整个列表和字符串对比,永远返回false,contains才能正确识别订单中是否包含你要处理的SKU。 - Pending状态适配:用
firstOrNull()获取列表第一个SKU(适配单个SKU购买场景),避免空指针异常。
额外验证
请确认acknowledgeNonConsumablePurchasesAsync方法内,正确调用了BillingClient的acknowledgePurchase接口,只有调用该接口,Google Play才会标记购买完成,不会触发自动退款。
内容的提问来源于stack exchange,提问作者HelloCW
相关产品推荐
相关产品推荐

