Wear OS应用内购回调失效致自动退款问题排查求助
Wear OS内购自动退款问题排查思路
问题概况
- 已发布25款Wear OS表盘应用,多数含解锁全功能的高级内购SKU
- 2021年7月起,用户付费后功能仍锁定,订单3天后触发Google自动退款(符合“3天未确认订单自动退款”政策)
- 根源指向Wear OS 2021年7月更新的购买流程:手表发起支付,手机/网页完成后,手表需接收通知并确认订单,但手表偶尔无法收到通知,回调失效导致未确认订单
- 问题无稳定复现路径(模拟器、真机、debug/release模式下均为随机失效)
- 数据统计:95%退款为自动退款,占全部订单的30%;2022年2-7月问题缓解后再次上升
排查思路
一、订单确认逻辑兜底优化
- 主动轮询订单状态:不要仅依赖通知回调,在应用启动、前台激活时,主动调用
queryPurchasesAsync查询未确认订单,一旦发现已支付但未确认的订单,立即调用acknowledgePurchase完成确认 - 批量处理未决订单:在BillingClient初始化完成后,遍历所有历史购买记录,筛选出
Purchase.PurchaseState.PURCHASED且isAcknowledged() == false的订单,强制触发确认流程
二、提升通知与回调可靠性
- 检查通知权限:确保应用已获取
POST_NOTIFICATIONS权限(Android 13+),同时在Wear OS系统设置中开启应用的通知权限,避免系统拦截支付完成通知 - 注册兜底广播:注册
com.android.vending.billing.PURCHASES_UPDATED系统广播,作为回调失效的备用触发方式,收到广播后立即查询订单状态 - 稳定BillingClient连接:在
onBillingServiceDisconnected回调中实现自动重连逻辑,避免BillingClient意外断开;确保BillingClient在应用生命周期内保持活跃,不要频繁创建/销毁实例
三、日志采集与分析
- 强制本地日志存储:在BillingManager的关键节点(如
onPurchasesUpdated回调、订单确认、轮询操作)写入本地日志,日志需包含:- 订单ID、SKU、购买状态、确认状态
- 回调触发时间、轮询触发时间
- 设备信息(Wear OS版本、手表型号)
- 引导用户上传日志:在应用内设置“反馈问题”入口,让遇到问题的用户主动上传本地日志,获取真实场景下的异常数据
- 分析Play Console数据:在Play Console的“订单管理”中导出异常订单的详细数据,对比正常订单与异常订单的设备型号、系统版本、支付渠道,寻找共性特征
四、代码层面细节检查
- 确认
acknowledgePurchase调用时机:收到PURCHASES_UPDATED回调且订单状态为PURCHASED时,立即调用,不要依赖异步操作后的延迟处理 - 添加异常捕获:在
acknowledgePurchase的回调中捕获异常,记录确认失败的原因(如网络错误、API调用失败) - 模拟边缘场景:测试网络中断、手表重启、应用被杀等场景,验证订单确认逻辑是否能在恢复后自动触发
附:BillingManager代码检查要点
- 检查
BillingClient初始化是否在主线程,是否正确设置BillingClientStateListener - 确认
queryPurchasesAsync是否覆盖了内购类型BillingClient.SkuType.INAPP - 检查
onPurchasesUpdated中是否处理了ResponseCode.OK以外的情况(如ResponseCode.USER_CANCELED或ResponseCode.SERVICE_DISCONNECTED) - 确认
acknowledgePurchase是否正确传入订单ID和AcknowledgePurchaseResponseListener
内容的提问来源于stack exchange,提问作者cyphics
相关产品推荐
相关产品推荐

