Предыстория

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

Комментарии (44)


  1. furtaev
    14.12.2022 17:19
    +54

    Похоже на описание процесса мастурбации в гидрокостюме со связанными сзади руками.


    1. evoq
      14.12.2022 22:28

      Тоже не понял зачем автор столько времени потратил на решение, которое может пару раз кому - либо за все время нужно будет.


      1. VitGo
        15.12.2022 05:11

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


      1. Archivar Автор
        15.12.2022 22:11

        Зачем всё это было нужно, написано в начале статьи. Если бы для интересующего меня товара были доступны и сработали другие способы оплаты (тот же qiwi), то использовал бы их. И тогда бы этой статьи не было :-)


    1. Urub
      15.12.2022 09:28

      интересная у тебя строка поиска )


    1. Zed-nsk
      15.12.2022 17:37

      Типа , заниматься сексом стоя в гамаке на лыжах)))


    1. vikarti
      16.12.2022 11:44

      Но ведь зато как интересно!


  1. unwrecker
    14.12.2022 17:38

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

    Предложенная методика - это перебор, конечно. Через POST-запрос нельзя код передать?


    1. saege5b
      14.12.2022 21:45

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


      1. unwrecker
        14.12.2022 22:05
        +5

        Целевой клиент банка имеет деньги. Под остальное банк должен подстроитьтся сам.


      1. xSVPx
        15.12.2022 16:42
        +2

        Целевой клиент банка не имеет мозга.

        Он свободно устанавливает приложение на тот же телефон, на который получает коды подтверждения.

        Он спокойно сливает всю свою телефонную книгу со всеми заметками итп какому-нибудь приложению сбера.

        Итд итп.

        И да, разумеется, такой клиент банку выгоднее.


        1. Archivar Автор
          17.12.2022 05:10

          Он свободно устанавливает приложение на тот же телефон, на который получает коды подтверждения.

          А если у таких клиентов это единственное устройство? Что в этом случае использовать как доп. фактор - TOTP, карту одноразовых кодов, биометрию?

          > Он спокойно сливает всю свою телефонную книгу со всеми заметками итп
          > какому-нибудь приложению сбера.

          сбер использует эти данные как-то не по назначению?


    1. Archivar Автор
      14.12.2022 22:37

      А есть какой-то готовый POST запрос?

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


  1. olegtsss
    14.12.2022 20:29

    Было бы интересно посмотреть разбор отправляемых HTTP запросов.


  1. s-a-u-r-o-n
    14.12.2022 20:41

    Телефоны у меня хоть и с камерой, но исключительно на j2me, и с банковскими приложениями не совместимы, что поначалу поставило меня в тупик.

    Можно написать приложение, которое будет использовать камеру через MMAPI.


    1. Archivar Автор
      14.12.2022 22:59

      Можно. Но это пригодилось бы только в случае, если бы я вдруг решил портировать банковское приложение на j2me :-)

      Хотя вот есть энтузиасты, которые сделали сбер-онлайн под symbian https://vk.com/wall-168202266_10117


      1. s-a-u-r-o-n
        15.12.2022 00:41

        Не смотрел это приложение, но другие приложения этого автора (клиенты Telegram и Vkontakte) работают не очень безопасным образом. Авторы подняли прокси с более простым (и незащищённым!) протоколом, который открывает безопасное соединение до настоящего сервера. Если и их сбер-онлайн сделан по тому же принципу, пользоваться им небезопасно.


        1. Archivar Автор
          15.12.2022 02:08

          Да, я тоже заметил, что у него proxy упоминается. Но пока не смотрел, зачем это нужно. Возможно в этих симбианах старая версия SSL (но почему нельзя тогда стороннюю реализацию нужной версии TLS поставлять вместе с приложением).

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


          1. 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 приложение запустится.


  1. martin_wanderer
    14.12.2022 21:06

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


    1. vvzvlad
      14.12.2022 21:16
      +5

      Ну что вы, гигабайт эмулятора это не юникс-вей. Как и современный смартфон.


    1. Archivar Автор
      14.12.2022 22:44

      Запуск банковского приложения на эмуляторе - это тоже вариант решения. Но у меня вообще нет опыта работы с эмуляторами Android, поэтому непонятно было, сколько это времени может занять.

      Эмулятор может использовать картинку как источник изображения для камеры?


      1. barkot88
        15.12.2022 01:26
        +1

        Запуск банковского приложения на эмуляторе может привести к моментальной блокировке личного кабинета онлайн, а для разблокировки прийдётся лично явиться на челобитную с паспортом в ближайшее отделение... по крайне мере в самом "популярном, и любимом" банке дела обстоят именно так.


        1. Archivar Автор
          15.12.2022 04:06

          Ну и ну 8-|

          Это касается только эмуляторов в составе SDK? Или всяких Anbox, Android x86, genymotion.com тоже?


        1. martin_wanderer
          15.12.2022 19:26

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


          1. Archivar Автор
            16.12.2022 10:31

            Для оплаты нужен нужен банк и счет. Т.е. SBPay должен как-то взаимодествовать с online банком для оплаты в т.ч. аутентифицировать пользователя. В общем не то, чтобы сильно отличается от банковского приложения.


      1. martin_wanderer
        15.12.2022 18:55

        Да, эмулятор может использовать файл, как источник изображения для камеры. Ровно таким образом я как раз QR-код на вход и подавал. А по времени да, может получиться неоднозначно: там все тривиально, когда знаешь "какую кнопку нажимать". А не будучи мобильным разработчиком я поперву довольно долго Android Studio настраивал.


    1. vikarti
      16.12.2022 11:46

      Одна из возможных причин — запуск мобильного клиента ВТБ на эмуляторе — к походу в банк по разблокировке УНК.


  1. Diver69
    14.12.2022 22:27
    +1

    У меня в мобильном приложении МКБ банка есть оплата по QR и можно подсовывать файл из галереи.


    1. Archivar Автор
      14.12.2022 23:33

      А в онлайн банке МКБ есть возможность оплаты по QR коду?


      1. Diver69
        15.12.2022 10:52

        Блин, вот насколько у них удобное мобильное приложение, на столько же кривой онлайн банк, никогда им не пользовался, первый раз залез)
        Нет там оплаты по QR(
        Задал вопрос в саппорт, жду.


  1. Markscheider
    15.12.2022 01:51

    Телефон на j2me, линукс на ПК... не поверю, что у такого зубра, как вы, не нашлось в "заветном ящике" (tm) веб-камеры с usb. :)


    1. Archivar Автор
      15.12.2022 02:32

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


  1. mmMike
    15.12.2022 05:15

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

    Стандарты СБП для разработки предлагают использовать deep link. Т.е. при работе на одном устройстве - переход по ссылке. А ссылку (https://qr.nspk.ru) обрабатывает уже не браузер, а то приложение, которое умеет с ней работать. Банковское ДБО или СБПай

    Кроме банковского приложения, оплату можно выполнять в приложении приложение СБПай. Банки обязаны поддерживать технологию СБПай как альтернативу своему ДБО приложению.

    Увы. Никто не будет ради 3-4 гиков с нестандартными конфигурациями и железками создавать и поддерживать отдельную ветку ПО. Это никогда не окупится. Ориентируются всегда на массовые варианты.


    1. Archivar Автор
      15.12.2022 06:45
      +1

      Так online банк и есть банковское ДБО, т.е. должен уметь работать со ссылкой.

      Конфигурация desktop/laptop как раз вполне стандартная, а вот требовать от такого покупателя что-то там фотографировать и ставить на смартфон, это перебор на мой взгляд.


      1. mmMike
        15.12.2022 07:34
        +1

        У СБП C2B есть два основных сценария:

        1. Оплата путем сканирования QRC в приложении ДБО банка или в приложении СБПай.

        2. Переход по deep link в приложение ДБО банка или в приложении СБПай.

        Собственно и все.

        Так online банк и есть банковское ДБО, т.е. должен уметь работать со ссылкой.

        Нет такого требования в стандарте СБП (ручное копирование ссылки). Поэтому делать/не делать определяет банк в своей браузерной реализации ДБО.


        1. Archivar Автор
          17.12.2022 03:20

          Похоже, что тут проблема даже не техническая, а скорее маркетинговая.
          Есть две разные услуги: перевод по ID (C2C) и оплата по QR (C2B). Первая отлично работает через online банк, вторая - не очень. Но обе называются СБП (так на сайте продавца).
          Отсюда путаница.
          А вот в online банке оно обозначено именно как оплата по QR.


  1. Hlad
    15.12.2022 16:30

    А телефон с J2ME - трушный олдскульный? А то современные "звонилки" по начинке от дешёвых смартфонов не отличаются, просто подавляющее большинство функционала у них не торчит наружу.


    1. Archivar Автор
      15.12.2022 22:03

      А телефон с J2ME - трушный олдскульный?

      https://www.gsmarena.com/sony_ericsson_t700-2481.php

      А то современные "звонилки" по начинке от дешёвых смартфонов не отличаются, просто подавляющее большинство функционала у них не торчит наружу.

      Не пользовался такими. Это хорошо или плохо?


      1. Hlad
        16.12.2022 07:45

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


        1. Archivar Автор
          16.12.2022 10:30

          В первую очередь меня не устраивают размеры устройств, представленных на рынке.
          Есть ли что-то в аналогичных габаритах (104 x 48 x 10 mm плюс-минус 10 mm) и функционалом по приложениям (установка/разработка) не хуже, чем телефон по ссылке?


        1. vikarti
          16.12.2022 11:51

          Большая автономность при вменяемых размерах (нет, есть Oukitel'ы — но все равно живет меньше + ими убить можно). И принципиальная НЕвозможность установки софта. Для получалки SMS-кодов это важно.
          Ну правда на Philips Xenium E590 умудрилсь извратится конечно, аппарат ж этого десятилетия даже.
          16 Gb макс размер карты памяти (причем больше видит но не работает)
          Micro+Mini SIM слоты (а хоть два Micro никак? в Mini поди воткни даже если новая симка получена).
          Мало бортовой памяти и при этом нет смски на карте памяти смотреть.
          Заявленный в описании и НЕ работающий T9
          Есть браузер который смог открыть главую гугла но нет хоть какого то способа синхронизировать контакты кроме как по одному через Bluetooth.


          ...


          1. Archivar Автор
            17.12.2022 03:03

            И принципиальная НЕвозможность установки софта. Для получалки SMS-кодов это важно.

            что-то мне в голову приходит USB-модем.


  1. kilobait3
    16.12.2022 18:56

    Когда скриншоты делаете, закрывайте фоновые окна. Хорошо там не ключи.