Qr код на чеке как прочитать api

Обновлено: 05.07.2024

С 2018 года ФНС России запустила в работу сервис информационного обмена по бесплатному предоставлению внешним пользователям (покупателям, торговым фирмам, ритейлерам и др.) сведений о чеках онлайн-касс – API Проверка чеков (точная ссылка на него в конце статьи). Рассказываем, для кого он предназначен, в чём его польза и как использовать новую возможность на практике.

Плюсы нового сервиса

Начнём с того, что Законом от 22.05.2003 № 54-ФЗ о применении ККТ предусмотрена возможность проверки факта записи расчета и подлинности фискального признака на официальном сайте ФНС России.

Считается, что API Проверка чеков ФНС России даст разработчикам программного обеспечения и мобильных приложений больше возможностей для развития услуг в отношении потребителей.

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

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

Официальное определение сервиса API Проверка чеков такое: это интерфейс программирования, который позволяет разработчику визуализировать функционал проверки факта записи расчета и подлинности фискального признака в собственном программном продукте.

Апробация завершена

К концу 2018 года сервис API Проверка чека nalog ru апробирован в экспериментальном режиме.

ФНС России выдвигает определённые условия использования нового информационного сервиса, а также технические требования.

  • название и ИНН юрлица/ИП;
  • IP-адреса, с которых будут запросы на проверку факта записи расчета и подлинности фискального признака;
  • контактный телефон;
  • адрес электронной почты.

Затем нужно на бумаге по адресу экспедиции центрального аппарата ФНС России (Москва, ул. Неглинная, д. 23) подать заявку непосредственно на подключение к сервису «API Проверка чеков».

В данной статье хотелось бы рассказать про API для получения чеков, которое нам не предоставила всеми любимая ФНС.

Когда только появились QR-коды на чеках я подумал «Вау, как круто! Ты сканируешь код и видишь если не всю инфу по чеку, то ссылку на него». И какого же было мое разочарование, когда просканировав такой код я увидел что-то вроде

Но расстраиваться я не стал и подумал, что ФНС позаботилась о нас и предоставила API для получения такой информации. Погуглив некоторое время я понял, что ФНС нам предоставила только мобильное приложение для проверки чека и просмотра той информации, что поступила к ним от магазина.

Но! Между магазином и налоговой имеется ещё одно звено — ОФД — те, кто обрабатывают информацию по чекам, полученную от магазинов, и отправляют в налоговую. Вот они то и предоставляют API для получения нужной нам информации. Не все. И не всегда бесплатно.

Спустя какое-то время, я случайно наткнулся на приложение (не от ФНС), которое по QR-коду с чека получает информацию по чеку. Не будут же они «пробегать» по всем ОФД и собирать оттуда информацию — подумал я. Снова отправился в гугл и наткнулся на такой ответ.

Казалось, после этого ответа можно заканчивать импровизированное расследование, но у меня оставались ещё вопросы:


Все параметры обязательные.

Если результат успешен, то пользователь создается, СМС с паролем отправляется на указанный номер, а в ответ возвращается 204 No content.

Если не указать номер телефона и/или пароль, то не вернется ничего.


Если номер телефона найден, то возвращается 204 No Content и на телефон приходит СМС с новым паролем.

  • Номер ФН (Фискальный Номер) — 16-значный номер. Например 8710000100518392
  • Номер ФД (Фискальный документ) — до 10 знаков. Например 54812
  • Номер ФПД (Фискальный Признак Документа, также известный как ФП) — до 10 знаков. Например 3522207165
  • Вид кассового чека. В чеке помечается как n=1 (приход) и n=2 (возврат прихода)
  • Дата — дата с чека. Формат может отличаться. Я пробовал переворачивать дату (т.е. 17-05-2018), ставить вместо Т пробел, удалять секунды
  • Сумма — сумма с чека в копейках
  • Номер ФН (Фискальный Номер) — 16-значный номер. Например 8710000100518392
  • Номер ФД (Фискальный документ) — до 10 знаков. Например 54812
  • Номер ФПД (Фискальный Признак Документа, также известный как ФП) — до 10 знаков. Например 3522207165

Если не указать номер телефона и/или пароль, то ничего не вернется.

Если чек не найден, то возвращается 406 Not Acceptable. Также чек может быть не найден, если он был получен достаточно давно. ФНС не хранит информацию по чекам за все время. На момент написания этой статьи ФНС хранила детальную информацию порядка 2-3 месяцев.

Если всё хорошо, то вернется 200 ОК и содержимое в формате json примерно такого вида:

  • все суммы указаны в копейках
  • данные кассира в разных магазинах имеют разные форматы (в одном случае может вернуться «Фамилия Имя», в другом «Фамилия И. должность»
  • порядок элементов может меняться
  • разные магазины используют разные наборы параметров и, если какой-то параметр возвращается в чеке от одного магазина, то не факт, что этот параметр будет в чеке от другого магазина
  • формат адреса магазина может различаться

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

По всем вопросам или замечаниям прошу в комментарии.

UPD После небольшой проверки выяснилось, что ФНС не хранит детальную информацию по всем чекам. По крайней мере у меня 22.05.2018 не удалось получить полный чек от декабря 2017, января и февраля 2018, при том, что у ОФД эта информация имеется и мобильное приложение ФНС сообщает, что чек корректен. За март 2018 чек получить уже удалось.

UPD Как заметили пользователи IvanG и neoman36, n=1 это «Вид кассового чека». 1 — значит «приход», 2 — «Возврат прихода». Это же число надо вставлять при проверке существования чека.

UPD Как заметил пользователь Echo77, начиная с декабря 2018 года API стал возвращать код ответа 451 «Illegal public API usage», поэтому теперь прежде чем запрашивать чек, необходимо делать запрос на проверку существования чека.

UPD По замечанию пользователя Actie, в ответ на этот вопрос на тостере, в конце 2018 года ФНС выпустила официальный API «Проверка чека». «Доступ к API дают если написать заявление, заверить электронной подписью, рассказать зачем и как будешь использовать.» (с)

Получить токен физическому лицу, насколько понимаю, невозможно. Только юр. лицо или ИП. Также при написании заявления необходимо явно указать с каких IP адресов будешь запрашивать информацию по чекам.
Этот же пользователь (организация(?)) — Actie реализовали gem для Ruby. Но опять же замечу, что использовать его без токена не получится. Ссылка на репозиторий.
В этом же репозитории указано, что при большом количестве проверок API, описанный в данной статье, работает не стабильно. Лично я не проверял.

UPD Как заметил один из пользователей — после большого количества запросов появляется ошибка блокировки аккаунта. На 25.03.2020 лимит составляет около 25 запросов в сутки. Раньше такого лимита вроде бы не было.

Update: к сожалению, информация в данном посте устарела. Рекомендуем изучить наш новый пост.

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


Чек из гипермаркета «Лента», QR-код, который нас интересует, обведен

Что это значит для нас, аналитиков данных? Что мы можем лучше узнать себя, свои потребности и получить интересные данные о собственных покупках.

Попробуем в рамках серии постов собрать небольшой прототип приложения, которое позволит строить динамику своих покупок. Итак, начнем с того, что в каждом чеке есть QR-code, если его распознать, то мы получим следующую строку:

t=20190320T2303&s=5803.00&fn=9251440300007971&i=141637&fp=4087570038&n=1

В данной строке содержатся:

t — timestamp, время, когда вы осуществили покупку
s — сумма чека
fn — кодовый номер fss, потребуется далее в запросе к API
i — номер чека, он нам потребуется далее в запросе к API
fp — параметр fiscalsign, потребуется далее в запросе к API

В рамках решения первого шага нашей задачи мы будем парсить данные чека и собирать их в pandas dataframe, используя модули Python.

Мы воспользуемся API, который отдает данные по чеку с сайта налоговой.

В начале получим аутентификационные данные:

В результате выполнения POST-запроса мы получим пароль в виде SMS на указанный мобильный телефон. Далее, мы будем использовать его в переменной pwd

Теперь распарсим нашу строку со значениями из QR-кода:

Будем использовать полученные переменные для извлечения данных.
В посте на Хабре довольно подробно изучены статусы ошибок при формировании запроса к API, не буду повторять эту информацию.

В начале необходимо проверить, что по данному чеку есть данные, формируем GET-запрос.

В запросе необходимо указать headers, хотя бы пустые. В моем случае GET-запрос возвращает ошибку 406, из чего я понимаю, что такой чек находится (почему GET-запрос возвращает 406 для меня загадка, буду рад подсказкам в комментариях). Если не указать сумму или дату, то GET-запрос вернет ошибку 400 — bad request.

Переходим к самому интересному, получаем данные чека:

Должны получить код 200 (успешное выполнение GET-запроса), а в переменной products — все, что относится к нашему чеку.

Чтобы работать с этими данными воспользуемся pandas и преобразуем все в dataframe.

Теперь мы имеем рабочий pandas.dataframe с чеками, визуально это выглядит так:


Можно построить гистограмму покупок или посмотреть на все в виде «ящика с усами»:



В завершение элементарно получим описательные статистики в текстовом виде командой .describe():


Данные удобно записать в .csv-файл, чтобы в следующий раз дополнить статистику:


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

Для начала я расскажу вам, как считывать и декодировать штрих-коды, а также находить их на изображении. Потом вы узнаете, как сгенерировать и прочитать QR-коды в Python с помощью библиотек qrcode и OpenCV .

Для выполнения описанных здесь упражнений необходимо установить нужные нам зависимости:

Как сделать считыватель штрих-кода на Python

Как только зависимости будут установлены, откройте новый файл Python и импортируйте то, что нужно для считывателя:

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

Я разбил всю функциональность по функциям и первая функция, которую мы обсудим, следующая:

Функция decode() принимает изображение в виде массива numpy и использует pyzbar.decode() , который отвечает за декодирование всех штрих-кодов из одного изображения и возвращает кучу полезной информации о каждом обнаруженном штрих-коде.

Затем мы перебираем все обнаруженные штрих-коды, рисуем прямоугольник вокруг штрих-кода и печатаем тип и данные штрих-кода. Чтобы прояснить ситуацию, вот как каждый объект выглядел, если мы его распечатали:

Таким образом, функция pyzbar.decode() возвращает данные, содержащие штрих-код, тип штрих-кода, а также точки расположения в виде прямоугольника и многоугольника.

Это подводит нас к следующей функции, которую мы использовали, draw_barcode() :

Эта функция берет декодированный объект, который мы только что видели, и само изображение, она рисует прямоугольник вокруг штрих-кода с помощью функции cv2.rectangle() , или вы можете раскомментировать другую версию функции; рисование многоугольника с помощью функции cv2.line() , выбор за вами. Я предпочел прямоугольную версию.

Ну наконец то, он возвращает изображение, содержащее нарисованные штрих-коды. Теперь давайте воспользуемся этими функциями для наших примеров изображений:

В моем текущем каталоге у меня есть barcode1.jpg, barcode2.jpg и barcode3.jpg, которые являются примерами изображений отсканированного штрих-кода. Я использовал glob , чтобы получить все эти изображения в виде списка и перебирать их.

В каждый файл мы загружаем его с помощью функции cv2.imread() и используем ранее обсуждавшуюся функцию decode() для декодирования штрих-кодов, а затем показываем фактическое изображение.

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

Когда я запускаю сценарий, он показывает каждое изображение и печатает его тип и данные, нажмите любую клавишу, и вы получите следующее изображение, вот мой результат:


Вот последнее показанное изображение:

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

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

Для получения более подробной информации приглашаю вас почитать документацию pyzbar .

Как сгенерировать и прочитать QR-код в Python

Пришло время узнать, как сгенерировать и прочитать QR-коды в Python с помощью библиотек qrcode и OpenCV .

Создание QR-кода

Во-первых, давайте начнем с создания QR-кодов, это в целом очень просто при наличии библиотеки qrcode :

Вы также можете использовать эту библиотеку для полного управления генерацией QR-кода с помощью класса qrcode.QRCode() , в котором вы можете создать экземпляр и указать размер, цвет заливки, задний цвет и исправление ошибок, например:

Параметр box_size управляет количеством пикселей в каждом прямоугольнике QR-кода, тогда как граница определяет, сколько прямоугольников должно иметь толщину.


Затем мы добавляем данные с помощью метода qr.add_data() , компилируем их в массив с помощью метода qr.make() , а затем создаем фактическое изображение с помощью метода qr.make_image() . Мы указали белый цвет как fill_color и черный как back_color , что является полной противоположностью QR-коду по умолчанию, посмотрите:

Читаем QR-код

Есть много инструментов, считывающих QR-код. Однако для этого мы будем использовать библиотеку OpenCV , поскольку она популярна и легко интегрируется с веб-камерой или любым видео.

Хорошо, откройте новый файл Python и следуйте за мной, давайте прочитаем только что сгенерированное изображение:

К счастью для нас, OpenCV уже имеет встроенный детектор QR-кода:

У нас есть изображение и детектор, давайте обнаружим и расшифруем эти данные:

Функция detectAndDecode() принимает изображение в качестве входных данных и декодирует его, чтобы вернуть кортеж из 3 значений: данные, декодированные из QR-кода, выходной массив вершин найденного четырехугольника QR-кода и выходное изображение, содержащее исправленный и преобразованный в двоичную форму QR-код.

Здесь нам просто нужны данные и bbox , который поможет нарисовать четырехугольник на изображении, и данные будут выведены на консоль!

Давай сделаем это:

Функция cv2.line() рисует отрезок линии, соединяющий две точки, мы получаем эти точки из массива bbox , который ранее был декодирован с помощью detectAndDecode() . Мы указали синий цвет ((255, 0, 0) , поскольку OpenCV использует цвета BGR) и толщину 2 .

Наконец, давайте покажем изображение и выйдем при нажатии клавиши:

После запуска распечатываются декодированные данные:

И показано следующее изображение:

Как видите, синие линии нарисованы точно в границах QR-кода. Отлично, мы закончили с этим скриптом, попробуйте запустить его с другими данными и посмотрите свои результаты!

Обратите внимание, что это идеально подходит для QR-кодов, а не для штрих-кодов.

Если вы хотите обнаруживать и декодировать QR-коды в реальном времени с помощью веб-камеры (и я уверен, что вы это делаете), вот код для этого:

Отлично, я закончил и теперь вы можете интегрировать его в свои собственные приложения!

Читайте также: