Обработка ошибок в Flutter SDK

Каждая ошибка, возвращаемая SDK, имеет тип AdaptyErrorCode. Пример:

Включите подробное логирование перед отладкой. Большинство ошибок AdaptyError оборачивают нижележащие ошибки StoreKit, Play Billing, сети или бэкенда. Включив подробные логи (await Adapty().setLogLevel(AdaptyLogLevel.verbose) — см. Логирование), вы увидите в консоли обёрнутую ошибку, которая обычно указывает на реальную причину.

Если эти решения не помогли, загляните в раздел Другие проблемы — там описаны шаги, которые стоит предпринять перед обращением в поддержку, чтобы мы могли помочь вам быстрее.

    try {
      final result = await adapty.makePurchase(product: product);
    } on AdaptyError catch (adaptyError) {
      if (adaptyError.code == AdaptyErrorCode.paymentCancelled) {
        // Cancelled
      }
    } catch (e) {
    }

Системные коды StoreKit

ОшибкаКодРешение
unknown0Код ошибки, указывающий на возникновение неизвестной или непредвиденной ошибки.
Повторите попытку или обратитесь к разделу Другие проблемы.
clientInvalid1Этот код ошибки означает, что клиенту не разрешено выполнять запрошенное действие.
paymentCancelled2

Этот код ошибки означает, что пользователь отменил запрос на оплату.

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

paymentInvalid3Эта ошибка означает, что один из параметров платежа не был распознан App Store.
paymentNotAllowed4Этот код ошибки означает, что пользователю не разрешено подтверждать платежи.
storeProductNotAvailable5Этот код ошибки означает, что запрошенный продукт недоступен в сторе.
Попробуйте переустановить приложение.
cloudServicePermissionDenied6Этот код ошибки означает, что пользователь не разрешил доступ к информации облачного сервиса.
cloudServiceNetworkConnectionFailed7Этот код ошибки означает, что устройству не удалось подключиться к сети.
cloudServiceRevoked8Этот код ошибки означает, что пользователь отозвал разрешение на использование этого облачного сервиса.
privacyAcknowledgementRequired9Этот код ошибки означает, что пользователь ещё не принял политику конфиденциальности Apple.
unauthorizedRequestData10Этот код ошибки означает, что приложение пытается использовать свойство, для которого у него нет необходимых прав.
invalidOfferIdentifier11

Идентификатор предложения недействителен. Например, вы не настроили предложение с таким идентификатором в App Store или отозвали его.

Убедитесь, что нужные предложения настроены в AppStore Connect, и передайте корректный идентификатор предложения.

invalidSignature12Этот код ошибки означает, что подпись в скидке на платёж недействительна.
missingOfferParams13Этот код ошибки означает, что в скидке на платёж отсутствуют параметры.
invalidOfferPrice14Этот код ошибки означает, что указанная вами цена в App Store Connect больше не является действительной. Предложения всегда должны представлять сниженную цену.

Пользовательские коды Android

ОшибкаКодРешение
adaptyNotInitialized20Необходимо правильно настроить Adapty SDK с помощью метода Adapty.activate. Узнайте, как это сделать для Flutter.
productNotFound22Эта ошибка означает, что запрошенный для покупки продукт недоступен в сторе.
invalidJson23JSON пейвола невалиден. Исправьте его в дашборде Adapty. Подробнее о том, как это сделать, см. в разделе Настройка пейвола с помощью Remote Config.
currentSubscriptionToUpdateNotFoundInHistory24Исходная подписка, которую необходимо продлить, не найдена.
pendingPurchase25Эта ошибка означает, что покупка находится в состоянии ожидания, а не завершена. Подробнее см. на странице Handling pending transactions в документации Android Developer.
billingServiceTimeout97Эта ошибка означает, что запрос превысил максимальное время ожидания ответа от Google Play. Причиной может быть, например, задержка при выполнении действия, запрошенного вызовом Play Billing Library.
featureNotSupported98Запрошенная функция не поддерживается Play Store на данном устройстве.
billingServiceDisconnected99Эта критическая ошибка означает, что соединение клиентского приложения с сервисом Google Play Store через BillingClient было разорвано.
billingServiceUnavailable102Эта временная ошибка означает, что сервис Google Play Billing сейчас недоступен. В большинстве случаев это связано с проблемой сетевого соединения между устройством клиента и сервисами Google Play Billing.
billingUnavailable103

Эта ошибка означает, что в процессе покупки произошла ошибка биллинга на стороне пользователя. Примеры ситуаций, в которых это может произойти:

1. Приложение Play Store на устройстве пользователя устарело.

2. Пользователь находится в неподдерживаемой стране.

3. Пользователь является корпоративным клиентом, и администратор компании запретил совершать покупки.

4. Google Play не может выполнить списание с платёжного метода пользователя. Например, истёк срок действия кредитной карты.

5. Пользователь не авторизован в приложении Play Store.

developerError105Это критическая ошибка, указывающая на некорректное использование API.
billingError106Это критическая ошибка, указывающая на внутреннюю проблему самого Google Play.
itemAlreadyOwned107Расходуемая покупка уже была приобретена.
itemNotOwned108Эта ошибка означает, что запрошенное действие над товаром не удалось выполнить, поскольку он не принадлежит пользователю.

Пользовательские коды StoreKit

ОшибкаКодРешение
noProductIDsFound1000

Эта ошибка означает, что ни один из продуктов, запрошенных на пейволе, недоступен для покупки в App Store, даже если они там перечислены. Иногда вместе с ней появляется предупреждение InvalidProductIdentifiers. Если предупреждение есть, а ошибки нет — игнорируйте его.

Если вы столкнулись с этой ошибкой, следуйте шагам в разделе Исправление ошибки Code-1000 noProductIDsFound.

noProductsFound1001Эта ошибка означает, что запрошенный для покупки продукт недоступен в сторе.
productRequestFailed1002Не удалось получить список доступных продуктов.
cantMakePayments1003Встроенные покупки запрещены на этом устройстве. См. гайд по устранению неполадок.
noPurchasesToRestore1004Эта ошибка означает, что App Store не нашёл покупок для восстановления.
cantReadReceipt1005

На устройстве нет действительного чека. Это может быть проблемой при тестировании в песочнице.

В песочнице действительный файл чека появляется только после реальной покупки, поэтому сначала совершите её. Также убедитесь, что на устройстве выполнен вход с действительной тестовой учётной записью Apple.

productPurchaseFailed1006Покупка продукта не удалась. Эта ошибка оборачивает исходную ошибку StoreKit — прочитайте вложенную ошибку (или включите подробные логи, чтобы увидеть её в консоли) для получения реальной причины. Как правило, вложенная ошибка — один из кодов StoreKit 0–14 из таблицы выше, чаще всего paymentCancelled, paymentInvalid, paymentNotAllowed или invalidOfferPrice. Если причину определить не удаётся, попробуйте новый профиль песочницы; если проблема сохраняется, обратитесь в поддержку Apple.
missingOfferSigningParams1007

Эта ошибка указывает на проблемы с интеграцией Adapty или с офферами.

Подробнее о настройке см. в разделах Настройка интеграции с App Store и Офферы.

refreshReceiptFailed1010Эта ошибка означает, что чек не был получен. Применимо только к StoreKit 1.
receiveRestoredTransactionsFailed1011Не удалось восстановить покупки.

Пользовательские сетевые коды

ОшибкаКодРешение
notActivated2002SDK Adapty не активирован.
Чаще всего возникает, когда экран загрузки или ранний UI-хук вызывает методы Adapty до того, как Adapty().activate завершится. Симптом непостоянный и может не воспроизводиться в эмуляторе из-за разницы в тайминге на реальных устройствах. Используйте await для Future activate перед любыми другими вызовами SDK. См. Порядок вызовов в Flutter SDK для полной последовательности.
badRequest2003Некорректный запрос.
Убедитесь, что вы выполнили все шаги, необходимые для интеграции с App Store.
serverError2004Ошибка сервера.
Повторите попытку через некоторое время. Если проблема не устраняется, обратитесь в службу поддержки Adapty.
networkFailed2005Ошибка указывает на проблемы с сетевым подключением на устройстве пользователя.
Попробуйте отключить VPN или переключиться с мобильной сети на Wi-Fi (или наоборот).
decodingFailed2006Ошибка указывает на сбой при декодировании ответа.
Проверьте свой код и убедитесь, что передаваемые параметры корректны. Например, эта ошибка может указывать на использование недействительного API-ключа.
encodingFailed2009Ошибка указывает на сбой при кодировании запроса.
analyticsDisabled3000Обработка аналитических событий недоступна, так как вы отключили её.
wrongParam3001Ошибка указывает на некорректные параметры.
Если вы используете Paywall Builder и не можете отобразить пейвол из-за этой ошибки, включите Show on device в Paywall Builder.
Другая возможная причина — версия локального файла резервного пейвола не соответствует версии SDK. Скачайте новый файл в дашборде.
activateOnceError3005Метод .activate нельзя вызывать более одного раза.
profileWasChanged3006Профиль пользователя был изменён во время операции.
Это происходит, когда метод вызывается в то время, как Adapty().identify ещё выполняется — незавершённый вызов попадает на профиль, который вот-вот будет заменён, и SDK его отклоняет. Всегда используйте await для identify перед любым вызовом, связанным с действиями пользователя. См. Порядок вызовов в Flutter SDK.
unsupportedData3007Ошибка указывает на то, что формат данных не поддерживается SDK.
persistingDataError3100Произошла ошибка при сохранении данных.
fetchTimeoutError3101Ошибка указывает на превышение времени ожидания при выполнении операции получения данных.

Другие проблемы

Если вы ещё не нашли решение, можно попробовать следующее:

  • Обновите SDK до последней версии: мы всегда рекомендуем обновляться до последних версий SDK, так как они более стабильны и содержат исправления известных проблем.
  • Обратитесь в службу поддержки или получите помощь от других разработчиков на форуме поддержки.
  • Напишите в поддержку на [email protected] или через чат: если вы не готовы обновить SDK или это не помогло, свяжитесь с нашей командой поддержки. Обратите внимание: проблема будет решена быстрее, если вы включите подробное логирование и поделитесь логами с командой. Вы также можете приложить соответствующие фрагменты кода.