Иногда люди сталкиваются с ошибкой инициализации биллинга, не до конца понимая, что это за ошибка и как её решить. Чтобы в этом разобраться для начала необходимо понять, что же такое биллинг.
Что такое биллинг?
Биллинг – (от английского «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
Поделиться
Ещё вопросы
- 0Как прочитать путь к файлу из ввода в C ++, чтобы вы могли открыть текстовый файл?
- 1Проверьте, существует ли элемент в XML, который заканчивается соответствующей строкой
- 0При реализации шаблонов у меня возникают проблемы «сопоставления определений функций с существующими объявлениями»
- 0Как изменить порядок внутри углового контроллера? Не используете orderBy в разметке?
- 0AngularJS console.log возвращает истинные данные, а затем пустой объект
- 1Как подключить андроид маркет в приложении?
- 0Добавление контента динамически
- 0Мне нужно сделать горизонтальное меню с движущимися изображениями в CSS3 и HTML
- 0Это допустимое использование идентификаторов HTML?
- 1Удалить родительский ключ из вложенного объекта
- 1Как включить логирование в Android программно
- 0Как определить, где находится «Ошибка» в файле сценария, используя Sublime Text 3
- 0Проверьте файлы в каталоге изменены
- 0Локальное хранилище HTML5, проверка правильности текстового поля
- 1Как узнать, что содержимое HttpResponse является строкой или потоком
- 0Как получить трассировку стека в IDE Netbeans C ++
- 0Как я могу воспроизвести несколько аудиоклипов с angularjs? Могу ли я выбрать файл из моего HTML?
- 0Проблема с z-индексом jQuery fancybox в сафари
- 1C # XML сериализация — изменить имя элемента массива
- 0установить фоновое изображение из выпадающего меню — JavaScript
- 1Как бы я динамически удалить компонент свинга из JPanel
- 1Как установить конкретное имя для загружаемого файла
- 0Angularjs разрешить postPromise не работает
- 1Заголовки отсутствуют, даже если они явно указаны при чтении файла .ORC с помощью PySpark
- 0Установить переменную для конкретной страницы в jquery
- 0директива angularjs не соответствует области действия. $ watch
- 0Где найти 7z dll?
- 1Невозможно назначить String Array для начальной загрузки DateTimePicker disabledDates
- 0ошибка c2244 пример кода байесовской сети dlib
- 1Как изменить операцию в Python с вводом? [Дубликат]
- 1Максимальный размер кэша Prefetcher достигнут
- 0Конфигурация NGINX: угловой SPA в корне и Slim REST API в подпапке
- 0Создайте несколько перетаскиваемых прямоугольников в элементе canvas html5
- 0Пустое сообщение для пользовательского интерфейса блока?
- 1Изменение заполнения CSS для SVG с помощью JS
- 1Не перенаправлять на страницу входа
- 0операторы if и if-else не работают с c ++
- 0Подключитесь к Bing Merchant Center с помощью phpseclib
- 0разрешить изменение URI в коде воспламенителя
- 1Можно ли аннотировать Java-метод для добавления кода до и после основного кода в методе?
- 1Использование IPAddress.Address вызывает исключение
- 1Нахождение термина в списке
- 0Служба AngularJS PUT в плоский файл JSON
- 1Есть ли способы запустить Android на XWindows?
- 1Создание столбца в Dataframe с использованием нескольких условий
- 0Получить максимальную дату для каждой строки в таблице в SQL
- 1Подключение приложения Android к HTTP-серверу
- 1Получить идентификатор входящего звонка Sip
- 0Что такое редактор WYSIWYG, используемый Stackoverflow?
- 1Сброс переменной позже в коде замедляет работу более раннего блока кода. Почему?
Содержание
- Инициализация — это приведение программы или устройства в состояние готовности к использованию. Ошибка инициализации — что делать?
- Общая информация
- Примеры инициализации
- Поговорим о программах
- Когда могут возникать проблемы?
- Как работает жесткий диск?
- Тестирование
- Восстановление
- Заключение
- Времена дешевой связи закончились
- Мошеннические схемы операторов связи?
- Исходящие звонки с выключенного телефона
- Обработка претензии
- Сбой системы или «ручной» биллинг?
- Мошенничество МТС?
- Какие выводы можно сделать
Инициализация — это приведение программы или устройства в состояние готовности к использованию. Ошибка инициализации — что делать?
Инициализация – это что такое? Для чего она проводится? Какие следствия её осуществления? Что делать при возникновении ошибок? Эти и множество иных вопросов мы рассмотрим в рамках данной статьи.

Общая информация
Для начала давайте разберёмся, что же собой представляет инициализация. Это обозначение используется для создания, активации, подготовке к работе и определению параметров программного обеспечения или аппаратной составляющей. Иными словами, они приводятся в состояние готовности к использованию. Процесс инициализации всегда направлен извне по отношению к объекту управления (программе или устройству). Он необходим для того, чтобы определить параметры и правила работы.

Примеры инициализации
Давайте представим несколько реальных ситуаций и разберёмся с ними. Итак, как, к примеру, выглядит процесс инициализации подсистемы печати, которая выводит данные на бумагу? Первоначально определяется, какое устройство будет работать. Учитываются все особенности, вроде формата печати, использования цветов, максимального разрешения и прочее. Чтобы получить такую информацию, устройство следует активировать, подав на него питание и управляющий сигнал. С помощью последнего и будут запрошены доступные параметры работы или запущен процесс сканирования возможностей. И полученные данные будут переданы в системный блок, где, после обработки, они будут представлены пользователю в виде вариантов печати, что доступны для оборудования. А что собой представляет инициализация программы? Так называется процесс, во время которого переменные устанавливаются в начальные значения или в ноль перед тем, как программа будет выполнена. Если же говорить, допустим, о магнитном диске, то в его случае это подразумевает запись управляющей информации и последующее форматирование.

Поговорим о программах
Как видите, инициализация – это важный аспект взаимодействия с информационными технологиями. Давайте рассмотрим, как же происходит этот процесс на примере загрузочной программы EXE. Итак, первоначально необходимо передать «Ассемблеру» указания, в которых будет иметься и соответствовать действительности информация про сегментные регистры. Затем сохраняется адрес в стеке, что находится в регистре DS. После этого он обнуляется. И в завершение – в регистр загружается адрес нужного сегмента данных. Когда работает «Ассемблер», то он может определять наличие смещений в отдельных областях. При этом перед загрузочным модулем включается 256-байтная область, которая известна ещё как префикс программного сегмента PSP. Чтобы установить адрес её начальной точки используется регистр DS. Пользовательская программа сохраняет адрес, помещая его в стек с последующим возвратом в DOS. И здесь часто возникает ошибка инициализации. Почему? Дело в том, что системе требуется, чтобы следующее значение было нулевым адресом стека. Для этого необходимо, чтобы с помощью специальной команды был очищен регистр AX. Если этого не сделать, то возникают проблемы. Когда же может возникнуть ошибка инициализации? При использовании нелицензионного программного обеспечения, когда не был произведён качественный взлом, или же, когда она запускается просто на разных операционных системах, и были перемещены адреса системных регистров.
Когда могут возникать проблемы?
Это весьма интересный вопрос, на который всё же нужно дать ответ, раскрыть его полностью. Рассмотрим, что собой представляет инициализация Windows. Первоначально подгружается базовая система ввода/вывода. И уже БСВВ инициализирует операционную систему. Если нет конфликтов с системными регистрами, то всё подгружается без проблем и так же функционирует. Но, допустим, была установлена пиратская операционная система. И пришло заводское обновление. Если согласиться на предложение его установить, то будет заменена часть информации, которая позволяет работать. И из-за внутренних механизмов безопасности функционирование будет блокировано. Иными словами, повреждение конфигурации любой программы – это самая частая причина того, что инициализация не возможна. Но, к счастью, это относится разве что к более старым версиям, нежели Windows 10, которая была сделана бесплатной. А сейчас давайте обратим внимание к аппаратной составляющей.

Как работает жесткий диск?
Поговорим о месте, где хранятся все наработанные нами данные. Инициализация жесткого диска включает в себя стартовую подготовку механики, определение в базовой системе ввода/вывода и активацию главной загрузочной записи. Последняя выступает в качестве главного управляющего звена, от которого зависит очередность обработки файлов, что составляют операционную систему. Если возникнет сбой в области главной загрузочной записи, то будет прекращено функционирование ОС и, соответственно, жесткий диск будет считаться не инициализированным. Следует отметить, что ошибка в данном случае может быть полной или же частичной. В первом случае запуск программного обеспечения будет прерываться текстовым сообщением, что уведомит о наличии проблем. И, соответственно, инициализация жесткого диска не будет проведена. Во втором случае операционная система может работать довольно корректно. Но всё же, часть данных будет недоступна для просмотра. Оба варианта требуют квалифицированной диагностики проблем.

Тестирование
Итак, мы знаем, что собой представляет инициализация. Это постепенно подводит к такому вопросу – а что делать в случае проблем? Первоначально необходимо протестировать проблему. Это можно сделать и вручную, разбираясь с теми ошибками, что выводит компьютер, или же воспользоваться любым некоммерческим продуктом соответствующего профиля. Многие считают, что они не удобны в плане использования и информативности и предпочитают использовать базовую систему ввода/вывода. В пользу последней следует отметить систематичность и методичность перебора информации, и высокую результативность подобного тестирования. К тому же, проверка в таких случаях проводится внимательно и небольшими «порциями» загрузочной области, причем – по битах. Если всё было перепробовано, а система не работает, то появляется сообщение о критическом сбое. В случае работы с программой выводится информация о проблеме.
Восстановление
С обычными программами всё просто. Можно попробовать переустановить её или же сделать восстановление системы. Если же говорить о проблемах аппаратуры, то тут немного сложней. Рассмотрим ситуацию на примере всё того же жесткого диска. Первоначально следует убедиться, что он вообще работает. Для этого его необходимо послушать. В случае неисправности, его, пожалуй, лучше выбросить и купить новый, ибо помочь тут можно только с помощью специализированной аппаратуры. Если он издаёт стандартные звуки, то следует:
- Провести полную перестройку структуры диска. Иными словами – отформатировать его (данные будут удалены), и заново смонтировать операционную систему.
- Перезаписать главную загрузочную запись с помощью стандартной утилиты. Подходит только для логических областей и существует вероятность удаления данных.
- Правка загрузочного сектора сторонними программами.
- Фиксация неисправности с использованием команды bootrec и осуществление реанимации дисковых структур.

Заключение
Вот и было рассмотрено, что же собой представляет инициализация. Частные примеры и случаи можно рассматривать ещё долго и упорно, но, увы, размеры статьи ограничены. Главное – что был рассмотрен сам механизм этого процесса.
Источник
Времена дешевой связи закончились
Как известно, в России мобильная связь является одной из самых дешевых в мире. Последние 10 лет стоимость мобильной связи неуклонно снижалась. Однако за последний год тенденция изменилась. В том числе из-за дополнительных расходов, которые государство переложило на операторов связи. Например, из-за закона Яровой о хранении пользовательского трафика.
Есть мнение, что государство негласно разрешило операторам повысить цены и увеличить выручку любым доступным способом. Одним из таких способов являются подписки на контент-сервисы и «ошибки в биллинге». История с подписками знакома многим — методы защиты и противодействия известны. А вот как бороться с откровенным воровством денег за неоказанные услуги, мы разберем сегодня.
Мошеннические схемы операторов связи?
В качестве примера будет не абстрактная ситуация, а вполне реальный случай, произошедший с абонентом МТС с почти 20-ти летним стажем пользования. Читатель отправил свою историю в редакцию Telecom Times. Поскольку оператор связи МТС не отреагировал должным образом на данную ситуацию, считаем правильным публично описать отношение оператора и предупредить других абонентов МТС о возможных подобных манипуляциях в отношении них.
Все помнят историю с «умными» воротами, которые подписывались на платные сервисы через сим-карту МТС. Сегодня, оказывается, SIM-карты МТС могут еще и перемещаться во времени и пространстве. Просто машина времени какая-то.
Исходящие звонки с выключенного телефона
В один из дней абонент МТС зашел в детализацию расходов и обнаружил три платных исходящих звонка. Сим-карта всегда лежит в одном месте в выключенном телефоне, все звонки абонента переадресуют на другой номер телефона. Безусловная переадресация подразумевает списание минут из пакета за каждый переадресованный вызов. Однако в детализации было четко видно, что имели место три платных исходящих звонка. Якобы абонент куда-то звонил.
Диалог с представителем колл-центра МТС можно представить следующим кратким образом. Абонент является клиентом категории VIP.
— Добрый день, у меня три платных звонка в детализации, которых не должно быть. Возможно, это ошибка. Верните списанные деньги.
— Добрый день. Да, видим три платных звонка. Вы находились за пределами домашнего региона.
— Как такое возможно? SIM-карта находится в выключенном телефоне, все звонки идут в режиме переадресации. Платных звонков не может быть в принципе.
— Ничего не знаю. Возврат денег невозможен.
— Возможно, в вашем биллинге была ошибка. Составьте обращение, пусть ваши специалисты проверят, извинятся, исправят ошибку и вернут деньги.
— Я ничего составлять не буду. Идите в офис обслуживания, там пишите заявление.
— Нет, вы обязаны составить обращение по запросу абонента. (Далее идет тирада о том, что данный оператор нарушает, — абонент долгое время работает в сфере телекоммуникаций).
Девушка вынуждена была капитулировать под напором четких нарушений с ее стороны и составить обращение. Всегда просите продиктовать номер обращения. Поскольку ситуация вышла за пределы стандартного обращения, абонент потребовал предоставить официальный ответ по данной проблеме на email. В том числе потребовал проверить корректность работы оператора колл-центра за отказ в составлении обращения.
Поскольку компания МТС запрещает вести запись разговора со своими операторами (при общении с номером 0890 вы не можете подключить третью линию в режиме конференц-связи для записи), точная запись диалога есть у компании МТС.
Обработка претензии
Далее в течение нескольких дней происходит возврат незаконно списанных денежных средств. Еще через 20 дней приходит официальный ответ от компании МТС. В нем извиняются за некорректное поведение оператора колл-центра, признают факт в нарушении работы биллинга, якобы передали проблему техническим специалистам. В качестве компенсации делают зачисление около 30 руб на лицевой счет абонента. Смешная сумма при количестве потраченных абонентом временных ресурсов для выяснения.
Сбой системы или «ручной» биллинг?
Но давайте попробуем копнуть дальше. По факту, МТС признал сбой в работе биллинга. После обращения клиента. О том, что такое биллинг, стоит сказать пару слов. Это сертифицированный программный комплекс, который в автоматическом режиме ведет учет оказанных услуг и их стоимости. Сертифицированный и автоматизированный. Ручное вмешательство должно быть исключено — все расчеты ведут автоматически.
Отсюда напрашивается вывод: если случился сбой, как это признали в МТС, значит это либо глобальный сбой, который затронул и других абонентов МТС. В этой ситуации МТС должны провести служебное расследование и вернуть всем абонентам, кого затронула проблема, незаконно списанные деньги. А самое главное — проинформировать об этом абонентов.
Либо в МТС есть режим «ручного» управления биллингом, когда 20-30 рублей как бы нечаянно списываются с абонентского счета. Это мошенничество МТС? И есть вероятность того, что они останутся незаметными в общей большой массе расходов абонентов на связь. Если умножить данную сумму в размере абонентской базы (несколько десятков миллионов абонентов), сумма получается немаленькая.
Мошенничество МТС?
Как можно квалифицировать действия оператора? Есть ощущение, что это может попадать под статью 159 УК РФ. Мошенничество. Оператор связи в данном случае злоупотребил доверием абонента. Денежные средства были списаны без ведома абонента за якобы оказанные услуги связи, которые, по факту, не были оказаны. И должно последовать наказание в соответствии со ст. 159. ч. 1.: «мошенничество, то есть хищение чужого имущества или приобретение права на чужое имущество путем обмана или злоупотребления доверием,
— наказывается штрафом в размере до ста двадцати тысяч рублей или в размере заработной платы или иного дохода осужденного за период до одного года, либо обязательными работами на срок до трехсот шестидесяти часов, либо исправительными работами на срок до одного года, либо ограничением свободы на срок до двух лет, либо принудительными работами на срок до двух лет, либо арестом на срок до четырех месяцев, либо лишением свободы на срок до двух лет».
Какие выводы можно сделать
— Оператор связи МТС злоупотребляет доверием своих абонентов даже с таким огромным стажем и статусом VIP. Или это даже мошенничество МТС? Даже сертифицированный биллинг якобы имеет ошибки. Это вопрос, который будет адресован надзорным органам в лице Роскомнадзора и Роспотребнадзора, которые должны следить за корректностью функционирования систем в составе узла связи (биллинг относится к одному из таких узлов).
— Если оператор связи отказывается принимать обращение по телефону — это нарушение правил оказания услуг электросвязи. Настаивайте — телефонный канал общения при валидации абонента является таким же официальным обращением, как и визит в офис.
— Контролируйте свои расходы хотя бы раз в месяц. Любые подозрительные операции трактуйте в свою пользу. Это оператор обязан доказать и подтвердить законность списаний денежных средств. Каждая финансовая операция должна иметь обоснование — оператор связи обязан предоставлять детализацию услуг.
— по факту незаконных списаний вы можете писать заявление в полицию о возбуждении уголовного дела по ст. 159 ч. 1 «Мошенничество». Читатель Telecom Times так и описал проблему: «Мошенничество МТС?» Только так операторы будут понимать, что контроль идет не только со стороны абонентов, но и государства. Ведь именно государство является гарантом законности всего, что с нами происходит.
Мнение редакции может не совпадать с мнением автора.
Источник
I am experiencing the same thing on 10.0.44.
What happens
We have a StoreActivity that creates a new BillingProcessor via constructor e.g.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_store);
// ...
bp = new BillingProcessor(this, LICENSE_KEY, MERCHANT_ID, new BillingProcessor.IBillingHandler() {//...}
I stepped through the code and onBillingInitialized is triggered shorty after this constructor executes and the following code starts to run:
public void handleBpResult() {
if (bp.isInitialized()) {
showView(mContent);
// set up price text
SkuDetails adFree = bp.getPurchaseListingDetails(Constants.SKU_PREMIUM);
As soon as bp.getPurchaseListingDetails(Constants.SKU_PREMIUM); is called the onBillingError callback is triggered and the infinite loop begins.
I checked and int errorCode for the callback is 6 and Throwable error is null. Case 6 in the switch for us is just a break which then starts the same handleBpResult function as above eventually running into bp.getPurchaseListingDetails(Constants.SKU_PREMIUM); and thus the cycle continues eventually crashing the app.
If I remove all billing processor related code from onBillingError then at least the infinite cycle is fixed but the errorCode 6 error will just appear later e.g. when the use attempts to purchase a store item.
Safety improvement
From a quick scan of the source getPurchaseListingDetails ends up calling getSkuDetails which interacts directly with the google inappbillingservice service. Thus calling anything that interacts with android billing like getPurchaseListingDetails inside the onBillingError could risk an infinite loop.
For our case the workaround is to use isPurchased which is a cache hit instead of interacting with the service and risking the loop. This is likely more efficient as well.
How to reproduce error code 6
Not sure. I have a device stuck in this state for any InAppBillingService related apps.
Blu Advance 5
Android 5.1
From settings>accounts I have a google account listed with sync off and when I click into the account for more details it says «Sync is currently experiencing problems. It will be back shortly»
Suggestions for improvement?
If possible getPurchaseListingDetails and getSubscriptionListingDetails could maybe be cache hits as well? From their function names it is not immediately obvious that they access billing service and they don’t appear to be used internally to build the cache.
From a quick glance, there doesn’t appear to be any public way to access purchase details from the cache even though the cache stores a map of ProductId->PurchaseInfo
I am experiencing the same thing on 10.0.44.
What happens
We have a StoreActivity that creates a new BillingProcessor via constructor e.g.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_store);
// ...
bp = new BillingProcessor(this, LICENSE_KEY, MERCHANT_ID, new BillingProcessor.IBillingHandler() {//...}
I stepped through the code and onBillingInitialized is triggered shorty after this constructor executes and the following code starts to run:
public void handleBpResult() {
if (bp.isInitialized()) {
showView(mContent);
// set up price text
SkuDetails adFree = bp.getPurchaseListingDetails(Constants.SKU_PREMIUM);
As soon as bp.getPurchaseListingDetails(Constants.SKU_PREMIUM); is called the onBillingError callback is triggered and the infinite loop begins.
I checked and int errorCode for the callback is 6 and Throwable error is null. Case 6 in the switch for us is just a break which then starts the same handleBpResult function as above eventually running into bp.getPurchaseListingDetails(Constants.SKU_PREMIUM); and thus the cycle continues eventually crashing the app.
If I remove all billing processor related code from onBillingError then at least the infinite cycle is fixed but the errorCode 6 error will just appear later e.g. when the use attempts to purchase a store item.
Safety improvement
From a quick scan of the source getPurchaseListingDetails ends up calling getSkuDetails which interacts directly with the google inappbillingservice service. Thus calling anything that interacts with android billing like getPurchaseListingDetails inside the onBillingError could risk an infinite loop.
For our case the workaround is to use isPurchased which is a cache hit instead of interacting with the service and risking the loop. This is likely more efficient as well.
How to reproduce error code 6
Not sure. I have a device stuck in this state for any InAppBillingService related apps.
Blu Advance 5
Android 5.1
From settings>accounts I have a google account listed with sync off and when I click into the account for more details it says «Sync is currently experiencing problems. It will be back shortly»
Suggestions for improvement?
If possible getPurchaseListingDetails and getSubscriptionListingDetails could maybe be cache hits as well? From their function names it is not immediately obvious that they access billing service and they don’t appear to be used internally to build the cache.
From a quick glance, there doesn’t appear to be any public way to access purchase details from the cache even though the cache stores a map of ProductId->PurchaseInfo