Предыстория

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

картинка взята с https://www.reddit.com/r/mildlyinfuriating/comments/vwukwd/webmoney_asks_for_your_selfie_to_register/
картинка взята с https://www.reddit.com/r/mildlyinfuriating/comments/vwukwd/webmoney_asks_for_your_selfie_to_register/


Ну-ну, на 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-строки.