Google Play Billing Library:如何获取消费状态consumptionState?
在新版Google Play Billing Library(5.x及以上)中,Purchase类确实移除了consumptionState属性,官方调整了消费状态的判断逻辑,你可以通过以下方式处理:
核心判断逻辑:queryPurchasesAsync返回的消耗型产品即为未消费
新版库中,Google Play会自动从queryPurchasesAsync的返回结果中移除已成功消费的消耗型产品记录。所以你通过该接口获取到的消耗型产品购买记录,默认就是未被消费的,直接对这些记录发起消费操作即可。结合Purchase状态做辅助验证
对于返回的Purchase对象,可通过getPurchaseState()和isAcknowledged()做进一步确认:- 当
getPurchaseState()返回Purchase.PurchaseState.PURCHASED,且isAcknowledged()为true时,说明购买已确认,但消耗型产品此时仍可能未被消费(确认和消费是两个独立步骤); - 若
isAcknowledged()为false,需先调用acknowledgePurchaseAsync确认购买,再执行消费。
- 当
查询历史购买记录(含已消费)
如果需要查看包含已消费记录的历史快照,可调用queryPurchaseHistoryAsync接口,返回的PurchaseHistoryRecord对象通过getPurchaseState()能获取状态,但注意该接口返回的是历史数据,无法实时反映最新消费状态,仅适合辅助排查。消费操作的回调确认
执行消费时,通过ConsumeResponseListener回调确保操作成功:val consumeParams = ConsumeParams.newBuilder() .setPurchaseToken(purchase.purchaseToken) .build() billingClient.consumeAsync(consumeParams) { billingResult, _ -> if (billingResult.responseCode == BillingClient.BillingResponseCode.OK) { // 消费成功,该记录后续不会出现在queryPurchasesAsync结果中 } }
另外,针对消费操作中断的场景:即使重复对同一未消费记录调用consumeAsync,Google Play也会返回成功,所以下次启动应用时,直接处理queryPurchasesAsync返回的未消费记录即可,无需额外判断是否已发起过消费。
内容的提问来源于stack exchange,提问作者Andrei Herford

