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

时间:2018-10-05 18:58:51

标签: android in-app-purchase

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

在我的应用程序加载后,我想检查用户是否进行了捐赠,如何通过代码知道来做到这一点(在用户捐赠之后),我将调用以下代码以允许用户进行捐赠如果需要,将来可以捐款。

因此,我希望允许用户根据需要进行进一步的捐赠,但是我想知道他是否已经为禁用广告和解锁高级功能进行了捐赠。

BillingProcessor bp;
bp.consumePurchase(productId);

请注意,我的问题是关于IAP的在线流程,而不是关于离线保存值并稍后检查。

3 个答案:

答案 0 :(得分:1)

我认为本指南应该帮助您了解如何做到这一点:

https://developer.android.com/google/play/billing/billing_library_overview

  

查询缓存的购买

     

要检索有关以下内容的购买信息:   用户从您的应用中获取,请通过以下命令调用queryPurchases()方法:   Play帐单上的购买类型(SkuType.INAPP或SkuType.SUBS)   图书馆客户。例如:

     

PurchasesResult purchasesResult = mBillingClient.queryPurchases(SkuType.INAPP);

     

Google Play返回   通过登录到设备的用户帐户进行的购买。如果   请求成功后,Play Billing Library将存储查询   会生成“购买”对象列表。

     

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

     

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

     

每次启动应用程序时,您都可以恢复所有购买   自应用程序上次停止以来用户所做的操作。在你的onResume()中   方法,因为用户可以在您的应用程序位于   背景(例如,在Play商店应用中兑换促销代码)。   在启动和恢复时调用queryPurchases()可以确保您的   应用程序查找用户可能拥有的所有购买和兑换   在应用未运行时进行的。此外,如果用户   在应用运行时购买商品,而您的应用会错过任何商品   原因是,您的应用程序下次仍会找到有关购买的信息   活动恢复并调用queryPurchases()。

     

查询最近购买的商品

     

queryPurchases()方法使用缓存   无需发起网络请求即可访问Google Play商店应用。如果   您需要检查用户最近一次购买的商品   产品ID,则可以使用queryPurchaseHistoryAsync()方法和   传递购买类型和PurchaseHistoryResponseListener来处理   查询结果。

     

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

     

以下代码演示了如何覆盖   onPurchaseHistoryResponse()方法:

 mBillingClient.queryPurchaseHistoryAsync(SkuType.INAPP,
                                          new PurchaseHistoryResponseListener() {
     @Override
     public void onPurchaseHistoryResponse(@BillingResponse int responseCode,
                                           List purchasesList) {
         if (responseCode == BillingResponse.OK
                 && purchasesList != null) {
             for (Purchase purchase : purchasesList) {
                 // Process the result.
             }
          }
     } });

答案 1 :(得分:1)

正如 nasch 和 AlexBSC 已经回答的那样,您必须获取可能进行的购买。

但是,执行此操作的最新方法是调用 BillingClient.queryPurchasesAsync(),如 https://developer.android.com/google/play/billing/integrate#fetch 中所述。您至少应该在 onResume()onCreate() 中调用它。

例如像这样,

billingClient.queryPurchasesAsync(BillingClient.SkuType.SUBS, new PurchasesResponseListener() {
        @Override
        public void onQueryPurchasesResponse(BillingResult billingResult, List<Purchase> purchases) {
            if (billingResult.getResponseCode() == OK
                    && purchases != null) {
                for (Purchase purchase : purchases) {
                    handlePurchase(purchase);
                }
            }
        }
    });

遵循这些步骤应该会让您走得很远https://developer.android.com/google/play/billing/integrate

答案 2 :(得分:0)

您可以使用此:

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);
            }
        }
    }

如有任何疑问,请继续发表评论。