You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 05:50:25