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

  • billingClient.queryPurchaseHistoryAsync(BillingClient.SkuType.SUBS) { billingResult, purchasesList -> }
  • val purchasesList = billingClient.queryPurchases(BillingClient.SkuType.SUBS).purchasesList

  • 他们返回类似这样的内容:
    {
      "productId": "weekly_with_trial",
      "purchaseToken": "someToken",
      "purchaseTime": 1563305764597,
      "developerPayload": null
    }
    
    {
      "orderId": "GPA.3380-7704-5235-01361",
      "packageName": "com.myapp",
      "productId": "weekly_trial_trial",
      "purchaseTime": 1563305764597,
      "purchaseState": 0,
      "purchaseToken": "someToken",
      "autoRenewing": false,
      "acknowledged": false
    }
    

    他们俩都向我返回了购买 list ,但没有有关其是否过期的任何信息。怎么检查呢?

    最佳答案

    正如Google Play结算的文档清楚地表明的那样,有两个功能可以获取购买 list

    val purchasesResult: PurchasesResult =
            billingClient.queryPurchases(SkuType.INAPP)
    

    当您进行查询购买时,仅 Activity 订阅出现在此列表上。只要应用内商品在此列表中,用户就可以访问

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

    因此,为了从网络通话中获取购买请求,您需要使用一种异步方法,即 queryPurchaseHistoryAsync()
    billingClient.queryPurchaseHistoryAsync(SkuType.INAPP, { billingResult, purchasesList ->
       if (billingResult.responseCode == BillingResponse.OK && purchasesList != null) {
           for (purchase in purchasesList) {
               // Process the result.
           }
       }
    })
    

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

    因此,您可以使用 queryPurchase()来获取所有有效购买。

    09-11 18:01