Привет, я Влад, core разработчик Adapty SDK для Android. Продолжаю серию статей про то, как внедрять внутренние покупки в приложение Google Play. Остальные посты можно найти по ссылкам:
-
Android in-app purchases, часть 1: конфигурация и добавление в проект.
-
Android in-app purchases, часть 2: инициализация и обработка покупок.
-
Android in-app purchases, часть 3: получение активных покупок и смена подписки.
-
Android in-app purchases, часть 4: коды ошибок от Billing Library и как не облажаться с тестированием. — Вы тут.
-
Android in-app purchases, часть 5: серверная валидация покупок.
Сегодня мы поговорим о кодах ошибок, которые мы можем получить от Billing Library в методе getResponseCode().
Пример того, как мы передавали ошибки в свои колбэки, можно посмотреть в этой статье. С одной ошибкой мы уже знакомы по предыдущим статьям — это USER_CANCELED, когда пользователь закрывает диалог покупки, ничего не купив. Давайте познакомимся с остальными.
Коды ошибок
Начнем с самых простых ошибок – с говорящим названием ERROR (responseCode 6) и чуть более говорящим названием DEVELOPER_ERROR (responseCode 5). Для первого случая гугл пишет в документации «Fatal error during the API action», для второго – «Invalid arguments provided to the API». Например, я смог получить DEVELOPER_ERROR, когда для запроса querySkuDetailsAsync() в билдер в setType() передал пустую строку.
Но не всё так просто. Я пошел дальше и в методе launchBillingFlow() использовал измененный SkuDetails (вытащил json из SkuDetails реального продукта, поменял в нем productId и передал в конструктор новому SkuDetails). По сути это invalid argument, и я ожидал получить DEVELOPER_ERROR, но… получил ERROR.
Отдельного упоминания заслуживает текст, который показывается в диалоге в этом кейсе — сравните английский и русский вариант:

Это, конечно, был искусственный пример. Гораздо ближе к реальности кейс, когда гугл отклонил оплату. Если при тестировании покупок с тестовой карты, о чем мы расскажем в конце статьи, в диалоге покупки выбрать «test card, always declined», вернется также ошибка ERROR, но уже с адекватным текстом.
В третьей статье, где описывалась смена подписки, мы для одного из proration mode увеличили цену годовой подписки почти в 3 раза, но не сказали, какая там должна была быть ошибка, если бы мы этого не сделали. Исправляемся.
Так как там, получается, указан неправильный proration mode, по логике мы должны получить всё ту же DEVELOPER_ERROR. Но нет, мы получаем SERVICE_UNAVAILABLE (responseCode 2). Ее же мы получаем и если указать любое левое число в качестве proration mode (это int, а не enum, нас никто не остановит), и если указать неправильный purchaseToken. Смотрим в документацию про SERVICE_UNAVAILABLE – «Network connection is down». Так, стоп…
При этом еще мы видим интересный диалог.

Что еще любопытно – в кейсе с ERROR при закрытии диалога НЕ через кнопку «ОК» (то есть, теми способами, которые интерпретируются как возврат назад) в onPurchasesUpdated() пришло, собственно, ERROR, а в случае с SERVICE_UNAVAILABLE в аналогичном кейсе приходит USER_CANCELED (но если нажать «ОК» в диалоге, то мы, как и ожидали, получим SERVICE_UNAVAILABLE).
Ну и в случае с отсутствием интернета SERVICE_UNAVAILABLE тоже приходит, тут не соврали.
Вот остальные коды ошибок с небольшими комментариями, так сказать, honorable mentions.
-
BILLING_UNAVAILABLE (responseCode 3). Гугл поясняет, что «Billing API version is not supported for the type requested». Я смог воспроизвести эту ошибку, разлогинившись из Google-аккаунта, а также на Хуавее без Google Play Services. Возможно, она также воспроизведется на старых телефонах, где не обновляли Google Play.
-
SERVICE_DISCONNECTED (responseCode -1). Приложение иногда дисконнектится от сервиса Google Play. Это может произойти, если Play Store вдруг решит обновиться. Поэтому лучше перестраховаться и коннектиться перед каждым вызовом методов Billing Library, как в предыдущих статьях. А еще мы с гуглом советуем добавить какую-нибудь retry policy, если эта ошибка всё же придет в ответе.
-
SERVICE_TIMEOUT (responseCode -3). Название говорит само за себя — мы слишком долго ждали ответ от Google Play.
-
FEATURE NOT SUPPORTED (responseCode -2). В классе BillingClient есть пять констант FeatureType. Их доступность на данном устройстве можно проверять с помощью метода billingClient.isFeatureSupported(BillingClient.FeatureType.НужнаяФича). У меня на телефоне (Xiaomi Mi A2 Lite) FEATURE_NOT_SUPPORTED вернулось только для SUBSCRIPTIONS_ON_VR. При этом для IN_APP_ITEMS_ON_VR, как и для всех остальных фич, вернулось OK.
-
ITEM_NOT_OWNED (responseCode 8). Возникает при попытке законсьюмить покупку, которой у нас нет. Например, повторно после успешного консьюма.
-
ITEM_ALREADY_OWNED (responseCode 7). А тут наоборот – при попытке купить продукт, который у нас уже есть. В таком кейсе просто нужно обновить UI и сделать кнопку покупки некликабельной.
Самая популярная ошибка
Последняя и, наверное, самая популярная ошибка в начале пути внедрения in-app purchases — это ITEM_UNAVAILABLE (responseCode 4). Она говорит о том, что продукт недоступен для покупки, но не говорит, почему. А причины могут быть самые разные: от тестирования на неправильном аккаунте или неправильной сборке до покупки неактивированного продукта.
Вот чек-лист, что нужно сделать, чтобы избежать ее при тестировании:
-
Отправить в ваш test track сборку с Billing Library. Это обязательное условие — при этом вы можете тестировать и на дебажных сборках с таким же applicationId, но важно, чтобы хотя бы один раз сборка с Billing Library была загружена в Play Console.
-
Добавить в этот test track гугл-аккаунты тестировщиков, что особенно актуально для internal testing или закрытой альфы/беты. Там же будет ссылка в разделе How testers join your test, по которой тестировщики должны будут принять приглашение.
-
Покупать можно только активированный продукт. После создания продукта в Play Console есть кнопка activate, более детально процесс создания продукта мы описывали в первой статье.
-
Удостовериться, что тестирование на устройстве проходит с гугл-аккаунта, который является тестировщиком. Очевидный пункт, но бывает всякое, и это тоже нужно проверить, если вы получили такую ошибку.
-
applicationIdсборки, с которой тестируется покупка, должно полностью совпадать с applicationId из Play Console. Это особенно важно для тех, у кого добавляется суффикс в дебажных сборках. -
Добавить email-адреса тестировщиков в раздел Setup → License Testing в левом меню аккаунта (не приложения), чтобы они покупали продукты бесплатно с тестовой карты, а не с реальной. Еще один плюс, что подписки в данном случае будут иметь тестовую длительность. Не связано с этой ошибкой, но тоже полезное знание.
Заключение
Ошибки способны сильно усложнить работу, поэтому всегда важно понимать, как они могут возникнуть. Учитывая, сколько шагов нужно пройти, чтобы получить доступ к продуктам, проще всего словить ITEM_UNAVAILABLE. Поэтому я надеюсь, что мой чек-лист вам поможет.
Про Adapty
Для более простой работы с ошибками советую попробовать Adapty SDK для внедрения внутренних покупок в приложения. Кроме технической части, Adapty даёт много преимуществ:
-
Встроенная аналитика позволяет быстро понять основные метрики приложения.
-
Когортный анализ отвечает на вопрос, как быстро сходится экономика.
-
А/Б тесты увеличивают выручку приложения.
-
Интеграции с внешними системами позволяют отправлять транзакции в сервисы атрибуции и продуктовой аналитики.
-
Промо-кампании уменьшают отток аудитории.
-
Open source SDK позволяет интегрировать подписки в приложение за несколько часов.
-
Серверная валидация и API для работы с другими платформами.
Познакомьтесь подробнее с этими возможностями, чтобы быстрее внедрить подписки в своё приложение и улучшить конверсии.
Иногда люди сталкиваются с ошибкой инициализации биллинга, не до конца понимая, что это за ошибка и как её решить. Чтобы в этом разобраться для начала необходимо понять, что же такое биллинг.
Что такое биллинг?
Биллинг – (от английского «bill» — счёт) это специальная система, выставляющая различные счета клиентам. Данные счета выставляются за использование каких-либо услуг компании или же за покупку товаров. В наше время биллинг в компаниях является крайне сложным комплексом технологий и программ, которые помогают вести учёт всех предоставленных услуг, устанавливать определённые тарифы и, в конечном итоге, отправлять клиентам счета, учитывая все акции и скидки.
В сотовой связи биллинг работает в реальном времени. То есть со счёта клиента денежные средства списываются моментально. За это клиент сразу же получает необходимые ему услуги (например, Интернет-трафик, SMS и др.). Чтобы работать в таком режиме, система должна быть очень надёжной, а стабильность работы не должна прерываться ни на секунду.
Ошибки инициализации биллинга
При покупке различного рода услуг у операторов связи (телекоммуникации) и даже при покупке различного контента в Интернете может возникнуть ошибка биллинга. Такие ошибки при выставлении счёта не дают возможность приобрести необходимые человеку услуги или товары, однако есть несколько способов для исправления этой ошибки.
Совершить покупку в другое время
Ошибка биллинга может появиться по разным причинам. Если человек сделал много запросов на приобретение товара или услуг, которые были отклонены, то скорее всего возникнет данная ошибка. К тому же, банковская карта, с которой должна производиться оплата может быть помечена как «Подозрительный способ оплаты». Также необходимо внимательно посмотреть, какой регион указан при покупке. Если регион указан неверно, то скорее всего появится ошибка биллинга.
В таких случаях клиенту необходимо подождать 1-2 суток и попытаться совершить покупку снова. Чаще всего достаточно подождать 24 часа, после чего совершение покупки не составит проблем.
Проверить правильность платёжной информации
Возможно ошибка возникает из-за неправильной платёжной информации клиента. Ему необходимо тщательно проверить все данные, которые он указывал. Это может быть регион, способ оплаты, банковская карта и другие данные. Из-за неправильно указанных данных система не может выставить счёт, выдавая такие ошибки биллинга.
Очистка кэша и изменение личных данных
Накопленный кэш зачастую является проблемой некорректной работы. Чтобы исправить это, достаточно просто удалить весь кэш с устройства. Если неполадки не устранились, то можно попробовать удалить личные данные и ввести их заново. Для обновления информации в системе может потребоваться от 3 до 48 часов. После этого можно заново проводить платёжные операции.
- Добавить свои
Оставьте свой комментарий
10 ответов
Совершенство! Я потратил много времени, пытаясь выяснить, почему я получаю ошибку. Ошибка аутентификации. Необходимо войти в свою учетную запись google. И через много часов я узнал — я пытался получить доступ к неправильному идентификатору элемента с консоли. В элементе подписки на консоль разработчика был включен «премиум», и я попытался получить доступ к элементу «premium_version». Глупая ошибка, но ошибка в google абсолютно не информативна. Надеюсь, что это поможет
Alex Perevozchykov
15 янв. 2015, в 12:30
Поделиться
В моем случае произошло то, что правильный продукт был настроен на консоли, однако он не был активирован.

nobre
10 июль 2015, в 21:56
Поделиться
Если кто-нибудь получит вышеупомянутое всплывающее окно, вы можете повторно проверить следующие шаги, потому что, к сожалению, это всплывающее окно google недостаточно информативно для подсказки.
- Убедитесь, что вы правильно используете идентификатор продукта (он должен быть таким же, как и на консоли разработчика).
- Перед тестированием убедитесь, что вы активировали продукт на консоли разработчика. Это может занять некоторое время, поэтому подождите, пока он будет готов.
- Убедитесь, что версия вашего приложения опубликована в Beta, Alpha или Production
- Не забудьте добавить тестовые письма в список тестировщиков (Настройки → Список тестировщиков → Создать список). Тестирование электронной почты должно отличаться от учетной записи издателя.
- Если в этом ничего не работает, попробуйте удалить учетную запись google на своем телефоне и добавить обратно и очистить данные в Play Маркете.
Надеюсь, что это поможет:)
Sachini Samarasinghe
30 дек. 2016, в 06:28
Поделиться
В моем случае мой base64EncodedPublicKey был неправильным, а также мой продукт inapp был неактивным. Убедитесь, что идентификатор продукта ur inapp такой же, как в консоли.
Fazal
12 март 2016, в 21:41
Поделиться
Я боролся с этой ошибкой часами. Мои идентификаторы продукта были правильными, приложение было опубликовано в Alpha, я активировал список тестеров Alpha, присоединившись к ссылке выбора, но ничего не работало.
В конце концов я обнаружил, что вы не можете использовать ту же учетную запись Gmail, которая используется для консоли разработчика. Вот и все, добавил еще одну учетную запись gmail в качестве тестера и использовал ее для загрузки приложения и больше ошибок аутентификации.
Кроме того, только заметка, вносящая изменения в приложение и построение отладочной версии, вызвала повторную ошибку. Могут использоваться только подписанные APK.
Stevo
02 нояб. 2016, в 22:49
Поделиться
Решено. Это была ошибка только Id продукта. Идентификатор продукта из Play-store и в приложении SKU_NAME должен быть таким же для биллинга приложений.
Это не упоминается правильно в проекте примера iab, который является productId
i.e SKU_GAS = «газ» и SKU_PREMIUM = «premium» в проекте
затем
«газ» и «премиум» должен быть доступен в play-store как productId.
Lokesh Tiwari
02 нояб. 2015, в 11:02
Поделиться
Если вы используете образцы Google (например, тривиальный диск), это может произойти из-за старого файла .aidl. Получите последнюю версию, чтобы протестировать ваше приложение.
VSB
21 авг. 2016, в 17:32
Поделиться
Убедитесь, что вы создаете и подписываете приложение с тем же хранилищем ключей, что вы подписали APK, который был загружен на бета-канал Google Play.
Я допустил ошибку при подписании с разными Keystores и не заметил этого.
nightfixed
18 март 2016, в 18:27
Поделиться
Убедитесь, что вы вошли в Play Store с тестовой учетной записью. Перезагрузите телефон. Он должен работать, по крайней мере, в моем случае необходим перезапуск.
erdomester
27 дек. 2015, в 19:21
Поделиться
Я столкнулся с одной и той же проблемой, используя правильный идентификатор продукта для каждого элемента «Купить приложение». Мое приложение было готово к публикации в Google Play (с APK в альфа-тестировании), но оно не было отправлено. Решение заключалось в том, чтобы отправить приложение для просмотра командой разработчиков Google Play Developer.
Надеюсь, это поможет вам!
Javier S.
11 окт. 2015, в 00:17
Поделиться
Ещё вопросы
- 1Как добавить безопасность в Java.
- 0Jquery добавление дополнительных # к объектам DOM
- 0C ++ вызывает исключение std :: bad_alloc для очень маленького std :: vector с использованием std :: sort
- 0Вставьте CSS во внешнюю таблицу стилей с помощью jquery
- 1Отображение диалогового окна Android вне приложения
- 1Как выделить поле в отчете rdlc, если оно было изменено по сравнению с предыдущей строкой?
- 0Как я могу сопоставить ‘*’ в регулярном выражении
- 1Есть ли способ использовать querySelector, чтобы получить открытую тень дом
- 1Поток данных (TPL) — проблема обработки исключений?
- 1Показывать информацию о версии только один раз при запуске приложения в Android App
- 0Проверьте, действительно ли строка, содержащая html, пуста
- 0Я звоню на многие сессии JQuery?
- 0Как реализовать Firebase в $ asyncValidators?
- 1Выборочная страница бесконечной прокрутки
- 0AngularJS ngTagsInput автозаполнение
- 1Android Generate QR Scan изображение
- 1Как включить HTML в Email Send
- 1Python — загрузка файла в памяти (сгенерированного вызовами API) в FTP по частям
- 1Эффективно сравнивайте серии поплавков панд с рядами панд
- 0Как ввести случайные числа в предложении, где в SQL
- 0Как преобразовать мою ручку в угловое дерево?
- 0Кто-нибудь знает, как называется технология, которая отображает графику в окне терминала на Linux?
- 1Как обрабатывать несколько потоков одновременно с помощью Task Parallel Library
- 1Ручной фильтр даты в пандах
- 1Вставьте более 1000 записей в SQL Server 2008 за один раз
- 1Как передать классический ASP Scripting.Dictionary в библиотеку классов C # COM?
- 0JQuery FadeIn, FadeOut DIV
- 1Индекс массива внутри векторизации
- 1_.bindAll не работает при визуализации представления Backbone
- 0Отправить выбранные элементы в поле?
- 1Как объединить два тензора, имеющих разную форму, с TensorFlow?
- 0функция привязки динамически на jQuery
- 0Ионная функция запуска приложения при втором нажатии
- 0Ошибка проверки PHP
- 1Выполнение расчета со всеми предыдущими значениями в пандах
- 0facebook: Как я могу получить ссылки на оригинальные фотографии из сообщений публичной группы
- 1Где или как настроить время ожидания обслуживания?
- 0Форма ввода используется в качестве параметров конструктора класса
- 0$ rootScope для установки активной вкладки не работает
- 1Получение пустых значений с использованием Javascript
- 1Two_body_problem: scipy.integrate.RK45 выдает ошибку трансляции, и scipy.integrate.LSODA никогда не входит в функцию twoBody
- 0Как я могу получить данные из двух HTML Div, используя preg_match?
- 0QFileDialog не дает выбранный файл
- 1Не удалось подключить поток во время выполнения Android
- 0OpenCV VideoCapture :: set () возвращает false, но успешно
- 0MySQL получает количество книг для каждого пользователя
- 0По центру выровнять div, который имеет float: left
- 0Как получить доступ к отдельному типу внутри std :: list <std :: list <type>>
- 0Анализ ответа ASMX с помощью PHP и SimpleXML
- 0Обновление параметров функции onblur из textarea

Приветствую! Про данную ошибку в интернете написано не очень много. В российском сегменте всемирной паутины вообще практически ничего нет — в основном вся информация расположена на англоязычных сайтах. Но, в тоже время, в комментариях на сайте меня частенько спрашивают — что это за ошибка такая? Поэтому и было решено восполнить данный информационный вакуум. Хотя, честно говоря, рассказывать-то особенно и нечего.
Итак, переходим к сути проблемы. Вот в чем она заключается — при загрузке или обновлении любого приложения из App Store (не важно, платного или бесплатного) появляется табличка с надписью: «There is a billing problem with a previous purchase…» (приблизительный перевод которой — возникли проблемы с предыдущей покупкой).
Это «стандартное» начало, а вот продолжение может быть разным:
- Please edit your billing info to correct the problem (Пожалуйста, отредактируйте платежную информацию).
- Click Purchase History to view and correct the problem. If you cancel you will not be able to buy until this billing issue has been resolved (Здесь нас просят обратить внимание на историю покупок и оплатить неоплаченные заказы).
Но при любом из этих вариантов напрашивается одинаковый вывод:
Возникли проблемы с оплатой покупок в App Store.
Так как получается, что вы должны Apple денег, то компания блокирует все платные (да и бесплатные) операции по вашей учетной записи Apple ID до момента разрешения этого вопроса.

Именно поэтому становится невозможной загрузка приложений, обновление, да и абсолютно любая другая деятельность с сервисами Apple.
Что можно сделать и как убрать надоедливое окно с ошибкой «There is a billing problem with a previous purchase…»:
- Проверьте, совпадает ли информация указанная в учетной записи Apple ID (имя, фамилия, дата рождения) с той, на которую зарегистрирована карточка. Грубо говоря, нужно чтобы владелец карты и владелец учетки был одним и тем же лицом.
- Карта должна быть активной и работоспособной — на ней есть деньги (или кредитный лимит), она не является заблокированной или просроченной.
- Нужно обратить внимание на то, есть ли в истории ваших операций неоплаченные подписки или покупки.
- Проверьте что Apple ID не отключен и не заблокирован по соображениям безопасности. Иными словами, у вас должен быть полный доступ к учетной записи — как на официальном сайте Apple (раздел «управлять Apple ID»), так и на iPhone или iPad.
- Если используется «Семейный доступ», то необходимо проверить на вышеописанные ошибки аккаунты всех (!) участников «Семьи».
В общем, повторюсь, про данную ошибку и рассказывать-то особенно нечего, ведь большинство советов сводится к одному решению — нужно проверить работоспособность и платежеспособность карты, привязанной к учетной записи.
Как правило, сразу же после внесения необходимых изменений или пополнения баланса:
- Apple моментально проверяет данные.
- «There is a billing problem…» исчезает.
Однако, если вы уверены, что все условия полностью соблюдены (а ошибка по-прежнему «на месте»!), то есть универсальный способ исправления — обращение в техническую поддержку. И не стоит этим пренебрегать — специалисты могут посмотреть вашу историю покупок и подсказать, какое приложение требует оплаты.
Другое дело, что не всегда есть желание оплачивать подписку или покупку (особенно если они произошли случайно и непреднамеренно), но это уже немного другая история…
Да и в целом, специалистам поддержки намного виднее — в чем «затык» и почему на вашем iPhone или iPad происходят проблемы с биллингом в App Store. Поверьте, не стоит недооценивать их помощь.
P.S. По уже сложившейся хорошей традиции нужно обязательно сделать две вещи — написать комментарий (если есть вопросы) и поставить «лайк» (это в любом случае). Действуем!:)
![]()
Дорогие друзья! Минутка полезной информации:
1. Вступайте в группу ВК — возможно, именно там вы сможете получить всю необходимую вам помощь!
2. Иногда я занимаюсь ерундой (запускаю стрим) — играю в игрушки в прямом эфире. Приходите, буду рад общению!
3. Вы всегда можете кинуть деньги в монитор (поддержать автора). Респект таким людям!
P.S. Моя самая искренняя благодарность (карта *9644, *4550, *0524, *9328, *1619, *6732, *6299, *4889, *1072, *9808, *7501, *6056, *7251, *4949, *6339, *6715, *4037, *2227, *8877, *7872, *5193, *0061, *7354, *6622, *9273, *5012, *1962, *1687 + перевод *8953, *2735, *2760 + без реквизитов (24.10.2021 в 18.34; 10.12.2021 в 00.31)) — очень приятно!
Привет, я Влад, core разработчик Adapty SDK для Android. Продолжаю серию статей про то, как внедрять внутренние покупки в приложение Google Play. Остальные посты можно найти по ссылкам:
-
Android in-app purchases, часть 1: конфигурация и добавление в проект.
-
Android in-app purchases, часть 2: инициализация и обработка покупок.
-
Android in-app purchases, часть 3: получение активных покупок и смена подписки.
-
Android in-app purchases, часть 4: коды ошибок от Billing Library и как не облажаться с тестированием. — Вы тут.
Сегодня мы поговорим о кодах ошибок, которые мы можем получить от Billing Library в методе getResponseCode().
Пример того, как мы передавали ошибки в свои колбэки, можно посмотреть в этой статье. С одной ошибкой мы уже знакомы по предыдущим статьям — это USER_CANCELED, когда пользователь закрывает диалог покупки, ничего не купив. Давайте познакомимся с остальными.
Коды ошибок
Начнем с самых простых ошибок – с говорящим названием ERROR (responseCode 6) и чуть более говорящим названием DEVELOPER_ERROR (responseCode 5). Для первого случая гугл пишет в документации «Fatal error during the API action», для второго – «Invalid arguments provided to the API». Например, я смог получить DEVELOPER_ERROR, когда для запроса querySkuDetailsAsync() в билдер в setType() передал пустую строку.
Но не всё так просто. Я пошел дальше и в методе launchBillingFlow() использовал измененный SkuDetails (вытащил json из SkuDetails реального продукта, поменял в нем productId и передал в конструктор новому SkuDetails). По сути это invalid argument, и я ожидал получить DEVELOPER_ERROR, но… получил ERROR.
Отдельного упоминания заслуживает текст, который показывается в диалоге в этом кейсе — сравните английский и русский вариант:

Это, конечно, был искусственный пример. Гораздо ближе к реальности кейс, когда гугл отклонил оплату. Если при тестировании покупок с тестовой карты, о чем мы расскажем в конце статьи, в диалоге покупки выбрать «test card, always declined», вернется также ошибка ERROR, но уже с адекватным текстом.
В третьей статье, где описывалась смена подписки, мы для одного из proration mode увеличили цену годовой подписки почти в 3 раза, но не сказали, какая там должна была быть ошибка, если бы мы этого не сделали. Исправляемся.
Так как там, получается, указан неправильный proration mode, по логике мы должны получить всё ту же DEVELOPER_ERROR. Но нет, мы получаем SERVICE_UNAVAILABLE (responseCode 2). Ее же мы получаем и если указать любое левое число в качестве proration mode (это int, а не enum, нас никто не остановит), и если указать неправильный purchaseToken. Смотрим в документацию про SERVICE_UNAVAILABLE – «Network connection is down». Так, стоп…
При этом еще мы видим интересный диалог.

Что еще любопытно – в кейсе с ERROR при закрытии диалога НЕ через кнопку «ОК» (то есть, теми способами, которые интерпретируются как возврат назад) в onPurchasesUpdated() пришло, собственно, ERROR, а в случае с SERVICE_UNAVAILABLE в аналогичном кейсе приходит USER_CANCELED (но если нажать «ОК» в диалоге, то мы, как и ожидали, получим SERVICE_UNAVAILABLE).
Ну и в случае с отсутствием интернета SERVICE_UNAVAILABLE тоже приходит, тут не соврали.
Вот остальные коды ошибок с небольшими комментариями, так сказать, honorable mentions.
-
BILLING_UNAVAILABLE (responseCode 3). Гугл поясняет, что «Billing API version is not supported for the type requested». Я смог воспроизвести эту ошибку, разлогинившись из Google-аккаунта, а также на Хуавее без Google Play Services. Возможно, она также воспроизведется на старых телефонах, где не обновляли Google Play.
-
SERVICE_DISCONNECTED (responseCode -1). Приложение иногда дисконнектится от сервиса Google Play. Это может произойти, если Play Store вдруг решит обновиться. Поэтому лучше перестраховаться и коннектиться перед каждым вызовом методов Billing Library, как в предыдущих статьях. А еще мы с гуглом советуем добавить какую-нибудь retry policy, если эта ошибка всё же придет в ответе.
-
SERVICE_TIMEOUT (responseCode -3). Название говорит само за себя — мы слишком долго ждали ответ от Google Play.
-
FEATURE NOT SUPPORTED (responseCode -2). В классе BillingClient есть пять констант FeatureType. Их доступность на данном устройстве можно проверять с помощью метода billingClient.isFeatureSupported(BillingClient.FeatureType.НужнаяФича). У меня на телефоне (Xiaomi Mi A2 Lite) FEATURE_NOT_SUPPORTED вернулось только для SUBSCRIPTIONS_ON_VR. При этом для IN_APP_ITEMS_ON_VR, как и для всех остальных фич, вернулось OK.
-
ITEM_NOT_OWNED (responseCode 8). Возникает при попытке законсьюмить покупку, которой у нас нет. Например, повторно после успешного консьюма.
-
ITEM_ALREADY_OWNED (responseCode 7). А тут наоборот – при попытке купить продукт, который у нас уже есть. В таком кейсе просто нужно обновить UI и сделать кнопку покупки некликабельной.
Самая популярная ошибка
Последняя и, наверное, самая популярная ошибка в начале пути внедрения in-app purchases — это ITEM_UNAVAILABLE (responseCode 4). Она говорит о том, что продукт недоступен для покупки, но не говорит, почему. А причины могут быть самые разные: от тестирования на неправильном аккаунте или неправильной сборке до покупки неактивированного продукта.
Вот чек-лист, что нужно сделать, чтобы избежать ее при тестировании:
-
Отправить в ваш test track сборку с Billing Library. Это обязательное условие — при этом вы можете тестировать и на дебажных сборках с таким же applicationId, но важно, чтобы хотя бы один раз сборка с Billing Library была загружена в Play Console.
-
Добавить в этот test track гугл-аккаунты тестировщиков, что особенно актуально для internal testing или закрытой альфы/беты. Там же будет ссылка в разделе How testers join your test, по которой тестировщики должны будут принять приглашение.
-
Покупать можно только активированный продукт. После создания продукта в Play Console есть кнопка activate, более детально процесс создания продукта мы описывали в первой статье.
-
Удостовериться, что тестирование на устройстве проходит с гугл-аккаунта, который является тестировщиком. Очевидный пункт, но бывает всякое, и это тоже нужно проверить, если вы получили такую ошибку.
-
applicationIdсборки, с которой тестируется покупка, должно полностью совпадать с applicationId из Play Console. Это особенно важно для тех, у кого добавляется суффикс в дебажных сборках. -
Добавить email-адреса тестировщиков в раздел Setup → License Testing в левом меню аккаунта (не приложения), чтобы они покупали продукты бесплатно с тестовой карты, а не с реальной. Еще один плюс, что подписки в данном случае будут иметь тестовую длительность. Не связано с этой ошибкой, но тоже полезное знание.
Заключение
Ошибки способны сильно усложнить работу, поэтому всегда важно понимать, как они могут возникнуть. Учитывая, сколько шагов нужно пройти, чтобы получить доступ к продуктам, проще всего словить ITEM_UNAVAILABLE. Поэтому я надеюсь, что мой чек-лист вам поможет.
Про Adapty
Для более простой работы с ошибками советую попробовать Adapty SDK для внедрения внутренних покупок в приложения. Кроме технической части, Adapty даёт много преимуществ:
-
Встроенная аналитика позволяет быстро понять основные метрики приложения.
-
Когортный анализ отвечает на вопрос, как быстро сходится экономика.
-
А/Б тесты увеличивают выручку приложения.
-
Интеграции с внешними системами позволяют отправлять транзакции в сервисы атрибуции и продуктовой аналитики.
-
Промо-кампании уменьшают отток аудитории.
-
Open source SDK позволяет интегрировать подписки в приложение за несколько часов.
-
Серверная валидация и API для работы с другими платформами.
Познакомьтесь подробнее с этими возможностями, чтобы быстрее внедрить подписки в своё приложение и улучшить конверсии.
When Google Play has not been signed in, running BillingClient.startConnection() results in BillingResult returned by onBillingSetupFinished() showing billingResult.getDebugMessage():
Google Play In-app Billing API version is less than 3
This error is gone as soon as Google Play is signed in.
Is there a way to get an accurate error for this situation?
asked Dec 11, 2019 at 14:56
1
The message indicates that you are using a Google Play Developer API that is lower than v3.
The Google Play Developer API will only support the v3 endpoint after 1 December, 2019. Here is the blog post:
https://android-developers.googleblog.com/2019/03/changes-to-google-play-developer-api.html
For more context, the Google Play Billing Library (currently 2.1.0) is the client API used in your Android app.
The Google Play Developer API (currently v3) is the server API used for managing purchases and managing your app on Google Play.
answered Dec 19, 2019 at 18:53
CarenCaren
1,3382 gold badges13 silver badges22 bronze badges
1
When Google Play has not been signed in, running BillingClient.startConnection() results in BillingResult returned by onBillingSetupFinished() showing billingResult.getDebugMessage():
Google Play In-app Billing API version is less than 3
This error is gone as soon as Google Play is signed in.
Is there a way to get an accurate error for this situation?
asked Dec 11, 2019 at 14:56
1
The message indicates that you are using a Google Play Developer API that is lower than v3.
The Google Play Developer API will only support the v3 endpoint after 1 December, 2019. Here is the blog post:
https://android-developers.googleblog.com/2019/03/changes-to-google-play-developer-api.html
For more context, the Google Play Billing Library (currently 2.1.0) is the client API used in your Android app.
The Google Play Developer API (currently v3) is the server API used for managing purchases and managing your app on Google Play.
answered Dec 19, 2019 at 18:53
CarenCaren
1,3382 gold badges13 silver badges22 bronze badges
1
Я использую код InApp V3 для покупок в моем приложении, я получаю эту ошибку BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE и error value :3, когда учетная запись Google недоступна на устройстве. Я хочу знать, есть ли другие возможности получить эту ошибку, потому что, когда я получаю эту ошибку, мне нужно показать пользователю всплывающее окно с некоторыми данными. Если это вызвано тем, что учетная запись Google недоступна на устройстве, я покажу диалоговое окно со связанным текстом. это код, который я использую
mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
public void onIabSetupFinished(IabResult result) {
if (!result.isSuccess()) {
// error here
return;
}
}
});
Это ошибка Error checking for billing v3 support. (response: 3:Billing Unavailable)
8 ответов
Лучший ответ
Как мы видим непосредственно в код настройки IabHElper образца, предоставленного Google, ошибка означает:
«Платежная служба недоступна на устройстве».
Как вы можете прочитать здесь, эта ошибка означает
Billing API version is not supported for the type requested
Это Справочник по биллингу в приложении (IAB версии 3), поэтому ошибка означает, что IAB v3 не установлен на устройстве.
Фактически это означает, что у пользователя есть учетная запись Google и, вероятно, также служба биллинга в приложении, но у нее нет последней версии. Это происходит на старых устройствах, где пользователь никогда ничего не обновляет. Раньше это были устройства, на которых вы могли видеть старое приложение Market вместо приложения Play.
Таким образом, ошибка, которую вы должны показать пользователю, и тест, который вы должны выполнить, заключается не в том, есть ли на устройстве учетная запись Google, а в том, что на нем установлены и должным образом обновлены службы Google Play.
Если вы ищете код во всех библиотечных SDK и вспомогательных классах, предоставляемых Google, единственное место, где мы можем найти это именно в вызываемой вами функции: startSetup из IabHelper класс
Intent serviceIntent = new Intent(
"com.android.vending.billing.InAppBillingService.BIND");
if (!mContext.getPackageManager().queryIntentServices(serviceIntent, 0)
.isEmpty()) {
// service available to handle that Intent
mContext.bindService(serviceIntent, mServiceConn,
Context.BIND_AUTO_CREATE);
} else {
// no service available to handle that Intent
mServiceConn=null;
if (listener != null) {
listener.onIabSetupFinished(new IabResult(
BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE,
"Billing service unavailable on device."));
}
}
Это означает, что приложению не удалось подключиться к службе на устройстве, поскольку диспетчер пакетов даже не знает об этом . Это единственный вариант, который может вызвать эту ошибку. И что это значит, что он не смог подключиться к услуге? Это означает одно из следующих:
- На устройстве не установлена служба.
- У него старая версия, поскольку мы знаем, что в последних версиях игрового магазина используется IAB v3.
Итак, ваша ошибка может означать только одно из них, что для вас означает, что вы должны показать пользователю сообщение типа «У вас не установлены службы Google Play или вам необходимо обновить их». И нет других возможностей получить эту ошибку.
Но, если вы хотите, чтобы пользователям было проще, вы можете сказать, что им нужно обновить приложение Google Play до последней версии . И это заставит все работать как шарм.
38
Null
16 Апр 2021 в 11:42
Эта ошибка также возникает после того, как пользователь удаляет свою учетную запись Google с устройства.
17
pareshgoel
30 Июл 2014 в 14:22
Войдите в Play Маркет с любой учетной записью.
После входа в систему биллинг работает даже на Android Studio Emulator.
8
Babken Vardanyan
7 Апр 2018 в 09:58
Основная вероятность вашей проблемы BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE заключается в том, что в некоторых странах покупка в приложении по-прежнему не разрешена, например в Сербии и многих других странах.
Таким образом, любой пользователь из страны, где Google Play не поддерживает покупку в приложении, получит BILLING_RESPONSE_RESULT_BILLING_UNAVAILABLE.
Это будет меньше шансов, что у пользователя не установлена обновленная служба Google Play на телефоне, поэтому не беспокойтесь об этом случае.
7
N Sharma
22 Янв 2014 в 10:52
Попробуйте эти хаки
Удалите кеш, данные и обновления для приложения для воспроизведения, перезапустите приложение для воспроизведения снова, оно должно работать! или попробуйте установить последние обновления (если они исправлены)
FYI :
Только имейте в виду:
-
IABv3 встроен в сервисы Google Play, поэтому требуется обновление до APK Play Services.
-
Версия V2 была встроена в сам клиент магазина Play. Проблема с кешем / лицензионным соглашением не имеет прямого отношения к IAB, это связано с настройкой Play Сервисы (и, надеюсь, не нужны большинству пользователей, часть кеша в любом случае).
-
Обидно быть в этот переходный период, когда у Play Services есть быть обновленным, прежде чем ваше приложение сможет использовать это в своих интересах, но я думаю большинство людей согласятся, что это лучше, чем ждать ОС Обновить.’
См. Эту ссылку: отчет об ошибке, сообщение в Google+
2
LOG_TAG
21 Янв 2014 в 12:20
Иногда, если вы не аутентифицировали свое устройство с помощью учетной записи Google, может появиться эта ошибка.
1
User2364902
7 Дек 2016 в 07:21
Для тех, кто все еще сталкивается с этой проблемой, в большинстве случаев iab не поддерживается в вашей стране, как сказал Уильямс. Вы можете использовать VPN, чтобы заставить его работать.
1
Drilon Blakqori
4 Апр 2017 в 00:33
Если вы находитесь в Тонге (как я) или в любой другой стране, где вы не можете покупать приложения в Google Play, вы должны использовать VPN для проверки биллинга. В противном случае вы получите эту ошибку.
0
John T
1 Июл 2019 в 08:44