Подписка на Android в приложении не продлевается автоматически

#android #in-app-billing #android-billing #in-app-subscription #play-billing-library

#Android #биллинг в приложении #android-биллинг #подписка в приложении #play-биллинг-библиотека

Вопрос:

Я использую billingclient в версии 3.0.1 для управления некоторыми подписками (ежемесячно, раз в два года и ежегодно).

 com.android.billingclient:billing-ktx:3.0.1
 

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

Но проблема заключается в автоматическом продлении. Я бы хотел видеть автоматическое продление каждый месяц в Play Store, я не вижу ни одного, но пользователи по-прежнему премиум-класса.

В тестах в режиме отладки автоматическое продление работает нормально (я мог протестировать версию в Play Store и мог видеть на Firebase мои автоматические обновления), но он работает только для тестовой учетной записи, а не для реальных пользователей. Чего мне не хватает?

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

  if (!purchase.isAcknowledged) {
            val acknowledgePurchaseParams = AcknowledgePurchaseParams.newBuilder()
                .setPurchaseToken(purchase.purchaseToken)
                .build()

            mBillingClient?.acknowledgePurchase(acknowledgePurchaseParams, acknowledgePurchaseResponseListener)
 }
 

Спасибо за вашу помощь 🙂

РЕДАКТИРОВАТЬ: здесь вызов queryPurchases:

  fun queryPurchases() {
        val queryToExecute = Runnable {
            val time = System.currentTimeMillis()
            val purchases = arrayListOf<Purchase>()
            mBillingClient?.queryPurchases(BillingClient.SkuType.INAPP)?.also { purchasesResult ->
                Timber.d("Querying purchases elapsed time: ${(System.currentTimeMillis() - time)} ms")
                if (purchasesResult.responseCode == BillingClient.BillingResponseCode.OK) {
                    if (!purchasesResult.purchasesList.isNullOrEmpty())
                        purchases.addAll(purchasesResult.purchasesList!!)
                }
                // If there are subscriptions supported, we add subscription rows as well
                when {
                    areSubscriptionsSupported() -> {
                        mBillingClient?.queryPurchases(BillingClient.SkuType.SUBS)?.also { subscriptionResult ->
                            Timber.d("Querying purchases and subscriptions elapsed time: ${(System.currentTimeMillis() - time)} ms")
                            Timber.d("Querying subscriptions result code: ${subscriptionResult.responseCode} res: ${subscriptionResult.purchasesList.orEmpty().size}")
                            if (subscriptionResult.responseCode == BillingClient.BillingResponseCode.OK) {
                                if (!subscriptionResult.purchasesList.isNullOrEmpty())
                                    purchases.addAll(subscriptionResult.purchasesList!!)
                            }
                            else {
                                handleError("queryPurchases() ${BillingClient.SkuType.SUBS}", subscriptionResult.responseCode)
                                Timber.d("Got an error response trying to query subscription purchases")
                                if (subscriptionResult.responseCode == BillingClient.BillingResponseCode.SERVICE_DISCONNECTED) {
                                    startServiceConnection {
                                        // Notifying the listener that billing client is ready
                                        billingUpdatesListener?.onBillingClientSetupFinished()
                                    }
                                }
                            }
                        }
                    }
                    purchasesResult.responseCode == BillingClient.BillingResponseCode.OK -> { }
                    else -> {
                        handleError("queryPurchases() ${BillingClient.SkuType.INAPP}", purchasesResult.responseCode)
                        Timber.d("queryPurchases() got an error response code: ${purchasesResult.billingResult.debugMessage}")
                        if (purchasesResult.responseCode == BillingClient.BillingResponseCode.SERVICE_DISCONNECTED) {
                            startServiceConnection {
                                // Notifying the listener that billing client is ready
                                billingUpdatesListener?.onBillingClientSetupFinished()
                            }
                        }
                    }
                }
                purchasesResult.purchasesList?.also {
                    it.clear()
                    it.addAll(purchases)
                }
                onQueryPurchasesFinished(purchasesResult)
            }
        }
        executeServiceRequest(queryToExecute)
    }
 

Сегодня я добавил в случаи ошибок проверки, отключена ли служба, чтобы повторить попытку подключения, поскольку в Firebase я получил несколько журналов, связанных с этим.

Комментарии:

1. Я думаю, что автоматическое продление выполняется выставлением счетов Google на стороне сервера, если элемент имеет тип подписки. Покажите нам фрагмент, который вызывает код queryPurchases, если можете

2. Спасибо @DonHa, я только что отредактировал основной пост с помощью вызова queryPurchases. Теперь со стороны Google есть автоматическое продление, но я не понимаю, почему оно работает с тестовой учетной записью, а не без, с реальным пользователем :/

3. Я вижу, что вы запрашиваете как INAPP, так и SUBS, покупки INAPP не продлеваются автоматически.

4. Да, но у меня есть только те, которые он использует. Я должен удалить INAPP, поскольку я его еще не использую (хотел его использовать, но никогда не внедрял что-то, что ему подходит). Может ли это быть проблемой?

5. Это не должно быть проблемой. Возможно, вам нужно войти в консоль разработчика, посмотреть отчет о подписке, чтобы убедиться, что все они активны.