Часть реальной переписки в треде к сообщению о нашей первой успешной бесконтактной заправке
Часть реальной переписки в треде к сообщению о нашей первой успешной бесконтактной заправке

Машина кружит по заправочной станции на окраине Питера. Подъезжает к колонке, доливает пару литров, отъезжает в парковочный карман, стоит минуту — и всё повторяется снова.

Разомлевший на жаре (на улице июньские 34 градуса!) заправщик у соседней колонки лениво смотрит на происходящее. Кажется, его не удивляет, что два человека в салоне с ноутбуками постоянно что-то кричат третьему — и тот как будто делает всё по команде. Есть ещё один, четвёртый — он бегает и снимает это на телефон.

Но после третьего круга не выдерживает оператор на кассе. «Двенадцатая колонка, оплачивать будете?» — доносится из динамика.

Наше приложение — первый в истории 2ГИС продукт, в котором платёжный пайплайн полностью реализован нами самими внутри. Ещё за пару месяцев до этого у нас не было почти ничего, кроме идеи и команды. А полчаса назад казалось, что всё, что может пойти не так, пойдёт не так на этом первом полевом тесте.

«А какой смысл код с багами писать?»

За час до этого закрываем ноутбуки и стартуем из офиса в центре города. Скрипт отрабатывает нормально: даёт выбрать заправочную станцию из списка, затем выбрать колонку — узнать, какое топливо на ней, и инициировать пролив бензина либо по литражу, либо по сумме. Но сработает ли всё на реальной колонке — пока не знает никто. Это нам и предстоит проверить.

Выезжаем из офиса в поля. Слева — Лёша Федощенко, технический руководитель проекта. 
Скрин работы скрипта с его ноута вы видели выше
Выезжаем из офиса в поля. Слева — Лёша Федощенко, технический руководитель проекта. Скрин работы скрипта с его ноута вы видели выше

У нас только голый бэкенд, Postman вместо фронта, немного отваги — и час до заправочной станции где-то под Пулково.

То, как мы решили писать свой собственный бэкенд — отдельная история. Вообще российский рынок АЗС напоминает мем про 14 стандартов.

Мем про 14 стандартов
https://xkcd.ru/927/
https://xkcd.ru/927/

Сегодня на любой заправке есть автоматика, благодаря которой оператор с кассы и отдаёт дистанционную команду на подачу топлива на определённую колонку и пистолет. Но самих АСУ для заправок около четырёх десятков. Причем в рамках одной сети может использоваться несколько разных систем, включая самописные.

Интегрироваться с каждой — не вариант, поэтому со временем появились несколько компаний, которые дают универсальный доступ к разным АСУ. Такие компании-интеграторы мы называем топливными операторами (ТО) — собственно, их API используются в приложениях для бесконтактной заправки автомобиля.

Топливных операторов тоже несколько. А у нас большая аудитория карт и навигатора по всей стране, так что есть вероятность, что под капотом продукта в итоге будем стучаться к разным ТО. Желание быстро расширять решение плюс возможность иметь полный лог действий на своей стороне в итоге перевесили. И хотя свой бэкэнд — ещё одна точка отказа, мы верим в наши прямые руки ;)

Поэтому весной 2021-го мы начали глубже погружаться в тему АЗС, общаться с топливными операторами и узнавать, как, невовремя сняв пистолет, можно накрыть весь процесс заправки. Сформировав видение архитектуры, к маю написали первые методы на бэке и iOS. Затем добавили слой бизнес-логики, а в июне стали продумывать UI. После интеграции оплат мы должны были протестировать всё на бою — это одна из особенностей системы SberPay, которую мы втащили наравне с Apple Pay.

По пути захватываем из дома автора бэкенда. Ден фанат удалёнки и до карантина успел объехать десяток стран, работая дистанционно
По пути захватываем из дома автора бэкенда. Ден фанат удалёнки и до карантина успел объехать десяток стран, работая дистанционно

Ден — скалист. И спокоен как глыба. Это спокойствие нам скоро пригодится. Через несколько минут после того, как все собрались в салоне, машина начинает странно тарахтеть, а потом — глохнуть на светофорах. После окажется, что полетела коробка передач и мы вообще чудом проехали следующие 20 км. Раз мы застреваем прямо на перекрёстке. При этом за неделю до этого тачка выдержала путешествие из Питера в Новосибирск и обратно, а тут — забарахлила по полуденным пробкам.

Чтобы как-то отвлечься, начинаем шутить — мол, как испытания начнёшь, так они и пройдут. Приходим к тому, что есть вероятность потратить час на путь до места, а не заведётся уже не тачка, а бэкенд. На что Ден невозмутимо отвечает: «Так ну а зачем мне писать код с ошибками?».

На подъезде к заправке все же начинаем высматривать колонку посвободнее — чтобы не мешать обычным автовладельцам
На подъезде к заправке все же начинаем высматривать колонку посвободнее — чтобы не мешать обычным автовладельцам

Мы специально приехали днём, чтобы поменьше стоять в очередях. С одной стороны, чтобы быстрее проверить все сценарии, с другой — немного опасались негатива от обычных людей: вдруг что-то пойдёт не так и мы будем слишком долго занимать колонку. Тем более никто на месте не предупреждён, что команда разработки будет тестировать новый продукт — мы прибыли инкогнито.

Ура, заработало!

Встаём в парковочный карман, не глуша мотор. Осматриваемся. С колонки номер 12 отъезжает автомобиль. Не знаем, как так получилось, но в следующие десять минут к ней не подъезжал никто, хотя к другим точкам были очереди. Кажется, нам начинает везти.

Наша колонка в кадр почти не попала — крайняя справа, между линией автомобилей и закусочной
Наша колонка в кадр почти не попала — крайняя справа, между линией автомобилей и закусочной

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

Сам список заправок, колонок и марок топлива кэшируется на нашей стороне: мы заводим отдельные cron-джобы под каждого провайдера, парсим данные, затем матчим с карточками АЗС в 2ГИС — и обновляем раз в сутки. А вот за ценами ходим раз в 5 минут плюс дополнительно опрашиваем конкретную станцию перед заправкой (цена на бензин в сети может поменяться в любой момент).

Для старта задаём пролив 95-го на 200 рублей. Деньги удерживаются на счету, а списываются уже после заправки. Сценарий отрабатывает чётко.

Это лучше один раз увидеть.

Ден не шутил про код без багов. Мы проверяем еще несколько базовых сценариев: отсечка заправки по литражу, выбор другого вида топлива, отмену заказа. Даже пытаемся «отнять» чужую колонку — смотрим, что можем зафиксировать снятый пистолет, когда авто подъезжает к одному из свободных мест.

Вот так один из тестов выглядит в консоли
Вот так один из тестов выглядит в консоли
А так — в реальном мире
А так — в реальном мире

Ещё мы очень радуемся тому, насколько быстрее проходит бесконтактная заправка по сравнению с классическим сценарием «зайти на кассу и постоять в очереди». Через минуту в эту очередь нам всё-таки придётся встать.

Чек, которого не должно было быть

В тот момент оплата в приложении была реализована своеобразно. Поскольку интерфейса еще не было, Лёша получал сгенерированную ссылку на оплату через SberPay в Postman’е, затем пересылал её себе через Slack на телефон и оплачивал через СберБанк Онлайн. Деньги списывались с тестовой карты.

Вот так это выглядело на практике. В Слаке якорем профиль часто отмечают те, кто работает из нового питерского центра разработки
Вот так это выглядело на практике. В Слаке якорем профиль часто отмечают те, кто работает из нового питерского центра разработки

Тем не менее, все работало отлично, пока мы не решили на радостях потестить пограничные сценарии. В одном из случаев колонка должна была сообщить, что занята, но не сделала этого. Таким образом, бензин мы пролили, а вот оплатить через приложение не смогли. Пришлось сходить ногами на кассу. Но это разовый случай — ответ на стороне API, которое мы дёргали, быстро пофиксили.

Твоё лицо, когда отдал 150 рублей за одну из тестовых заправок, но проблема не на стороне твоего кода
Твоё лицо, когда отдал 150 рублей за одну из тестовых заправок, но проблема не на стороне твоего кода

Что было дальше

Через день мы добавили Apple Pay. А ещё через пару дней команда iOS-разработки выкатила официальную тестовую сборку приложения. Настала очередь нашей тестировщицы Даши войти в эту историю. Она живёт рядом с новосибирским Академгородком, регулярно пользуется машиной и, как и мы, фанатеет от идеи с бесконтактной заправкой.

За неделю до этого или как шокировать заправщика

Конечно, Даша появилась в проекте раньше, ещё в середине июня. Изучила всю документацию, бриф, ТЗ, параллельно пофиксив в них неминуемые разногласия. И получила из этого набор тест-кейсов на конечного пользователя.

Jenkins позволяет нам собирать и совсем тестовые, не сторовские версии приложения. Так что Даша тоже начинала с версии, где была оплата только Сбером, но первые пару заправок сделала из дома, сидя за компьютером.

Вот её лайфхак: узнала у друзей, кто сейчас в пути → дала им адреса ближайших заправок от уже подключенных провайдеров → мы оплатили топливо и параллельно протестировали пару моментов. Говорят, заправщики на АЗС были удивлены — человек и в кассу не шёл, и вроде как приложением не пользовался. Мистика...

QA-лайфхак №1: тебе не нужно ехать на заправку, если у тебя есть Jenkins и друзья-автовладельцы
QA-лайфхак №1: тебе не нужно ехать на заправку, если у тебя есть Jenkins и друзья-автовладельцы

А вот после добавления оплаты через Apple мы получили официальную тестовую сборку через Test Flight, и Даша поехала тестировать сценарии на практике. Каждый приезд также вызывал интерес у местных заправщиков: какая-то девушка методично приезжает, заливает по 2 литра и при этом командует, когда вставлять и доставать пистолет. При этом пользуется неизвестным науке продуктом.

«На финальном выезде вокруг меня был чуть ли не консилиум. Сразу три заправщика собрались, интересовались нашим приложением», — рассказала она.

За 12 попыток Даша проверила все кейсы: от ограничения по сумме и объёму (минимальный заказ 2 литра) до ситуации, когда мобильный интернет работает плохо и ответ об оплате задерживается.

QA-лайфхак №2: тебе не нужно искать место с плохим интернетом, если ты можешь испортить сигнал на самом устройстве
QA-лайфхак №2: тебе не нужно искать место с плохим интернетом, если ты можешь испортить сигнал на самом устройстве

Чтобы не искать дебри с плохой связью, Даша вызвала настройки девелопера в Xcode и выбрала «очень плохой интернет». А параллельно собрала первые баги: например, в тёмной теме не очень читалась область с чеком, не все экраны были одинаково заметны, а ещё местами не хватало подписей.

Всё это мы пофиксили. И весь август и сентябрь тестировали бесконтактные заправки среди сотрудников. Ждите фичу на бою ;)


P. S. Заправки — первый самостоятельный продукт центра разработки 2ГИС в Питере. Подробнее о том, что ещё мы делаем, можно узнать 20–21 сентября на Saint Highload, а в остальное время — на этом сайте.

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


  1. evnuh
    20.09.2021 15:44
    +5

    Всё круто, кроме того, что 90% людей заправляются на заправках, в которых у них есть бонусные карты (а они есть у всех больших сетей). И вот пока ни яндекс, ни в вашей статье, не нашёл упоминания как привязать бонусную карту разных провайдеров при бесконтактной заправке. А это ведь около 5% скидки с каждой заправки.


    1. sisaenkov
      20.09.2021 16:01
      +4

      У яндекса, кстати, можно привязать штук 8 разных карт АЗС. Лукойла только нет, ибо он захотел развивать свое приложение, вместо интеграции.


      1. tmin10
        20.09.2021 21:11

        В котором даже нельзя заправить полный бак :(


        1. sisaenkov
          20.09.2021 21:20
          +1

          В Яндексе уже полгода как доступна заправка полного бака. Где-то даже статья на хабре была на эту тему.


          1. avlag
            21.09.2021 10:14

            Если пользуешься Я.заправками. А в Я.Навигаторе это не реализовано.


            1. NickSin
              21.09.2021 18:11

              Янддекс навигатор интерфейс под айфоны с челками до сих пор адаптировать не может, о чем можно говорить?


          1. tmin10
            27.09.2021 16:57

            Речь про лукойл, не уточнил. У яндекса нравилось всё, кроме ноунейм заправок (всякие АЗС №123) около меня, когда пользовался.


        1. joydark
          22.09.2021 15:39
          +1

          Можно, просто оплачиваешь по литражу примерно больше бака, если будет меньше, деньги вернутся.
          Другой вопрос, что мы попали на кейс, когда обычно на Роснефть сначала платишь, потом заправляешься. А попалась заправка у Роснефти у которой можно заправить полный бак, а оплатить после. И так как транзакции в банке не сразу появляются на счету, то пришлось ждать 15 минут и наконец-то найти в приложении у яндекса как оплатить такой кейс. Линия техподдержки не помогла от слова совсем. У них был ответ, ждите 15 минут, если оплата не пройдёт, тогда будем разбираться.


        1. Zy2ba
          24.09.2021 14:17

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

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


          1. tmin10
            27.09.2021 16:56

            Хм, да, интересный костыль. Мне ещё там не понравилось, что надо сначала вставить пистолет, а потом выбирать топливо и оплачивать, тогда как в яндексе можно подъехать, сделать всё в авто и потом только вылезать. А мобильные телефоны вроде вообще на заправке использовать нельзя, а тут офф приложение подталкивает стоять у заправки со смартфоном…


    1. spasibo_kep Автор
      20.09.2021 16:07
      +2

      Программы лояльности - это не столько технический момент, сколько вопрос договоренностей с сетями АЗС. В планах это есть и мы в 2ГИС движемся в этом направлении. Потерпите, все будет.


  1. uburame
    20.09.2021 16:05

    Что ж, вам проще: можно учесть все возникшие проблемы при запуске оплаты заправок у Яндекса. Я так понимаю, что основной проблемой была неоплата (случайная или преднамеренная) после заправки. Поэтому на некоторых заправках появилась предоплата, а на других бдящий заправщик. При этом с возвратом переплаты у меня пару раз возникали проблемы.


    1. spasibo_kep Автор
      20.09.2021 16:30

      Мы со старта действуем так: предполагаемая сумма перед заправкой сначала просто замораживается на карте, а по факту заправки списывается релаьная сумма, но не более той, что предполагали.


      1. crea7or
        20.09.2021 17:10

        потому я на шелл перестал ездить и заезжаю только на bp - где этого идиотизма нет.


      1. uburame
        20.09.2021 17:38
        +1

        Тут возникает 2 неприятных нюанса:

        1. Если я хочу заправить полный бак, но в машине нет функции подсчёта сколько там осталось пустого места, то приходится эту предполагаемую сумму прикидывать с большим запасом.

        2. Будет наверняка как у всех: предполагаемая сумма списывается, потом возвращается, и списывается реальная сумма. Сложно проконтролировать из-за спама в уведомлениях от банк-клиента, и в случае сбоя в минусах остаётся клиент. Или придумали как сделать это иначе?


        1. RrrredHead
          21.09.2021 09:51
          +4

          Мы реализовали схему с холдирование денежных средств на карте, подробнее можно тут почитать - https://bankkarty.com/holdirovanie/. Получается, что на старте пролива мы “бронируем” (но не списываем) максимальную сумму, которая может потребоваться, а по итогам пролива уже делаем списание из этой забронированной суммы на нужное нам значение. Остаток тут же становится доступен для использования. Количество уведомлений в этом случае зависит от настроек непосредственно в банке, от нас же приходит только один финальный чек на ту сумму которую пролили в бак.


          1. Xo4y_3uMy
            21.09.2021 19:44

            А что если на карте меньше денег чем сумма холдирования, но достаточно для минимальной заправки? Будет отмена или предусмотрено несколько итераций?

            Кстати, вопрос по переходу товар-деньги.
            Кто "поставщик" топлива для конечного клиента? Вы или заправка?
            Как решаются проблемы некачественного топлива, неисправности АЗС и прочие чисто технические сбои?

            О! Еще вопрос - топливо, это акцизный товар. Сейчас на это закрывают глаза, но вроде все акцизные товары должны продаваться с бумажным фискальным чеком? Или это только в случае акта оплаты на месте?


            1. spasibo_kep Автор
              22.09.2021 14:42

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


              1. Xo4y_3uMy
                22.09.2021 16:30
                +1

                Спасибо Кэп!
                (не удержался)


        1. spasibo_kep Автор
          21.09.2021 09:53

          Лёша, лид проекта, ответил выше)


  1. kisaa
    21.09.2021 07:50

    Ставил на пробу приложение от Яндекса, и ещё какое-то, но в своем регионе (Хабаровский край) не нашел ни одной поддерживаемой заправки. Что не так у топливных операторов с Дальним Востоком? Как с этим у вашего приложения?


  1. GeneD88
    21.09.2021 08:23

    Use case: Блокировать 0 на карте. Заливать газолин пока нажимаешь на кнопку, далее снимать за залитое.

    Так (только физически) работают заправки, к примеру, в США. Я даже не представляю всех технических ограничений почему такую фичу нельзя внедрить...

    зы: у вас будет QA на этом проекте? Т.к. вы уйму кейсов не принимаете в расчет (исходя из текста статьи)


    1. spasibo_kep Автор
      21.09.2021 08:25

      У нас есть QA на этом проекте и они классные) Все, что можно проверить без выезда, проветяют на тестовом стенде, все. что нельзя - садятся в тачку и едут на заправку. Вот в конце статьи как раз об этом чуть упомянули.


    1. fougasse
      21.09.2021 09:23

      Или как в Европе - блокировать ~130 евро(дума, что цифра +/- 100 литров бензина). Потом списывать реальную сумму и разблокировать.

      Колонка больше не нальёт, проблемы с уезжающими без оплаты остаются при заправке внутри, но решается камерами.


  1. Floyd54
    21.09.2021 08:25

    Как человек, который знает, как работает бесконтакт внутри АЗС, могу сказать, что большая половина API кривая, как турецкая сабля. В Яндексе очень много ошибок, очень много ложных отказов. Именно со стороны бэкэнда. Мониторинг отказов от Яндекса тоже полная дичь


  1. saf9288
    21.09.2021 09:55

    не совсем понял как АСУ АЗС обменивается информацией с приложением?


    1. spasibo_kep Автор
      21.09.2021 10:00
      +3

      Привет, спасибо за вопрос. Сами АСУ обмениваются данными с топливными операторами (ТО) - это своего рода агрегаторы сетей заправок, а мы обращаемся к ТО. В виде схемы выглядит вот так:



  1. p4s5w0r9
    21.09.2021 10:00
    +1

    Без бонусных карт все это не имеет смысла.


    1. spasibo_kep Автор
      21.09.2021 10:01
      +1

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


  1. Satyricon
    21.09.2021 10:53

    Как человек, занимающийся АЗС у ГПН, сочувствую вам. Столько еще шишек насобираете.


    1. spasibo_kep Автор
      21.09.2021 11:48

      Привет, а если не сложно, расскажите туту про шишки - это ж самое интересное


      1. Floyd54
        21.09.2021 14:00

        Как занимающийся АСУ в РН скажу то же самое. Головной боли очень много хапнете


        1. spasibo_kep Автор
          21.09.2021 14:17

          Предупрежден - вооружен) Но если поделитесь подробностями, будем благодарны.


          1. Floyd54
            21.09.2021 15:23

            К сожалению связан подпиской, не имею права. Вам лучше обратиться к разработчику АСУ


  1. k102
    21.09.2021 11:16

    А как же зайти на заправку и спонтанно купить ненужную фигню или вонючую омывайку? =)


    1. spasibo_kep Автор
      21.09.2021 11:50

      У нас в приложении есть решение на этот счет, называется Товары ;) Вот как раз на питерском Хайлоаде об этом вчера рассказали.


      1. k102
        21.09.2021 13:59

        Да не, это ж не то же самое что взять что-то стоя в очереди, потому что... ну оно там лежит)

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


  1. achekalin
    21.09.2021 15:21

    Еще бы сделали цену на топливо через безконтакт ниже, чем при "заправке ногами", и вообще бы было радость и благолепие!

    Я.Карты такое предложили - но у низ скидка, если не ошибаюсь, на первые 100 литров...

    Ну и да, возненавидят вас все эти АЗС, которые по 200 руб за стаканчик дрянного кофе дерут и не краснеют. Ставлю, что они без чека о оплате через кассу не станут пускать в туалет (как это уже делают некоторые кафе). Смайлик - надеюсь, окажусь не прав!


  1. Xo4y_3uMy
    22.09.2021 16:40

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

    Жаль мало где в РФ используется


  1. tendium
    23.09.2021 00:44

    Если не секрет, почему исчезли карты Праги?


    1. spasibo_kep Автор
      23.09.2021 20:53

      Привет, маркетинг говорит, что там "пересмотрели потенциал территории".

      Но карта Праги не исчезла совсем. Она по-пержнему доступна в веб-версс на десктопе и в мобильных браузерах — https://2gis.cz/praha. Большая часть аудитории этого проекта использовала именно онлайн-версию.


      1. tendium
        23.09.2021 22:39

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