Предыстория
Понадобилось мне как-то оплатить один товар в интернет магазине. Среди способов оплаты были Webmoney, qiwi wallet, СБП, а также ворох каких-то малопонятных мне криптовалют. Оплату банковской картой по каким-то причинам продавец не предлагал.
Недолго думая я выбрал СБП, ожидая, что оплата будет в итоге по реквизитам карты, либо через какую-то интеграцию с online банком. Однако вопреки моим ожиданиям была сгенерирована страничка с QR кодом и предложением сфотографировать его телефоном из банковского приложения.
Телефоны у меня хоть и с камерой, но исключительно на j2me, и с банковскими приложениями не совместимы, что поначалу поставило меня в тупик.
Закинув картинку с QR кодом на первый попавшийся сайт, распознающий QR, я получил строку-URL, содержащую по всей видимости данные по транзакции. Пример валидного URL (с вымышленными данными) приведен ниже:
https://qr.nspk.ru/FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF?type=00&bank=000000000000&sum=0&cur=RUB&crc=0000
По переходу по ссылке, открывалась та же страница на nspk.ru. Круг замкнулся :-(
По-началу это заставило меня вернуться обратно к Qiwi и WM опциям.
Попытка оплатить через Qiwi wallet дала ошибку неясного характера. Быстрый поиск указал на то, что вероятной причиной может быть отсутствие повышенного статуса qiwi кошелька при оплате заграничному продавцу. Повышать статус кошелька я не планировал, поэтому вариант оплаты через Qiwi отпал.
Что ж, есть webmoney, к которому у меня было 2 старых кошелька. По крайней мере одним из них я успешно пользовался несколько лет назад. Однако на оба WMID мне было сказано, что их нет. Странно, ну не беда, их не жалко, создадим новый.
Но не тут-то было - при создании меня внезапно попросили сделать фото (selfie), да и вообще сказали, что самое правильное фото нужно делать из мобильного приложения, без возможности выбора.
Ну-ну, на selfie я был явно не согласен, а на мобильное приложение тем более.
Вариант с криптовалютами я отложил на последок, если все остальное не сработает. И вернулся к СБП.
СБП через ВТБ-online
Поисковые системы выдавали в основном бесполезную информацию: многочисленные статьи рассказывали, как хорош СБП, как он позволит фотографировать QR на кассе или сайте и моментально оплачивать в мобильном приложении. Всякие там интеграционные API для продавца и т.п. и т.д.
При этом совершенно непонятно, что делать покупателю за компьютером или ноутбуком, имеющему только доступ в online-банк, и почему в таком сценарии не обойтись без камеры.
Одна из найденных мною статей упоминала, что в ВТБ-online появилась опция оплаты по QR при доступе туда через web-браузер мобильного устройства. Звучало многообещающе, однако в статье утверждалось, что картинку опять же нужно будет получить с камеры, а вот выбор готовой картинки с файловой системы прикрутят когда-нибудь потом :-(
Зайдя в online-банк ВТБ с desktop браузера я ожидаемо не обнаружил опции оплаты QR. К счастью убедить online-банк в том, что клиентское устройство мобильное, оказалось тривиально: не нужно было подделывать заголовки HTTP-запросов, а достаточно уменьшить размер окна.
После чего менюшки приобрели "мобильный" вид, а в списке платежей появилась QR опция. Она же виднелась в правом верхнем углу окна.
Отмечу что размер окна аналогичным образом влияет на сбер онлайн, с той разницей, что QR опции там я не нашел. Видимо у Сбер она только в мобильном приложении.
Далее выбираем QR опцию в ВТБ онлайн и получаем серый квадрат, с крутилкой, отображающей, по-видимому, процесс получения картинки с камеры.
Которой у меня нет.
Т.о. образом задача свелась в тому, как подсунуть веб-браузеру картину вместо камеры.
Камера из картинки
Полагаю, что эмуляцию камеры можно сделать средствами веб-браузера, и вроде бы для google chrome есть расширения, либо специальные опции командной строки.
Но я решил, что быстрее и проще эмулировать камеру на уровне ОС - наверняка ведь должен быть такой софт. Первое, что мне попалось - это v4l2loopback модуль для Linux kernel, поэтому далее речь пойдет о нем.
Не буду давать конкретных инструкций по сборке модулей, т.к. они специфичны для каждого дистрибутива Linux.
В Gentoo это package "media-video/v4l2loopback", который требует опции CONFIG_VIDEO_DEV в конфиге ядра. В моем случае после включения
"Device Drivers | Multimedia support | Cameras/video grabbers support" через menuconfig
добавились следующие опции в конфиге ядра:
CONFIG_I2C_MUX
CONFIG_MEDIA_SUPPORT
СONFIG_MEDIA_CAMERA_SUPPORT
CONFIG_VIDEO_DEV
CONFIG_VIDEO_V4L2
CONFIG_MEDIA_SUBDRV_AUTOSELECT
CONFIG_VIDEO_IR_I2C
После сборки и установки модуля подгружаем его (параметры взяты отсюда https://www.linuxfordevices.com/tutorials/linux/fake-webcam-streams):
modprobe v4l2loopback card_label="emul_cam" exclusive_caps=1
При подгрузке модуля появляется новое устройство /dev/video0
В моей конфигурации веб-браузер работал в LXC-контейнере. Поэтому нужно было убедиться в том, что есть разрешения на работу с /dev/video0 из контейнера, проверить наличие соответствующих файлов устройств в контейнере и права (unix rights) на них.
Далее для работы с эмулятором камеры использовался ffmpeg, при этом следует убедится, что ffmpeg собран c поддержкой v4l.
Сохраняем картинку с QR кодом из веб-браузера на файловую систему (qr_code.png в примере ниже).
Запускаем ffmpeg для формирования видеопотока из картинки и записи его в dummy камеру:
ffmpeg -loop 1 -i qr_code.png -vcodec rawvideo -pix_fmt yuv420p
-threads 0 -vf scale=320:320 -f v4l2 /dev/video0
Проверяем работу через ffplay или через ffmpeg, если он собран без ffplay:
ffplay -i /dev/video0
ffmpeg -i /dev/video0 -f opengl "emul_cam"
Должно появится окно с QR:
Проверка камеры в веб-браузере
Теперь проводим тест веб-браузера Firefoх на одном из заведомо рабочих тестовых сайтов для web-камер:
https://www.onlinemictest.com/webcam-test/
https://webcamtests.com/
Если веб-браузер видит камеру, то запросит разрешение на ее использование:
Результат будет следующий:
Камера и ВТБ-online
Теперь делаем тоже самое с QR опцией в ВТБ-online.
По моему опыту страничка не сразу обнаруживает камеру, требуется reload.
Также сам процесс "съемки" не мгновенный - иногда требуется несколько секунд.
После чего появляются данные платежа и выбор счета.
Ура, товар оплачен!
P.S. уже при написании этой статьи обнаружил другую статью с подробностями поддержки QR в ВТБ online, где подтверждается, что поддержку desktop версии отложили ради скорости разработки.
Надеюсь, что когда поддержка появится, будет предусмотрен штатный способ подгрузить картинку из файла, либо URL-строки.
Комментарии (44)
unwrecker
14.12.2022 17:38Казалось бы очевидная вещь, что браузер и банк-клиент могут быть на одном устройстве, или что банк-клиент может быть в браузере... Но не продумали... Чем думали, спрашивается?
Предложенная методика - это перебор, конечно. Через POST-запрос нельзя код передать?
saege5b
14.12.2022 21:45Целевой клиент банков имеет смарт с безлимитным интернетом.
Тиньков веб версию вообще выхолащивать стал, приоритет за мобильной.
И не только банков, ежурнал в школе подразумевает смарт с инетом с первого класса, потому, что учителям уже лень озвучивать вслух домашку.unwrecker
14.12.2022 22:05+5Целевой клиент банка имеет деньги. Под остальное банк должен подстроитьтся сам.
xSVPx
15.12.2022 16:42+2Целевой клиент банка не имеет мозга.
Он свободно устанавливает приложение на тот же телефон, на который получает коды подтверждения.
Он спокойно сливает всю свою телефонную книгу со всеми заметками итп какому-нибудь приложению сбера.
Итд итп.
И да, разумеется, такой клиент банку выгоднее.
Archivar Автор
17.12.2022 05:10Он свободно устанавливает приложение на тот же телефон, на который получает коды подтверждения.
А если у таких клиентов это единственное устройство? Что в этом случае использовать как доп. фактор - TOTP, карту одноразовых кодов, биометрию?
> Он спокойно сливает всю свою телефонную книгу со всеми заметками итп
> какому-нибудь приложению сбера.
сбер использует эти данные как-то не по назначению?
Archivar Автор
14.12.2022 22:37А есть какой-то готовый POST запрос?
Во-первых разбор протокол взаимодействия онлайнбанка с веб-сервером может занять достаточно много времени, а во-вторых для этого все равно придется эмулировать камеру, чтобы получить пример успешного запроса.
s-a-u-r-o-n
14.12.2022 20:41Телефоны у меня хоть и с камерой, но исключительно на j2me, и с банковскими приложениями не совместимы, что поначалу поставило меня в тупик.
Можно написать приложение, которое будет использовать камеру через MMAPI.
Archivar Автор
14.12.2022 22:59Можно. Но это пригодилось бы только в случае, если бы я вдруг решил портировать банковское приложение на j2me :-)
Хотя вот есть энтузиасты, которые сделали сбер-онлайн под symbian https://vk.com/wall-168202266_10117
s-a-u-r-o-n
15.12.2022 00:41Не смотрел это приложение, но другие приложения этого автора (клиенты Telegram и Vkontakte) работают не очень безопасным образом. Авторы подняли прокси с более простым (и незащищённым!) протоколом, который открывает безопасное соединение до настоящего сервера. Если и их сбер-онлайн сделан по тому же принципу, пользоваться им небезопасно.
Archivar Автор
15.12.2022 02:08Да, я тоже заметил, что у него proxy упоминается. Но пока не смотрел, зачем это нужно. Возможно в этих симбианах старая версия SSL (но почему нельзя тогда стороннюю реализацию нужной версии TLS поставлять вместе с приложением).
Но как минимум из наличия такого рода приложений можно сделать вывод, что это во-первых технически реализуемо, во-вторых кому-то нужно.
s-a-u-r-o-n
15.12.2022 09:11+1Во-первых, симбиан больше не обновляется, а корневые сертификаты зашиты в ROM.
Во-вторых, ViKa Mobile для J2ME, а там SSL в принципе устаревший (вроде как 2.0 с единственным методом шифрования DES с размером ключа 64 бит), серверы на сегодняшний день такое в принципе не поддерживают.
В J2ME-приложении QIWI использовался сторонний SSL от bouncycastle. Но он весит даже в обфусцированном виде столько, что не на каждом телефоне S40 приложение запустится.
martin_wanderer
14.12.2022 21:06А почему для тех же целей не воспользоваться эмулятором Андроида с мобильным приложением в нем? Там и камеру дают, и возможность сканирования QR у самых разных банков, а не только у избранных
vvzvlad
14.12.2022 21:16+5Ну что вы, гигабайт эмулятора это не юникс-вей. Как и современный смартфон.
Archivar Автор
14.12.2022 22:44Запуск банковского приложения на эмуляторе - это тоже вариант решения. Но у меня вообще нет опыта работы с эмуляторами Android, поэтому непонятно было, сколько это времени может занять.
Эмулятор может использовать картинку как источник изображения для камеры?
barkot88
15.12.2022 01:26+1Запуск банковского приложения на эмуляторе может привести к моментальной блокировке личного кабинета онлайн, а для разблокировки прийдётся лично явиться на челобитную с паспортом в ближайшее отделение... по крайне мере в самом "популярном, и любимом" банке дела обстоят именно так.
Archivar Автор
15.12.2022 04:06Ну и ну 8-|
Это касается только эмуляторов в составе SDK? Или всяких Anbox, Android x86, genymotion.com тоже?
martin_wanderer
15.12.2022 19:26Полезная информация. Но, наверное, если ставить в эмулятор не само банковское приложение, а упомянутый тут ниже СБПэй, такой проблемы возникнуть не должно...
Archivar Автор
16.12.2022 10:31Для оплаты нужен нужен банк и счет. Т.е. SBPay должен как-то взаимодествовать с online банком для оплаты в т.ч. аутентифицировать пользователя. В общем не то, чтобы сильно отличается от банковского приложения.
martin_wanderer
15.12.2022 18:55Да, эмулятор может использовать файл, как источник изображения для камеры. Ровно таким образом я как раз QR-код на вход и подавал. А по времени да, может получиться неоднозначно: там все тривиально, когда знаешь "какую кнопку нажимать". А не будучи мобильным разработчиком я поперву довольно долго Android Studio настраивал.
vikarti
16.12.2022 11:46Одна из возможных причин — запуск мобильного клиента ВТБ на эмуляторе — к походу в банк по разблокировке УНК.
Diver69
14.12.2022 22:27+1У меня в мобильном приложении МКБ банка есть оплата по QR и можно подсовывать файл из галереи.
Markscheider
15.12.2022 01:51Телефон на j2me, линукс на ПК... не поверю, что у такого зубра, как вы, не нашлось в "заветном ящике" (tm) веб-камеры с usb. :)
Archivar Автор
15.12.2022 02:32Да, с аппаратной веб-камерой было бы слегка попроще.
Но веб-камеры у меня нет. На работе одно время валялась, но и та куда-то пропала, за отсутствием необходимости.
mmMike
15.12.2022 05:15Надеюсь, что когда поддержка появится, будет предусмотрен штатный способ подгрузить картинку из файла, либо URL-строки.
Стандарты СБП для разработки предлагают использовать deep link. Т.е. при работе на одном устройстве - переход по ссылке. А ссылку (https://qr.nspk.ru) обрабатывает уже не браузер, а то приложение, которое умеет с ней работать. Банковское ДБО или СБПай
Кроме банковского приложения, оплату можно выполнять в приложении приложение СБПай. Банки обязаны поддерживать технологию СБПай как альтернативу своему ДБО приложению.
Увы. Никто не будет ради 3-4 гиков с нестандартными конфигурациями и железками создавать и поддерживать отдельную ветку ПО. Это никогда не окупится. Ориентируются всегда на массовые варианты.
Archivar Автор
15.12.2022 06:45+1Так online банк и есть банковское ДБО, т.е. должен уметь работать со ссылкой.
Конфигурация desktop/laptop как раз вполне стандартная, а вот требовать от такого покупателя что-то там фотографировать и ставить на смартфон, это перебор на мой взгляд.
mmMike
15.12.2022 07:34+1У СБП C2B есть два основных сценария:
Оплата путем сканирования QRC в приложении ДБО банка или в приложении СБПай.
-
Переход по deep link в приложение ДБО банка или в приложении СБПай.
Собственно и все.
Так online банк и есть банковское ДБО, т.е. должен уметь работать со ссылкой.
Нет такого требования в стандарте СБП (ручное копирование ссылки). Поэтому делать/не делать определяет банк в своей браузерной реализации ДБО.
Archivar Автор
17.12.2022 03:20Похоже, что тут проблема даже не техническая, а скорее маркетинговая.
Есть две разные услуги: перевод по ID (C2C) и оплата по QR (C2B). Первая отлично работает через online банк, вторая - не очень. Но обе называются СБП (так на сайте продавца).
Отсюда путаница.
А вот в online банке оно обозначено именно как оплата по QR.
Hlad
15.12.2022 16:30А телефон с J2ME - трушный олдскульный? А то современные "звонилки" по начинке от дешёвых смартфонов не отличаются, просто подавляющее большинство функционала у них не торчит наружу.
Archivar Автор
15.12.2022 22:03https://www.gsmarena.com/sony_ericsson_t700-2481.php
А то современные "звонилки" по начинке от дешёвых смартфонов не отличаются, просто подавляющее большинство функционала у них не торчит наружу.
Не пользовался такими. Это хорошо или плохо?
Hlad
16.12.2022 07:45Скажем так, использование реально древнего телефона я понимаю. Использование же современной "звонилки" имеет смысл только для людей, которые физически не могут освоить смартфон (по причине старости, например). Не зря такие "звонилки" называют "бабушкофонами"
Archivar Автор
16.12.2022 10:30В первую очередь меня не устраивают размеры устройств, представленных на рынке.
Есть ли что-то в аналогичных габаритах (104 x 48 x 10 mm плюс-минус 10 mm) и функционалом по приложениям (установка/разработка) не хуже, чем телефон по ссылке?
vikarti
16.12.2022 11:51Большая автономность при вменяемых размерах (нет, есть Oukitel'ы — но все равно живет меньше + ими убить можно). И принципиальная НЕвозможность установки софта. Для получалки SMS-кодов это важно.
Ну правда на Philips Xenium E590 умудрилсь извратится конечно, аппарат ж этого десятилетия даже.
16 Gb макс размер карты памяти (причем больше видит но не работает)
Micro+Mini SIM слоты (а хоть два Micro никак? в Mini поди воткни даже если новая симка получена).
Мало бортовой памяти и при этом нет смски на карте памяти смотреть.
Заявленный в описании и НЕ работающий T9
Есть браузер который смог открыть главую гугла но нет хоть какого то способа синхронизировать контакты кроме как по одному через Bluetooth.
…
…
...Archivar Автор
17.12.2022 03:03И принципиальная НЕвозможность установки софта. Для получалки SMS-кодов это важно.
что-то мне в голову приходит USB-модем.
furtaev
Похоже на описание процесса мастурбации в гидрокостюме со связанными сзади руками.
evoq
Тоже не понял зачем автор столько времени потратил на решение, которое может пару раз кому - либо за все время нужно будет.
VitGo
зато целая статья на хабре - без смысла, но с долгим пространным объяснение бесполезных действий... и плюс в карму :-)
Archivar Автор
Зачем всё это было нужно, написано в начале статьи. Если бы для интересующего меня товара были доступны и сработали другие способы оплаты (тот же qiwi), то использовал бы их. И тогда бы этой статьи не было :-)
Urub
интересная у тебя строка поиска )
Zed-nsk
Типа , заниматься сексом стоя в гамаке на лыжах)))
vikarti
Но ведь зато как интересно!