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

Android应用内购仅手机端正常,Wear OS端存在回调及查询异常

Wear OS跨设备购买回调不触发问题排查

问题现象

应用在手机端单独安装时购买流程正常,但在Wear OS设备上存在以下异常:

  • 通过手机端完成购买后,穿戴端的onPurchasesUpdated回调不会被触发,无法确认购买状态
  • 调用queryPurchases始终返回空列表;queryPurchaseHistory能查询到购买记录,但该接口无法用于确认有效购买
  • 仅在穿戴端主动取消购买流程时,onPurchasesUpdated才会正常调用

代码示例:

billingClient = BillingClient.newBuilder(application)
    .setListener(this).enablePendingPurchases().build();

// 仅穿戴端取消时触发,手机端完成/取消均无回调
@Override 
public void onPurchasesUpdated(@NonNull BillingResult billingResult, 
    @Nullable List<Purchase> list) {
    // 处理购买结果逻辑
}

已尝试的排查动作:

  • 使用Billing Library 5.1.0和4.1.0版本测试
  • 采用授权测试账号进行验证
  • 在2款手机、3款Wear OS手表上复现问题
  • 谷歌官方示例代码"TrivialTestDrive"同样出现该异常

可能的解决方向

1. 确保跨设备应用的关联配置

Wear OS与手机的跨设备购买依赖应用的身份一致性:

  • 手机端和穿戴端应用必须使用相同的包名和签名密钥
  • 登录Google Play Console,在Wear OS应用的设置页面,确认已正确关联对应的手机端应用(需在同一开发者账号下)

2. 主动查询购买记录替代被动回调

跨设备场景下,穿戴端无法依赖onPurchasesUpdated接收手机端的购买通知,需主动拉取:

  • 使用废弃方法queryPurchases的替代接口queryPurchasesAsync,在BillingClient连接成功后立即执行查询:
    private void queryPurchasesAsync() {
        QueryPurchasesParams params = QueryPurchasesParams.newBuilder()
                .setProductType(BillingClient.SkuType.INAPP)
                .build();
        billingClient.queryPurchasesAsync(params, (billingResult, purchases) -> {
            if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && !purchases.isEmpty()) {
                handleValidPurchases(purchases);
            }
        });
    }
    
    订阅类型商品替换SkuType.INAPP为SkuType.SUBS

3. 维护BillingClient的连接稳定性

跨设备同步可能因连接中断导致状态不同步,需确保BillingClient始终处于连接状态并主动重试:

billingClient.startConnection(new BillingClientStateListener() {
    @Override
    public void onBillingSetupFinished(@NonNull BillingResult billingResult) {
        if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK) {
            // 连接成功后立即查询购买记录
            queryPurchasesAsync();
        }
    }

    @Override
    public void onBillingServiceDisconnected() {
        // 断开连接后自动重试
        billingClient.startConnection(this);
    }
});

4. 处理Pending状态的购买

手机端完成的购买可能在穿戴端处于pending状态,需主动确认:

private void handleValidPurchases(List<Purchase> purchases) {
    for (Purchase purchase : purchases) {
        if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED && !purchase.isAcknowledged()) {
            AcknowledgePurchaseParams ackParams = AcknowledgePurchaseParams.newBuilder()
                    .setPurchaseToken(purchase.getPurchaseToken())
                    .build();
            billingClient.acknowledgePurchase(ackParams, result -> {
                if (result.getResponseCode() == BillingClient.BillingResponseCode.OK) {
                    // 购买确认完成,执行业务逻辑
                }
            });
        }
    }
}

5. 规避同步延迟问题

Google Play跨设备购买状态同步存在一定延迟:

  • 确保手机与穿戴设备登录同一Google账号,且网络连接正常
  • 测试时,手机端完成购买后等待1-2分钟,再在穿戴端查询购买状态
  • 确保测试商品已发布到Play Console的测试轨道(内部测试/封闭测试)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 03:55:15