#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. Это не должно быть проблемой. Возможно, вам нужно войти в консоль разработчика, посмотреть отчет о подписке, чтобы убедиться, что все они активны.