如何检查订阅项的到期时间

Mit*_*oto 6 android google-play play-billing-library

IabHelper的QueryInventoryFinishedListener尚未返回过期的订阅项.

另一方面,Google Play结算图书馆的PurchaseHistoryResponseListener似乎会收到所有购买的商品,其中包括过期商品.

在Google Play结算库中,我们必须检查PurchaseHistoryResponseListener的购买日期和商品的每个到期日期?

Mit*_*oto 1

queryPurchases 与 queryPurchaseHistoryAsync

一般来说,我们应该使用queryPurchases(String skuType),它不会返回过期的物品。queryPurchaseHistoryAsync 返回启用和禁用的项目,如您所见,如下所示的文档。

查询购买情况

获取在您的应用程序中购买的所有商品的购买详细信息。该方法使用Google Play Store应用程序的缓存,无需发起网络请求。

异步查询购买历史记录

返回用户最近对每个 SKU 进行的购买,即使该购买已过期、取消或消耗。

关于 queryPurchaseHistoryAsync

我无法想象 queryPurchaseHistoryAsync 的用例。如果我们需要使用 queryPurchaseHistoryAsync,我们需要实现来检查它是否过期。

  private PurchaseHistoryResponseListener listener = new PurchaseHistoryResponseListener() {
    @Override
    public void onPurchaseHistoryResponse(int responseCode, List<Purchase> purchasesList) {
      for (Purchase purchase : purchasesList) {
        if (purchase.getSku().equals("sku_id")) {
          long purchaseTime = purchase.getPurchaseTime();
          // boolean expired = purchaseTime + period < now
        }
      }
    }
  };
Run Code Online (Sandbox Code Playgroud)

购买对象没有周期信息,因此上述周期必须从 BillingClient.querySkuDetailsAsync 获取或硬编码。以下是使用 querySkuDetailsAsync 的示例实现。

    List<String> skuList = new ArrayList<>();
    skuList.add("sku_id");
    SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
    params.setSkusList(skuList).setType(BillingClient.SkuType.SUBS);
    billingClient.querySkuDetailsAsync(params.build(), new SkuDetailsResponseListener() {
      @Override
      public void onSkuDetailsResponse(int responseCode, List<SkuDetails> skuDetailsList) {
        if (skuDetailsList == null) {
          return;
        }
        for (SkuDetails skuDetail : skuDetailsList) {
          if (skuDetail.getSku().equals("sku_id")) {
            String period = skuDetail.getSubscriptionPeriod();

          }
        }
      }
    });
Run Code Online (Sandbox Code Playgroud)

  • 根据 doc String getSubscriptionPeriod() 订阅周期,以 ISO 8601 格式指定。例如,P1W 相当于一周,P1M 相当于一个月,P3M 相当于三个月,P6M 相当于六个月,P1Y 相当于一年。所以基本上你要把 P1M 或 P3M 或其他类似的东西转换成毫秒,但月份可以是 28 到 31 天,那么到底如何以毫秒为单位转换周期。 (2认同)