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

Google Play Billing Library v4无服务端实现应用内购买恢复方案咨询

基于Google Play Billing Library v4的Java版最简恢复购买实现

核心查询方法说明

你不想使用的废弃方法是同步的queryPurchases (String skuType),官方推荐的替代方案是异步方法queryPurchasesAsync,完全满足你重装/换设备时查询当前有效已购商品的需求,无需服务端支持。

代码实现示例

1. 查询当前有效已购商品

你只有3个内购商品的话,统一用BillingClient.SkuType.INAPP类型查询即可,如果包含订阅则额外追加BillingClient.SkuType.SUBS类型的查询:

billingClient.queryPurchasesAsync(QueryPurchasesParams.newBuilder()
                .setProductType(BillingClient.SkuType.INAPP)
                .build(), 
        new PurchasesResponseListener() {
    @Override
    public void onQueryPurchasesResponse(@NonNull BillingResult billingResult, @NonNull List<Purchase> list) {
        if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK && !list.isEmpty()) {
            for (Purchase purchase : list) {
                // 校验购买状态和签名
                if (verifyPurchaseValid(purchase)) {
                    // 匹配你的3个商品sku,开通对应权限
                    switch (purchase.getSkus().get(0)) {
                        case "你的商品sku1":
                            // 给用户开通商品1对应的权限,本地存储状态
                            break;
                        case "你的商品sku2":
                            // 开通商品2权限
                            break;
                        case "你的商品sku3":
                            // 开通商品3权限
                            break;
                    }
                }
            }
        }
    }
});

2. 本地购买校验方法(防止本地篡改)

把你Google Play后台的公钥填入即可完成本地校验,无需调用服务端接口:

private boolean verifyPurchaseValid(Purchase purchase) {
    // 先判断购买状态是否为已购买
    if (purchase.getPurchaseState() != Purchase.PurchaseState.PURCHASED) {
        return false;
    }
    // 校验签名,BASE_64_PUBLIC_KEY替换为你Google Play控制台获取的应用公钥
    try {
        PublicKey publicKey = Security.generatePublicKey(BASE_64_PUBLIC_KEY);
        return Security.verifyPurchase(publicKey, purchase.getOriginalJson(), purchase.getSignature());
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}

常见疑问说明

  • 必须要有服务端吗?不需要。如果你的应用没有强风控、跨平台校验、订阅状态自动同步的需求,本地校验完全可以覆盖你仅3个商品的简单场景。Google Play Developer API适用于更复杂的商业化场景,你的需求不需要额外搭服务端。
  • 为什么不用queryPurchaseHistoryAsync?该接口返回的是所有历史购买记录,包含已经退款、已消耗、过期的购买记录,确实不适合用来判断当前用户的有效购买权限,你排除该方法的判断是正确的。

内容的提问来源于stack exchange,提问作者Il'ya Freqnsy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 11:00:02