当前位置: 首页 > 知识库问答 >
问题:

是否有任何方法可以从应用程序中验证针对Google Play而不是缓存的购买?

何越
2023-03-14

我的申请中有一次购买。它支持应用程序的所有功能。

当用户在手机上购买sku时...一切正常。我们会看到计费客户端返回的事件,并通过在本地数据库中设置布尔值来记录高级模式的购买。本地谷歌播放缓存已正确更新。

我们的问题是当他们安装在另一台设备上时。想象一下,你想在平板电脑和手机上使用它,或者你丢了手机,又买了一部。

我们一直在使用计费客户端的“查询购买”方法来验证购买。他们安装了该应用程序,我认为此时会将购买历史记录添加到本地缓存中。

一般来说,它是有效的。但不可忽略的是,有相当一部分用户需要多次重启手机,或者从谷歌那里等上几天,才能将他们的@#$%汇总起来,并将购买历史记录添加到他们的缓存中。

他们的文档称该方法只查询本地缓存。https://developer.android.com/reference/com/android/billingclient/api/BillingClient#querypurchases

Google Play开发者API允许使用查询进行购买,但我们需要购买令牌来验证任何东西。如果Google Play因为没有购买记录而无法返回购买令牌。。。我们该怎么办?

其他人是如何处理这个问题的?

共有1个答案

史弘致
2023-03-14

queryPurchases依赖于设备上的缓存。因此,如果用户的设备没有及时更新缓存,您将看到这种行为。为了解决这个问题,你应该在queryPurchaseHistoryAsync中使用queryPurchases,如下所示

override fun onBillingSetupFinished(billingResult: BillingResult) {
        when (billingResult.responseCode) {
            BillingClient.BillingResponseCode.OK -> {
                ...
                queryPurchasesAsync()
            }
            ...
        }
    }

fun queryPurchasesAsync() {
        val purchasesResult = HashSet<Purchase>()
        var result = playStoreBillingClient.queryPurchases(BillingClient.SkuType.INAPP)
        if(nullOrEmpty(result)){
            queryPurchaseHistoryAsync(...) // response is returned to onPurchaseHistoryResponse
        }else{
         ... // here you add your existing logic to give users access to products and services 
        }
    }

旁白:既然你使用标签google play developer api,你的应用程序有服务器吗?如果是这样,您可以在服务器上设置布尔值,而不是使用本地缓存,并从服务器上获取授权信息。这种方法的优点是,当你的应用程序成为跨平台应用程序时,不管用户是通过Android系统还是网络购买,他们都可以通过与你的服务器进行检查来访问高级内容。

参考:https://github.com/googlesamples/android-play-billing/tree/master/TrivialDriveKotlin

 类似资料: