Play Billing Library: что делать, если приложение не может предоставить права?

Я изучаю биллинговую библиотеку Google Play для использования в своем приложении для Android. Я продаю монеты в своем приложении в качестве расходных материалов.

Поток такой: пользователь покупает предмет, приложение потребляет предмет, при успешном потреблении увеличивается монета, сохраненная в Firestore.

Я хочу спросить, что, если увеличение монеты, сохраненной в Firestore, не удастся? Допустим, из-за сети или других вещей. Это может вызвать проблемы у пользователей, поскольку наше приложение уже израсходовало предмет, а пользователи не получают свои монеты.

    private fun handleConsumablePurchasesAsync(consumables: List<Purchase>) {
        Timber.d("handleConsumablePurchasesAsync called")
        consumables.forEach { purchase ->
            Timber.d("handleConsumablePurchasesAsync foreach it is $purchase")
            val params = ConsumeParams
                .newBuilder()
                .setPurchaseToken(purchase.purchaseToken)
                .build()
            playStoreBillingClient.consumeAsync(params) { billingResult, purchaseToken ->
                when (billingResult.responseCode) {
                    BillingClient.BillingResponseCode.OK -> {
                        purchaseToken.apply { disburseConsumableEntitlements(purchase) }
                    }
                    else -> Timber.w(billingResult.debugMessage)
                }
            }
        }
    }

    private fun disburseConsumableEntitlements(purchase: Purchase) {
        when (purchase.sku) {
            SkuKeys.COINS_5K -> addCoin(5000)
            SkuKeys.COINS_10K -> addCoin(10000)
            SkuKeys.COINS_100K -> addCoin(100000)
            SkuKeys.COINS_500K -> addCoin(500000)
            SkuKeys.COINS_1M -> addCoin(1000000)
            SkuKeys.COINS_2M -> addCoin(2000000)
        }
    }

    //what if this fails?
    private fun addCoin(amount: Long) =
        FirestoreRepository.incrementCoins(FirebaseAuthRepository.currentUserId, amount) 

Как решить эту проблему? Есть ли лучший подход?


person Risal Fajar Amiyardi    schedule 18.07.2020    source источник


Ответы (2)


Мое предложение,

Используйте элемент только после успешной записи в Firebase.

Когда приложение перезапускается и queryPurchases() возвращает, что он все еще владеет элементом, попробуйте снова обновить в Firebase.

person Lluis Felisart    schedule 18.07.2020
comment
Тогда есть вероятность, что приложение несколько раз предоставит право пользователю. - person Risal Fajar Amiyardi; 20.07.2020
comment
Если вы обновите Firebase, а затем воспользуетесь покупкой, я думаю, маловероятно, что она будет дважды зарегистрирована в Firebase. Кроме того, если вы используете токен покупки в качестве ключа в Firebase, то одна и та же покупка не может быть зарегистрирована дважды. - person Lluis Felisart; 20.07.2020
comment
Что ясно, так это то, что если вы потребляете сразу после покупки, как это делает ваш код, если регистрация в Firebase завершается сбоем, это больше нельзя исправить, поскольку библиотека биллинга в приложении не имеет никакого метода для получения потребленных покупок. - person Lluis Felisart; 20.07.2020

Я рекомендую сохранять покупки в базе данных после их использования. Вы можете синхронизировать данные из базы данных в firebase.

После синхронизации вы можете удалить данные из базы данных.

Вы можете вызвать диспетчера работ для дополнительной синхронизации данных, если это необходимо (было бы полезно, если пользователь убивает приложение).

Это, однако, небезопасно, поскольку любой, у кого есть root-доступ, может получить доступ к базе данных и манипулировать данными. Вы можете зашифровать базу данных, чтобы сделать ее немного более безопасной, но она не будет на 100% защищена от дурака.

Если бы у вас был сервер, то покупки могли бы проверяться на стороне сервера, но для вас я не могу придумать никакого другого решения.

person Manohar    schedule 18.07.2020
comment
Если бы у вас был сервер, то покупки можно было бы проверять на стороне сервера, но для вас я не могу придумать никакого другого решения. Могу ли я использовать облачные функции? - person Risal Fajar Amiyardi; 18.07.2020
comment
Я не уверен, у меня не было возможности изучить облачные функции. - person Manohar; 18.07.2020