【问题标题】:How to check if user bought a product offered by IAP如何检查用户是否购买了 IAP 提供的产品
【发布时间】:2021-07-04 16:22:50
【问题描述】:

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

当我的应用程序加载时,我想检查用户是否捐款,如何通过代码知道在用户捐款后我将调用以下代码以允许用户捐款如果需要,将来可以捐款。

因此,如果需要,我想允许用户进一步捐款,但我想知道他是否已经捐款以禁用广告和解锁高级功能。

BillingProcessor bp;
bp.consumePurchase(productId);

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

【问题讨论】:

    标签: android in-app-purchase


    【解决方案1】:

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

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

    查询缓存购买

    检索有关购买的信息 用户从您的应用程序中创建,调用 queryPurchases() 方法 Play Billing 上的购买类型(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() 方法。你可以结合 带有 Refresh 按钮的 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.
                 }
              }
         } });
    

    【讨论】:

    • 谢谢 nasch ...我发现关于 onPurchaseHistoryResponse queryPurchaseHistoryAsync 不会满足您的需求,因为它只会为您提供每个 SKU 最近购买的列表。它们可能已经过期、被取消或被消耗,而且无法判断。因此,此响应不能用于说明要在您的应用中应用哪些购买。
    • 是的,我明白了。然后我唯一的其他建议是查看 Purchase 对象中“原始 JSON”中返回的内容(这没有记录,所以我自己不运行测试就无法判断),或者查看 Trivial Drive 示例代码和看看那里有什么有用的。
    【解决方案2】:

    你可以用这个:

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

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

    【讨论】:

      【解决方案3】:

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

      但是,执行此操作的最新方法是调用 BillingClient.queryPurchasesAsync(),如 here 中所述。你至少应该在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);
                      }
                  }
              }
          });
      

      关注these steps 应该会让你走得很远。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-12-10
        • 1970-01-01
        • 1970-01-01
        • 2018-03-26
        • 2015-02-03
        • 2019-02-27
        • 2013-10-15
        • 2021-05-29
        相关资源
        最近更新 更多