Android:如何检查用户是否有活动订阅

VLe*_*ovs 3 android kotlin android-billing

我正在使用Google Billing并尝试通过两种解决方案了解订阅是否已过期:

  1. billingClient.queryPurchaseHistoryAsync(BillingClient.SkuType.SUBS) { billingResult, purchasesList -> }

  2. val purchasesList = billingClient.queryPurchases(BillingClient.SkuType.SUBS).purchasesList

他们返回这样的东西:

{
  "productId": "weekly_with_trial",
  "purchaseToken": "someToken",
  "purchaseTime": 1563305764597,
  "developerPayload": null
}
Run Code Online (Sandbox Code Playgroud)
{
  "orderId": "GPA.3380-7704-5235-01361",
  "packageName": "com.myapp",
  "productId": "weekly_trial_trial",
  "purchaseTime": 1563305764597,
  "purchaseState": 0,
  "purchaseToken": "someToken",
  "autoRenewing": false,
  "acknowledged": false
}
Run Code Online (Sandbox Code Playgroud)

他们都给我发了一份购买清单,但没有任何关于它是否过期的信息。如何检查?

Raj*_*eck 11

由于 Google play billing 的文档清楚地表明有两个函数可以获取购买列表

val purchasesResult: PurchasesResult =
        billingClient.queryPurchases(SkuType.INAPP)
Run Code Online (Sandbox Code Playgroud)

当您进行查询购买时,此列表中只会显示有效订阅。只要应用内产品在此列表中,用户就应该有权访问它

这意味着如果购买已过期,那么您将不会在 queryPurchase 的响应中获得该购买项目。 但是您必须记住,它返回 google play 商店的本地缓存结果。

因此,为了从网络调用中获取购买请求,您需要使用异步方法,即queryPurchaseHistoryAsync()

billingClient.queryPurchaseHistoryAsync(SkuType.INAPP, { billingResult, purchasesList ->
   if (billingResult.responseCode == BillingResponse.OK && purchasesList != null) {
       for (purchase in purchasesList) {
           // Process the result.
       }
   }
})
Run Code Online (Sandbox Code Playgroud)

但是,有一个捕获对象,其中包含有关用户为每个产品 ID 进行的最近一次购买的信息,即使该购买已过期、取消或消费。

所以你可以使用queryPurchase()来获取所有活跃的购买。

  • Buuuut,我如何在生产中使用它? (3认同)