IabHelper 的 QueryInventoryFinishedListener 没有返回过期的订阅项。
另一方面,Google Play Billing Library 的 PurchaseHistoryResponseListener 似乎接收到所有购买的商品,包括过期商品。
在 Google Play Billing Library 上,我们必须检查 PurchaseHistoryResponseListener 的购买日期和每个项目的到期日期?
IabHelper 的 QueryInventoryFinishedListener 没有返回过期的订阅项。
另一方面,Google Play Billing Library 的 PurchaseHistoryResponseListener 似乎接收到所有购买的商品,包括过期商品。
在 Google Play Billing Library 上,我们必须检查 PurchaseHistoryResponseListener 的购买日期和每个项目的到期日期?
一般来说,我们应该使用queryPurchases(String skuType)
,它不会返回过期的项目。queryPurchaseHistoryAsync 返回启用和禁用的项目,如您所见,如下所示。
获取在您的应用内购买的所有商品的购买详情。此方法使用 Google Play Store 应用程序的缓存,无需发起网络请求。
返回用户为每个 SKU 进行的最近一次购买,即使该购买已过期、取消或消耗。
我无法想象 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
}
}
}
};
购买对象没有周期的信息,所以上述周期必须从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();
}
}
}
});