Предыстория
Понадобилось мне как-то оплатить один товар в интернет магазине. Среди способов оплаты были 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-строки.