Машина кружит по заправочной станции на окраине Питера. Подъезжает к колонке, доливает пару литров, отъезжает в парковочный карман, стоит минуту — и всё повторяется снова.
Разомлевший на жаре (на улице июньские 34 градуса!) заправщик у соседней колонки лениво смотрит на происходящее. Кажется, его не удивляет, что два человека в салоне с ноутбуками постоянно что-то кричат третьему — и тот как будто делает всё по команде. Есть ещё один, четвёртый — он бегает и снимает это на телефон.
Но после третьего круга не выдерживает оператор на кассе. «Двенадцатая колонка, оплачивать будете?» — доносится из динамика.
Наше приложение — первый в истории 2ГИС продукт, в котором платёжный пайплайн полностью реализован нами самими внутри. Ещё за пару месяцев до этого у нас не было почти ничего, кроме идеи и команды. А полчаса назад казалось, что всё, что может пойти не так, пойдёт не так на этом первом полевом тесте.
«А какой смысл код с багами писать?»
За час до этого закрываем ноутбуки и стартуем из офиса в центре города. Скрипт отрабатывает нормально: даёт выбрать заправочную станцию из списка, затем выбрать колонку — узнать, какое топливо на ней, и инициировать пролив бензина либо по литражу, либо по сумме. Но сработает ли всё на реальной колонке — пока не знает никто. Это нам и предстоит проверить.
У нас только голый бэкенд, Postman вместо фронта, немного отваги — и час до заправочной станции где-то под Пулково.
То, как мы решили писать свой собственный бэкенд — отдельная история. Вообще российский рынок АЗС напоминает мем про 14 стандартов.
Мем про 14 стандартов
Сегодня на любой заправке есть автоматика, благодаря которой оператор с кассы и отдаёт дистанционную команду на подачу топлива на определённую колонку и пистолет. Но самих АСУ для заправок около четырёх десятков. Причем в рамках одной сети может использоваться несколько разных систем, включая самописные.
Интегрироваться с каждой — не вариант, поэтому со временем появились несколько компаний, которые дают универсальный доступ к разным АСУ. Такие компании-интеграторы мы называем топливными операторами (ТО) — собственно, их API используются в приложениях для бесконтактной заправки автомобиля.
Топливных операторов тоже несколько. А у нас большая аудитория карт и навигатора по всей стране, так что есть вероятность, что под капотом продукта в итоге будем стучаться к разным ТО. Желание быстро расширять решение плюс возможность иметь полный лог действий на своей стороне в итоге перевесили. И хотя свой бэкэнд — ещё одна точка отказа, мы верим в наши прямые руки ;)
Поэтому весной 2021-го мы начали глубже погружаться в тему АЗС, общаться с топливными операторами и узнавать, как, невовремя сняв пистолет, можно накрыть весь процесс заправки. Сформировав видение архитектуры, к маю написали первые методы на бэке и iOS. Затем добавили слой бизнес-логики, а в июне стали продумывать UI. После интеграции оплат мы должны были протестировать всё на бою — это одна из особенностей системы SberPay, которую мы втащили наравне с Apple Pay.
Ден — скалист. И спокоен как глыба. Это спокойствие нам скоро пригодится. Через несколько минут после того, как все собрались в салоне, машина начинает странно тарахтеть, а потом — глохнуть на светофорах. После окажется, что полетела коробка передач и мы вообще чудом проехали следующие 20 км. Раз мы застреваем прямо на перекрёстке. При этом за неделю до этого тачка выдержала путешествие из Питера в Новосибирск и обратно, а тут — забарахлила по полуденным пробкам.
Чтобы как-то отвлечься, начинаем шутить — мол, как испытания начнёшь, так они и пройдут. Приходим к тому, что есть вероятность потратить час на путь до места, а не заведётся уже не тачка, а бэкенд. На что Ден невозмутимо отвечает: «Так ну а зачем мне писать код с ошибками?».
Мы специально приехали днём, чтобы поменьше стоять в очередях. С одной стороны, чтобы быстрее проверить все сценарии, с другой — немного опасались негатива от обычных людей: вдруг что-то пойдёт не так и мы будем слишком долго занимать колонку. Тем более никто на месте не предупреждён, что команда разработки будет тестировать новый продукт — мы прибыли инкогнито.
Ура, заработало!
Встаём в парковочный карман, не глуша мотор. Осматриваемся. С колонки номер 12 отъезжает автомобиль. Не знаем, как так получилось, но в следующие десять минут к ней не подъезжал никто, хотя к другим точкам были очереди. Кажется, нам начинает везти.
Подъезжаем и инициируем «сценарий крипта» — так для тестов мы назвали вариант с заправкой на определённую сумму. В этот момент опрашиваем станцию на предмет того, работает ли она, доступна ли колонка, есть ли в ней сейчас нужное топливо и по какой цене. Всю свою внутреннюю логику мы инкапсулируем в рамках одного метода.
Сам список заправок, колонок и марок топлива кэшируется на нашей стороне: мы заводим отдельные cron-джобы под каждого провайдера, парсим данные, затем матчим с карточками АЗС в 2ГИС — и обновляем раз в сутки. А вот за ценами ходим раз в 5 минут плюс дополнительно опрашиваем конкретную станцию перед заправкой (цена на бензин в сети может поменяться в любой момент).
Для старта задаём пролив 95-го на 200 рублей. Деньги удерживаются на счету, а списываются уже после заправки. Сценарий отрабатывает чётко.
Это лучше один раз увидеть.
Ден не шутил про код без багов. Мы проверяем еще несколько базовых сценариев: отсечка заправки по литражу, выбор другого вида топлива, отмену заказа. Даже пытаемся «отнять» чужую колонку — смотрим, что можем зафиксировать снятый пистолет, когда авто подъезжает к одному из свободных мест.
Ещё мы очень радуемся тому, насколько быстрее проходит бесконтактная заправка по сравнению с классическим сценарием «зайти на кассу и постоять в очереди». Через минуту в эту очередь нам всё-таки придётся встать.
Чек, которого не должно было быть
В тот момент оплата в приложении была реализована своеобразно. Поскольку интерфейса еще не было, Лёша получал сгенерированную ссылку на оплату через SberPay в Postman’е, затем пересылал её себе через Slack на телефон и оплачивал через СберБанк Онлайн. Деньги списывались с тестовой карты.
Тем не менее, все работало отлично, пока мы не решили на радостях потестить пограничные сценарии. В одном из случаев колонка должна была сообщить, что занята, но не сделала этого. Таким образом, бензин мы пролили, а вот оплатить через приложение не смогли. Пришлось сходить ногами на кассу. Но это разовый случай — ответ на стороне API, которое мы дёргали, быстро пофиксили.
Что было дальше
Через день мы добавили Apple Pay. А ещё через пару дней команда iOS-разработки выкатила официальную тестовую сборку приложения. Настала очередь нашей тестировщицы Даши войти в эту историю. Она живёт рядом с новосибирским Академгородком, регулярно пользуется машиной и, как и мы, фанатеет от идеи с бесконтактной заправкой.
За неделю до этого или как шокировать заправщика
Конечно, Даша появилась в проекте раньше, ещё в середине июня. Изучила всю документацию, бриф, ТЗ, параллельно пофиксив в них неминуемые разногласия. И получила из этого набор тест-кейсов на конечного пользователя.
Jenkins позволяет нам собирать и совсем тестовые, не сторовские версии приложения. Так что Даша тоже начинала с версии, где была оплата только Сбером, но первые пару заправок сделала из дома, сидя за компьютером.
Вот её лайфхак: узнала у друзей, кто сейчас в пути → дала им адреса ближайших заправок от уже подключенных провайдеров → мы оплатили топливо и параллельно протестировали пару моментов. Говорят, заправщики на АЗС были удивлены — человек и в кассу не шёл, и вроде как приложением не пользовался. Мистика...
А вот после добавления оплаты через Apple мы получили официальную тестовую сборку через Test Flight, и Даша поехала тестировать сценарии на практике. Каждый приезд также вызывал интерес у местных заправщиков: какая-то девушка методично приезжает, заливает по 2 литра и при этом командует, когда вставлять и доставать пистолет. При этом пользуется неизвестным науке продуктом.
«На финальном выезде вокруг меня был чуть ли не консилиум. Сразу три заправщика собрались, интересовались нашим приложением», — рассказала она.
За 12 попыток Даша проверила все кейсы: от ограничения по сумме и объёму (минимальный заказ 2 литра) до ситуации, когда мобильный интернет работает плохо и ответ об оплате задерживается.
Чтобы не искать дебри с плохой связью, Даша вызвала настройки девелопера в Xcode и выбрала «очень плохой интернет». А параллельно собрала первые баги: например, в тёмной теме не очень читалась область с чеком, не все экраны были одинаково заметны, а ещё местами не хватало подписей.
Всё это мы пофиксили. И весь август и сентябрь тестировали бесконтактные заправки среди сотрудников. Ждите фичу на бою ;)
P. S. Заправки — первый самостоятельный продукт центра разработки 2ГИС в Питере. Подробнее о том, что ещё мы делаем, можно узнать 20–21 сентября на Saint Highload, а в остальное время — на этом сайте.