Обработка ошибок в Unity SDK
Каждая ошибка, возвращаемая SDK, имеет тип AdaptyErrorCode. Вот пример:
Включите подробное логирование перед отладкой. Большинство AdaptyError оборачивают ошибку StoreKit, Play Billing, сети или бэкенда. Если включить verbose-логи (Adapty.SetLogLevel(AdaptyLogLevel.Verbose, ...) — см. Логирование), обёрнутая ошибка будет выведена в консоль, что обычно сразу указывает на реальную причину.
Если эти решения не помогли, см. раздел Другие проблемы — там описаны шаги, которые стоит предпринять перед обращением в поддержку, чтобы мы могли помочь вам быстрее.
using AdaptySDK;
Adapty.MakePurchase(product, (result, error) => {
if (error != null && error.Code == AdaptyErrorCode.CantMakePayments) {
// In-app purchases are not allowed on this device
}
});
Отмена покупки пользователем не является ошибкой. MakePurchase сообщает об этом через результат: result.Type равен AdaptyPurchaseResultType.UserCancelled — см. Совершение покупок.
Системные коды StoreKit
| Ошибка | Код | Решение |
|---|---|---|
| unknown | 0 | Неизвестная или непредвиденная ошибка. Повторите попытку или обратитесь к разделу Другие проблемы. |
| clientInvalid | 1 | Клиенту не разрешено выполнять запрошенное действие. |
| paymentCancelled | 2 | Пользователь отменил платёж. Никаких действий не требуется, однако с точки зрения бизнес-логики вы можете предложить скидку или напомнить о покупке позже. |
| paymentInvalid | 3 | Один из параметров платежа не распознан App Store. |
| paymentNotAllowed | 4 | Пользователю не разрешено авторизовывать платежи. |
| storeProductNotAvailable | 5 | Запрошенный продукт недоступен в сторе. Попробуйте переустановить приложение. |
| cloudServicePermissionDenied | 6 | Пользователь не предоставил доступ к данным облачного сервиса. |
| cloudServiceNetworkConnectionFailed | 7 | Устройству не удалось подключиться к сети. |
| cloudServiceRevoked | 8 | Пользователь отозвал разрешение на использование этого облачного сервиса. |
| privacyAcknowledgementRequired | 9 | Пользователь ещё не принял политику конфиденциальности Apple. |
| unauthorizedRequestData | 10 | Приложение пытается использовать свойство, для которого у него нет необходимого entitlement. |
| invalidOfferIdentifier | 11 |
Убедитесь, что нужные предложения настроены в App Store Connect, и передайте корректный идентификатор предложения. |
| invalidSignature | 12 | Подпись в платёжной скидке недействительна. |
| missingOfferParams | 13 | В платёжной скидке отсутствуют обязательные параметры. |
| invalidOfferPrice | 14 | Цена, указанная в App Store Connect, больше не является действительной. Предложения всегда должны предусматривать скидку относительно стандартной цены. |
Пользовательские коды Android
| Ошибка | Код | Решение |
|---|---|---|
| adaptyNotInitialized | 20 | Необходимо правильно настроить Adapty SDK с помощью метода Adapty.activate. Узнайте, как это сделать для Unity. |
| productNotFound | 22 | Эта ошибка означает, что запрошенный для покупки продукт недоступен в сторе. |
| invalidJson | 23 | JSON пейвола недействителен. Исправьте его в дашборде Adapty. Подробнее см. в разделе Настройка пейвола с помощью Remote Config. |
| currentSubscriptionToUpdateNotFoundInHistory | 24 | Исходная подписка, которую необходимо продлить, не найдена. |
| pendingPurchase | 25 | Эта ошибка означает, что покупка находится в состоянии ожидания, а не завершена. Подробнее см. на странице Обработка ожидающих транзакций в документации Android Developer. |
| billingServiceTimeout | 97 | Эта ошибка означает, что запрос достиг максимального времени ожидания до получения ответа от Google Play. Это может быть вызвано, например, задержкой выполнения действия, запрошенного вызовом Play Billing Library. |
| featureNotSupported | 98 | Запрошенная функция не поддерживается Play Store на данном устройстве. |
| billingServiceDisconnected | 99 | Эта критическая ошибка означает, что соединение клиентского приложения с сервисом Google Play Store через BillingClient было разорвано. |
| billingServiceUnavailable | 102 | Эта временная ошибка означает, что сервис Google Play Billing в данный момент недоступен. В большинстве случаев это указывает на проблему с сетевым подключением между устройством клиента и сервисами Google Play Billing. |
| billingUnavailable | 103 | Эта ошибка означает, что в процессе покупки произошла ошибка биллинга на стороне пользователя. Примеры ситуаций, когда это может произойти: 1. Приложение Play Store на устройстве пользователя устарело. 2. Пользователь находится в неподдерживаемой стране. 3. Пользователь является корпоративным пользователем, и администратор его организации запретил совершать покупки. 4. Google Play не может списать средства с платёжного метода пользователя. Например, истёк срок действия кредитной карты. 5. Пользователь не вошёл в приложение Play Store. |
| developerError | 105 | Это критическая ошибка, указывающая на некорректное использование API. |
| billingError | 106 | Это критическая ошибка, указывающая на внутреннюю проблему самого Google Play. |
| itemAlreadyOwned | 107 | Расходуемая покупка уже была совершена. |
| itemNotOwned | 108 | Эта ошибка означает, что запрошенное действие над элементом не выполнено, поскольку |
Пользовательские коды StoreKit
| Ошибка | Код | Решение |
|---|---|---|
| noProductIDsFound | 1000 | Эта ошибка означает, что ни один из продуктов, запрошенных на пейволе, недоступен для покупки в App Store, хотя они там перечислены. Иногда вместе с ошибкой может появляться предупреждение Если вы столкнулись с этой ошибкой, следуйте инструкциям в разделе Исправление ошибки Code-1000 |
| productRequestFailed | 1002 | В данный момент не удаётся получить список доступных продуктов. Возможная причина: - Кэш ещё не создан, и одновременно отсутствует подключение к интернету. |
| cantMakePayments | 1003 | Встроенные покупки не разрешены на этом устройстве. См. гайд по устранению неполадок здесь. |
| cantReadReceipt | 1005 | На устройстве нет действительного чека. Это может быть проблемой при тестировании в песочнице. Никаких действий не требуется, но с точки зрения бизнес-логики вы можете предложить пользователю скидку или напомнить ему позже. |
| productPurchaseFailed | 1006 | Покупка продукта не удалась. Эта ошибка оборачивает базовую ошибку StoreKit — прочитайте обёрнутую ошибку (или включите подробные логи, чтобы увидеть её в консоли) для выяснения реальной причины. Обёрнутая ошибка, как правило, является одним из кодов StoreKit 0–14 из таблицы выше — чаще всего paymentCancelled, paymentInvalid, paymentNotAllowed или invalidOfferPrice. Если определить конкретную причину не удаётся, попробуйте новый профиль песочницы; если проблема сохраняется, обратитесь в поддержку Apple. |
| refreshReceiptFailed | 1010 | Эта ошибка означает, что чек не был получен. Применимо только к StoreKit 1. |
| fetchSubscriptionStatusFailed | 1020 | SDK не смог считать статус подписки из стора. Повторите вызов, затем обратитесь к разделу Другие проблемы. |
Пользовательские сетевые коды
| Ошибка | Код | Решение |
|---|---|---|
| notActivated | 2002 | SDK Adapty не активирован. Чаще всего возникает, когда экран загрузки или ранний хук скрипта вызывают методы Adapty до завершения Adapty.Activate. Симптом непостоянен и может не воспроизводиться в редакторе, поскольку тайминг на реальном устройстве отличается. Дождитесь колбэка завершения Activate перед любым другим вызовом SDK. Подробнее — в разделе Порядок вызовов в Unity SDK. |
| badRequest | 2003 | Некорректный запрос. Убедитесь, что вы выполнили все шаги, необходимые для интеграции с App Store. |
| serverError | 2004 | Ошибка сервера. Повторите попытку через некоторое время. Если проблема не исчезает, обратитесь в службу поддержки Adapty. |
| networkFailed | 2005 | Ошибка указывает на проблемы с сетевым соединением на устройстве пользователя. Попробуйте отключить VPN или переключиться с мобильной сети на Wi-Fi или наоборот. |
| decodingFailed | 2006 | Ошибка декодирования ответа. Проверьте код и убедитесь, что передаваемые параметры корректны. Например, эта ошибка может указывать на использование недействительного API-ключа. |
| encodingFailed | 2009 | Ошибка кодирования запроса. |
| analyticsDisabled | 3000 | Обработка аналитических событий невозможна, так как вы отключили её. |
| wrongParam | 3001 | Один или несколько параметров некорректны. Если вы используете Paywall Builder и не можете отобразить пейвол из-за этой ошибки, включите Show on device в Paywall Builder. Ещё одна возможная причина — версия локального файла резервного пейвола не совпадает с версией SDK. Скачайте новый файл в дашборде. |
| activateOnceError | 3005 | Метод .activate нельзя вызывать более одного раза. |
| profileWasChanged | 3006 | Профиль пользователя был изменён во время операции. Это происходит, когда метод вызывается в то время, пока Adapty.Identify ещё не завершился — вызов попадает на профиль, который вот-вот будет заменён, и SDK его отклоняет. Дождитесь колбэка завершения Identify перед любым вызовом, связанным с действием пользователя. Подробнее — в разделе Порядок вызовов в Unity SDK. |
| unsupportedData | 3007 | Формат данных не поддерживается SDK. |
| fetchTimeoutError | 3101 | Истекло время ожидания операции получения данных. |
| operationInterrupted | 9000 | Операция была прервана системой. Повторите вызов. |
Другие проблемы
Если вы ещё не нашли решение, попробуйте следующее:
- Обновите SDK до последней версии: мы всегда рекомендуем использовать актуальные версии SDK — они стабильнее и содержат исправления известных проблем.
- Обратитесь в службу поддержки или получите помощь от других разработчиков на форуме поддержки.
- Напишите в поддержку на support@adapty.io или в чат: если вы не готовы обновлять SDK или обновление не помогло, свяжитесь с нашей командой поддержки. Проблема решится быстрее, если вы включите подробное логирование и поделитесь логами с командой. Также можно приложить соответствующие фрагменты кода.