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

Android应用后台被系统查杀导致Google Billing Client内购失败问题咨询

后台查杀导致Google Play内购失败的解决方案

根因分析

  • 问题本质是Google Billing Client的单次支付回调依赖原始Activity上下文,进程被系统销毁后临时交易数据未持久化,默认不会主动查询未完结的pending订单,最终导致支付状态不同步

解决方案

1. 核心修复:页面/应用重建时主动查询未消费订单

Google Billing Library提供了不依赖支付发起上下文的历史交易查询接口,你需要在应用冷启动、内购相关页面重建两个节点,主动调用queryPurchasesAsync()拉取所有未消费的有效订单,完成状态同步和补发逻辑:

// Kotlin示例代码
billingClient.queryPurchasesAsync(QueryPurchasesParams.newBuilder()
    // 按需添加需要查询的商品类型
    .setProductType(BillingClient.ProductType.INAPP) // 消耗型/非消耗型商品
    .setProductType(BillingClient.ProductType.SUBS) // 订阅商品
    .build()) { billingResult, purchases ->
    if (billingResult.responseCode == BillingClient.BillingResponseCode.OK && purchases.isNotEmpty()) {
        purchases.forEach { purchase ->
            // 处理已支付未确认的订单,执行发货逻辑
            if (purchase.purchaseState == Purchase.PurchaseState.PURCHASED && !purchase.isAcknowledged) {
                handlePurchase(purchase) // 业务侧自定义的发货+确认消费逻辑
            }
            // 处理待支付的pending订单,可记录后定时轮询状态
            if (purchase.purchaseState == Purchase.PurchaseState.PENDING) {
                recordPendingPurchase(purchase)
            }
        }
    }
}

该接口可查询过去3天内所有未被确认消费的订单,完全覆盖进程被杀期间产生的状态未同步订单场景。

2. Pending订单状态轮询

针对订单先显示payment pending、延后变更状态的场景,可在查询到存在pending状态订单时,按10-15分钟的间隔做后台定时轮询,直到订单状态变为已支付/已取消,超过24小时未变更的可直接标记为失效。

3. 业务上下文持久化补充

你提到的「无法在SDK启动Activity前保存上下文」是误解,launchBillingFlow()是业务侧主动调用的方法,调用前你可以将当前用户ID、待购买商品SKU、业务侧订单号等信息持久化到本地SharedPreferences或Room数据库,不需要干涉SDK自身的Activity启动逻辑,后续查询到未消费订单时可通过SKU、支付时间等字段做匹配,关联到对应业务订单完成发货。

4. 边界处理规则

  • 查到已支付订单完成发货后,必须调用acknowledgePurchase()(非消耗型/订阅商品)或consumeAsync()(消耗型商品)确认订单,避免重复发货
  • 状态最终变更为user canceled的订单直接清理本地缓存的关联记录即可

内容的提问来源于stack exchange,提问作者Dinesh Sen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 21:45:04