Android 如何检查用户是否购买了IAP提供的产品

Android 如何检查用户是否购买了IAP提供的产品,android,in-app-purchase,Android,In App Purchase,在我的应用程序中,我让用户使用Google Play IAP进行捐赠,作为回报,我删除广告并解锁高级功能 BillingProcessor bp; bp.consumePurchase(productId); 当我的应用程序加载时,我想检查用户是否进行了捐赠,如何通过代码进行检查,知道用户进行捐赠后,我将调用以下代码,以允许用户在需要时进行未来捐赠 因此,我想允许用户在需要的情况下进一步捐款,但我想知道他是否已经捐款来禁用广告和解锁高级功能 BillingProcessor bp; bp.co

在我的应用程序中,我让用户使用Google Play IAP进行捐赠,作为回报,我删除广告并解锁高级功能

BillingProcessor bp;
bp.consumePurchase(productId);
当我的应用程序加载时,我想检查用户是否进行了捐赠,如何通过代码进行检查,知道用户进行捐赠后,我将调用以下代码,以允许用户在需要时进行未来捐赠

因此,我想允许用户在需要的情况下进一步捐款,但我想知道他是否已经捐款来禁用广告和解锁高级功能

BillingProcessor bp;
bp.consumePurchase(productId);

请注意,我的问题是关于IAP联机过程,而不是脱机保存值并稍后检查。

我认为本指南应该帮助您了解如何执行此操作:

查询缓存的购买

要检索有关购买的信息,请执行以下操作: 用户通过应用程序调用queryPurchases()方法 播放账单上的购买类型(SkuType.INAPP或SkuType.SUBS) 图书馆客户端。例如:

PurchasesResult PurchasesResult=mBillingClient.queryPurchases(SkuType.INAPP)

Google Play返回 由登录到设备的用户帐户进行的购买。如果 请求成功后,播放计费库存储查询 生成一个购买对象列表

注意:此列表上仅显示活动订阅。只要 应用内产品在此列表中,用户应该有权访问它。对于 有关更多信息,请参阅本手册的“保持”部分中的“手柄”子选项 “添加订阅特定功能”文档。要检索列表, 对PurchasesResult对象调用getPurchasesList()方法。你 然后可以调用Purchase对象上的各种方法进行查看 有关项目的相关信息,例如其购买状态或 时间查看以下类型的产品详细信息: 如果可用,请参阅Purchase类中的方法列表

在代码中至少调用queryPurchases()两次:

每次应用程序启动时,您都可以恢复任何购买 自应用上次停止后用户所做的更改。在你的简历中 方法,因为用户可以在您的应用处于 背景(例如,在Play Store应用程序中兑换促销代码)。 在启动和恢复时调用queryPurchases()可以保证 应用程序会发现用户可能拥有的所有购买和赎回信息 在应用程序未运行时生成。此外,如果用户 当应用程序正在运行且您的应用程序因任何原因而错过时购买 原因是,你的应用程序在下一次 活动继续并调用queryPurchases()

查询最近购买的商品

queryPurchases()方法使用缓存 在不启动网络请求的情况下启动Google Play Store应用程序。如果 您需要检查用户最近购买的每种产品 产品ID,可以使用queryPurchaseHistoryAsync()方法和 传递要处理的采购类型和PurchaseHistoryResponseListener 查询结果

queryPurchaseHistoryAsync()返回由 每个产品ID的用户,即使购买已过期, 取消或消费。无论何时使用queryPurchases()方法 可能,因为它使用本地缓存,而不是 queryPurchaseHistoryAsync()方法。你可以合并 queryPurchaseHistoryAsync(),带有一个刷新按钮,允许用户 更新他们的购买清单

下面的代码演示如何重写 onPurchaseHistoryResponse()方法:

您可以使用以下选项:

Purchase.PurchasesResult purchasesResult = billingClient.queryPurchases(BillingClient.SkuType.SUBS); //Or SkuType.INAPP

            if (purchasesResult.getPurchasesList() != null) {
                for (Purchase purchase : purchasesResult.getPurchasesList()) {

                        if (purchase.getSku().equals("your_product_id")) handlePurchase(purchase);

                }

[...]

void handlePurchase(Purchase purchase) {
        if (purchase.getPurchaseState() == Purchase.PurchaseState.PURCHASED) {
            premium = true; //In casse purchase was acknowledge before
            if (!purchase.isAcknowledged()) {
                AcknowledgePurchaseParams acknowledgePurchaseParams =
                        AcknowledgePurchaseParams.newBuilder()
                                .setPurchaseToken(purchase.getPurchaseToken())
                                .build();

                AcknowledgePurchaseResponseListener acknowledgePurchaseResponseListener = new AcknowledgePurchaseResponseListener() {
                    @Override
                    public void onAcknowledgePurchaseResponse(BillingResult billingResult) {
                        premium = true;
                    }
                };

                billingClient.acknowledgePurchase(acknowledgePurchaseParams, acknowledgePurchaseResponseListener);
            }
        }
    }

如果您有任何问题,请继续评论。

谢谢您,纳什。。。我发现这是关于onPurchaseHistoryResponse QueryPurchaseHistorySync的,它不会满足您的需要,因为它只会为您提供每个SKU的最新购买列表。它们可能已经过期、被取消或已被消费,而且无法确定。因此,此响应不能用于告诉你的应用程序中应用了哪些购买。是的,我明白了。然后,我唯一的其他建议是查看购买对象中“原始JSON”中返回的内容(这没有文档记录,因此我自己不运行测试就无法判断),或者查看琐碎的驱动器示例代码,看看是否有有用的内容。