4

关于确认购买Google Play 结算库文档指出:

您必须在向用户授予权利后尽快确认通过 Google Play 结算库收到的所有具有成功状态的购买。

所以你的应用应该首先给用户他购买的东西,然后确认购买。这也是他们的示例代码所暗示的:

fun handlePurchase() {
    if (purchase.purchaseState === PurchaseState.PURCHASED) {
        // Grant entitlement to the user.
        ...
        // Acknowledge the purchase if it hasn't already been acknowledged.
        if (!purchase.isAcknowledged) {
            val acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder()
                    .setPurchaseToken(purchase.purchaseToken)
                    .build()
            client.acknowledgePurchase(acknowledgePurchaseParams, acknowledgePurchaseResponseListener)
        }
    }
}

我目前正在开发一个 Android 应用程序,在该应用程序以 OK 状态返回确认后,我允许用户访问他们购买的内容(反之亦然):

private fun acknowledgePurchase(purchase: Purchase) {
    val params = AcknowledgePurchaseParams.newBuilder()
        .setPurchaseToken(purchase.purchaseToken)
        .build()

    billingClient.acknowledgePurchase(params) { billingResult ->
        when (billingResult.responseCode) {
            BillingResponseCode.OK -> loadPurchase(purchase.sku)
            else -> { ... }
        }
    }
}

因为文档指出:

...您必须在三天内确认所有购买。未能正确确认购买会导致这些购买被退款。

如果发生这种情况,并且用户得到了退款,那么用户对产品的权利也应该被撤销。但就我而言,进行购买意味着加载数据、在数据库中存储内容等等,而我没有,也不想拥有代码来恢复这一点。因此,我只有在成功确认后才向用户提供产品。

因此我的问题是:是否可以等到确认购买后才授予应用内购买的权利?或者我在这里错过了什么?我认为文档指定此顺序是有原因的,但他们没有详细说明。

4

1 回答 1

2

经过更多研究后,我注意到Trivial Drive 示例应用程序采用与我完全相同的方法。以下是他们的代码片段:

private fun acknowledgeNonConsumablePurchasesAsync(nonConsumables: List<Purchase>) {
    nonConsumables.forEach { purchase ->
        val params = AcknowledgePurchaseParams.newBuilder().setPurchaseToken(purchase
                .purchaseToken).build()
        playStoreBillingClient.acknowledgePurchase(params) { billingResult ->
            when (billingResult.responseCode) {
                BillingClient.BillingResponseCode.OK -> {
                    disburseNonConsumableEntitlement(purchase)
                }
                else -> Log.d(LOG_TAG, "acknowledgeNonConsumablePurchasesAsync response is ${billingResult.debugMessage}")
            }
        }

    }
}

如果响应正常,则表明在确认回调函数中授予了权利。与我的问题中的代码完全相同。

所以我想这个问题的答案是:是的,在成功确认后授予权利是可以的。

于 2019-11-17T12:47:05.017 回答