之前的Android 谷歌支付接入文章中,仅是大致介绍了如何接入,在该文的评论中,有个掘友问到购买了订阅商品之后,怎么判定订阅仍在有效期内,本文简单介绍一下如何判定订阅仍在有效期。
获取订阅状态
官方提供了两种查询订阅状态的方式,在前端通过Billing库的quePurchasesAsync()
方法或者在后端通过 Google Play Developer API 中的 Purchases.subscriptionsv2:get
进行查询。
通过后端查询
如果订阅信息存储在后端,那么后端应该配置实时开发者通知。配置通知后,新订阅、续订、到期、取消、撤销等事件发生时,后端都会收到通知,接收通知后可以通过Google Play Developer API查询订阅状态并进行相应的处理。
通过Billing库查询
如果订阅信息仅在前端做处理,那么可以在合适的时机,例如打开App时或者每次进入主页面时通过Billing库的quePurchasesAsync()
查询一下订阅状态,根据官方文档的描述,PurchasesResponseListener
仅会返回仍在有效内的订阅信息,代码如下:
private val subscriptionPurchasesResponseListener = PurchasesResponseListener { billingResult, purchases ->
if (BillingClient.BillingResponseCode.OK == billingResult.responseCode) {
if (purchases.isNotEmpty()) {
// 有有效订阅商品
purchases.forEach {
if (Purchase.PurchaseState.PURCHASED == it.purchaseState) {
// 此订阅商品是已支付完成的
if (it.isAcknowledged) {
// 此订阅商品已核销过
// 这里可以判定是在有效期的订阅
} else {
// 此订阅商品未核销,需要进行核销
}
}
}
} else {
// 没有有效订阅商品
}
}
}
private fun querySubscriptionPurchasesAsync() {
billingClient?.run {
if (isReady) {
// 4.1.0
queryPurchasesAsync(BillingClient.SkuType.SUBS, subscriptionPurchasesResponseListener)
// 5.0.0
val subscriptionsPurchasesQuery = QueryPurchasesParams.newBuilder()
.setProductType(BillingClient.ProductType.SUBS)
.build()
queryPurchasesAsync(subscriptionsPurchasesQuery, subscriptionPurchasesResponseListener)
}
}
}