Оплачиваем покупку через СБП без мобильных приложений

Предыстория

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

07aca997e01f99abf06eba7c0fd42ced.png

По-началу это заставило меня вернуться обратно к 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-запросов, а достаточно уменьшить размер окна.

209ebb7e36094f76703a7353657550cb.png


После чего менюшки приобрели «мобильный» вид, а в списке платежей появилась QR опция. Она же виднелась в правом верхнем углу окна.

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

b4448945c53b41509199d283cee9d0e0.png

Далее выбираем 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:

48c6827573fc1fbc3d5323c5d888b624.png

Проверка камеры в веб-браузере

Теперь проводим тест веб-браузера Firefoх на одном из заведомо рабочих тестовых сайтов для web-камер:
https://www.onlinemictest.com/webcam-test/
https://webcamtests.com/

Если веб-браузер видит камеру, то запросит разрешение на ее использование:

08826faed2d01c16ed35a97d81a263c8.png

Результат будет следующий:

9e1ec1c91c2449122bbab134ee4e5cd2.png

Камера и ВТБ-online

Теперь делаем тоже самое с QR опцией в ВТБ-online.

По моему опыту страничка не сразу обнаруживает камеру, требуется reload.

6cc9a881e0ac396d050706610c66cb3b.png

Также сам процесс «съемки» не мгновенный — иногда требуется несколько секунд.

2f3b2c0ed2404d4d7a0b62b2ec1747e2.png

После чего появляются данные платежа и выбор счета.
Ура, товар оплачен!

P.S. уже при написании этой статьи обнаружил другую статью с подробностями поддержки QR в ВТБ online, где подтверждается, что поддержку desktop версии отложили ради скорости разработки.

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

© Habrahabr.ru