Android 谷歌支付订阅商品有效期问题

754 阅读1分钟

之前的Android 谷歌支付接入文章中,仅是大致介绍了如何接入,在该文的评论中,有个掘友问到购买了订阅商品之后,怎么判定订阅仍在有效期内,本文简单介绍一下如何判定订阅仍在有效期。

获取订阅状态

官方文档

官方提供了两种查询订阅状态的方式,在前端通过Billing库的quePurchasesAsync()方法或者在后端通过 Google Play Developer API 中的 Purchases.subscriptionsv2:get 进行查询。

image.png

通过后端查询

如果订阅信息存储在后端,那么后端应该配置实时开发者通知。配置通知后,新订阅、续订、到期、取消、撤销等事件发生时,后端都会收到通知,接收通知后可以通过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)
        }
    }
}