You need to enable JavaScript to run this app. Android Billing 4.0.0 queryPurchases与getSku方法失效适配方案咨询
优惠活动
大模型
产品
解决方案
定价
更多

Android Billing 4.0.0 queryPurchases与getSku方法失效适配方案咨询

Android Billing 4.0.0 版本适配解决方案

问题1:Purchase类getSku()方法不存在,替换后判断条件恒为false

官方在4.0版本移除了原有的getSku()方法,替换为getSkus(),该方法返回值为List<String>类型(适配多商品合并购买场景),直接用字符串和列表做等值判断必然返回false。
适配代码修改如下:

void handlePurchases(List<Purchase>  purchases) {
    for(Purchase purchase:purchases) {
        // 单商品购买场景可直接判断列表包含目标商品ID,也可通过get(0)取首个sku对比
        if (purchase.getSkus().contains(PRODUCT_ID) && purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED)
        {
            if (!verifyValidSignature(purchase.getOriginalJson(), purchase.getSignature())) {
                Toast.makeText(getApplicationContext(), R.string.plus_error, Toast.LENGTH_SHORT).show();
                return;
            }
            // 原有后续业务逻辑无需修改

如果你的业务支持多商品合并购买,自行遍历getSkus()返回的列表做对应逻辑处理即可。

问题2:queryPurchases()方法废弃,替换为queryPurchasesAsync()

queryPurchasesAsync()需要两个参数:第一个是QueryPurchasesParams实例,用于指定查询的商品类型;第二个是查询结果的回调接口,查询结果将异步返回。
适配代码修改如下:

else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED) {
    // 构建查询参数,指定查询普通内购商品,订阅商品可传BillingClient.ProductType.SUBS
    QueryPurchasesParams params = QueryPurchasesParams.newBuilder()
            .setProductType(BillingClient.ProductType.INAPP)
            .build();
    billingClient.queryPurchasesAsync(params, (billingResult1, purchaseList) -> {
        if (billingResult1.getResponseCode() == BillingClient.BillingResponseCode.OK && purchaseList != null) {
            handlePurchases(purchaseList);
        }
    });
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 07:36:00