Настоящий раздел содержит примеры кода для Kotlin.
Q: Как исправить ошибку «Application is not verified yet»?
А: Ошибка возникает в следующих случаях:
- приложение не прошло модерацию в Консоли RuStore;
- тестируемая разработчиком APK не совпадает с APK, загруженной в Консо ль RuStore.
Второй пункт нужно перепроверить следующим образом.
applicationId
, указанный вbuild.gradle
, должен совпадать сapplicationId
APK-файла, который вы публиковали в Консоли RuStore.- подпись
keystore
должна совпадать с подписью, которой было подписано приложение, опубликованное в Консоли RuStore. Убедитесь, что используемыйbuildType
(например,debug
) использует такую же подпись, что и опубликованное приложение (например,release
).
Q: Что означает ошибка AuthTokenException?
A: SDK не смогло авторизоваться. Проблема с подписью/именем пакета/наличием RuStore на девайсе.
Q: Как исправить ошибку Application signature not correct?
A: Проблема с подписями. Убедитесь, что подпись keystore
совпадает с подписью, которой вы подписали приложение в Консоли RuStore.
Q: Как исправить ошибку «Созданная ранее покупка продукта "..." в количестве ... на сумму ... рублей оплачивается в другой сессии».
A: Ошибка возникает при попытке купить продукт, покупка которого была прекращена и не переведена в конечное состояние с помощью методов deletePurchase
и confirmPurchase
.
Зачастую это происходит, когда процесс был прерван, а удаление или потребление (подтверждение) покупки не было вызвано в purchaseProduct
из-за некорректного завершения процесса.
Для таких случаев необходимо произвести отмену или потребление (подтверждение) «подвисших» покупок при старте приложения или открытии магазина.
Ниже представлен пример реализации обработки списка покупок. Запускайте этот код при старте приложения или при открытии экрана магазина.
val purchasesUseCase = billingClient.purchases
val purchases = purchasesUseCase.getPurchases().await().purchases.orEmpty()
purchases.forEach { purchase ->
val purchaseId = purchase.purchaseId
if (purchaseId != null) {
when (purchase.purchaseState) {
PurchaseState.CREATED, PurchaseState.INVOICE_CREATED -> {
purchasesUseCase.deletePurchase(purchaseId).await()
}
PurchaseState.PAID -> {
purchasesUseCase.confirmPurchase(purchaseId).await()
}
else -> Unit
}
}
}