Если вы хотите открыть собственный интернет-магазин, достаточно пойти в Google, и вы получите несколько десятков готовых технических решений. При этом не имеет значения, что вы планируете продавать. Рынок предлагает массу продуктов для создания интернет-магазина или маркетплейса «под ключ».

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

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

Я хотел создать экосистему и объединить на своей площадке уже существующие на рынке продукты: 3PL-логистику, банкинг и систему ЭДО. При этом я видел маркетплейс максимально простым, то есть не перегруженным лишним функционалом. Вот основные задачи, которые я ставил перед разработчиками:

  • Обеспечить полностью электронный документооборот между участниками площадки на ее территории.

Я преследовал цель — уйти от человеческого фактора и «менеджеров на телефоне».

  • В любой момент времени показывать покупателю реальный остаток товара на складе поставщика. 

Продавать больше, чем есть в запасах, — не допустимо, поэтому мне было важно настроить синхронизацию каталога товаров на площадке с данными в 1С поставщиков. 

  • Автоматически рассчитывать срок доставки по каждой единице товара.

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

  • Обеспечить разделение платежа, поступающего от покупателя, на комиссию площадки и выручку поставщиков.

При этом не передавать оплату поставщику до отгрузки товара покупателю.

Все взаимодействия с участниками маркетплейса на старте — банком, поставщиками, транспортной компанией и компанией ЭДО — мы осуществляли по API. Для нас все, что передается по API, истина. Но без трудностей здесь не обошлось. С чем столкнулась команда при решении этих задач, и как в итоге их решила, расскажу далее.

Электронный документооборот

Для организации ЭДО на площадке мы рассматривали несколько подрядчиков. Но оказалось, что все они берут не маленькие деньги, за то, что люди принимают и отправляют документы на их ресурсе. При этом ответственности никакой не несут. Поэтому мы организовали электронный документооборот на площадке своими силами, т.е. сделали так, чтобы пользователи не покидали личный кабинет для того, чтобы оформить и подписать ЭЦП какой-либо документ.

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

Синхронизация каталогов маркетплейса с 1С

1С — это программа, которая написана на своем языке и «не дружит» не с одним другим кодом. Чтобы получить какие-то данные, нужно или написать код на ее языке или воспользоваться готовым решением от 1С. Для поставщиков маркетплейса информации из 1С о цене и количестве товара достаточно. Все, что нужно знать покупателю вне маркетплейса о товаре поставщика, расскажет его менеджер. Но для покупателя маркетплейса этих данных для принятия решения о покупке мало, а наличие исчерпывающей информации о товаре и отсутствие «менеджеров» — одни из главных преимуществ такой площадки.

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

Мы нашли универсальное решение, которое работает на каждой версии 1С. Мы выгружаем только цены и остатки по существующему стандартному методу 1С. А дополнительную информацию о товаре в каталог маркетплейса поставщики могут добавить вручную с помощью нашего интерфейса.

Расчет сроков доставки

Для расчета срока доставки конкретного товара с конкретного склада нам нужно было знать координаты этого склада. Но транспортная компания по части складов передавала по API не полные координаты: только долготу или только широту, — что делало расчет сроков доставки невозможным. В итоге, наш разработчик сам «починил» код логистической компании, чтобы мы смогли  получать координаты полностью.

У транспортной компании была проблема с записью городов в системе. У них была своя система кодификации городов и складов в них. Поскольку они не использовали КЛАДР-код, мы не могли синхронизировать адреса складов транспортной компании с городами на сайте маркетплейса. Наш программист взял весь список городов, которые использует транспортная компания и с нуля переписал под нашу площадку на нашей стороне.

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

Транспортная компания рассчитывала срок доставки сформированного заказа (полной корзины с конкретного склада). Это значит, что в рамках API рассматривала задачу так: человек что-то хочет перевезти из пункта А в пункт Б и ему нужно посчитать, сколько это будет стоить. Нам этот алгоритм расчета не подходил, потому что на маркетплейсе в одном заказе покупателя может быть товар от разных поставщиков, который находится на разных складах в разных частях страны. Я хотел, чтобы покупатель видел, сколько времени будет ехать единица заказанного им товара из конкретного склада, т.е. рассчитывать срок доставки в фоновом режиме по каждой позиции в корзине. Это значит, что единовременно нам нужно просчитывать тысячи значений сроков. Это десятки тысяч запросов в секунду. Для транспортной компании такой вариант был неприемлем, поэтому ее программисты разработали для нас решение, в рамках которого от нас поступал один запрос с массивом данных, которые нужно было просчитать.

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

Дробление платежа

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

Всего программу для маркетплейса мы писали 2,5 года. За это время было привлечено несколько  программистов. При этом каждый из них работал только с каким-то определенным этапом проекта, с частью кода или версткой. Код целиком видел видел только один человек.

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

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


  1. steff
    22.09.2021 19:54
    +6

    Наверное, результат ваших трудов где-то можно посмотреть?


    1. AlekseyACE83 Автор
      23.09.2021 14:28
      +1

      Результаты наших трудов уже почти готовы к публикации, пока это был небольшой крик души, хотелось поделится с аудиторий сутью проделанной работы. Сейчас сайт доступен по предварительному макету https://marketplace.ace.su/ , буду рад любой конструктивной критике по коду или дизайну.


  1. hardtop
    23.09.2021 11:21
    +1

    У маркетплейса простой и интуитивно понятный интерфейс. 

    Сам себя не похвалишь - никто не похвалит ;-)

    Как показывает практика, с интерфейсом можно вообще не угадать. Всё равно после запуска системы будете переделывать\дорабатывать.

    Список требований понятен. Но хоть бы скриншоты с тестовыми компаниями\товарами приложили для наглядности.


    1. AlekseyACE83 Автор
      23.09.2021 14:34
      +1

      Про интерфейс согласен, мы уже морально настраиваемся на то, что все придется еще 10 раз переделать. Тестовый макет можно посмотреть тут: https://marketplace.ace.su/ будем признательны за любую конструктивную критику).


      1. hardtop
        24.09.2021 09:43

        ...что все придется еще 10 раз переделать.

        Да, работы ещё предстоит. По порядку:

        Дизайн

        • Лого со странной разрядкой между A и С.

        • Дизайнера, видимо, вообще не было. Теория близости нарушается повсеместно (Первый баннер, выпадающее меню и пр., отступ по горизонтали мелкий по сравнению с отступом по вертикали). Кнопка "Подробнее" странного цвета (я понимаю, что это light от жёлтого, но выглядит бледно - словно disabled).

        • 2 шрифта в шапке (город + регистрация) - montserrat + din. В формах ещё и системный шрифт. Зачем так?

        • Закреплять верхний бар, который отжирает место по вертикали при массе 16:9 экранах - это mauvais ton.

        Верстка

        • Иконки то мелкие png (отвратительно смотрятся на экранах с высоким ppi) то svg.

        • При регистрации ошибки не переведены на русский. Pop-up по дизайну вообще не соотносится с самой формой. Да и зачем отправлять форму, если не заполнен e-mail - ведь стоит же атрибут required.

        • Верстка текста странная - вот тут нужен ul li список, а не буллеты из ворда. И зачем для каждого <p> повторять class="spoiler__text_page_block__text_block"?

        <p class="spoiler__text_page_block__text_block">
        • расходные материалы для строительства и фасадных работ<br>
        • комплектующие для опалубки стен и перекрытий<br>
        • a:hover{font-weight: bold} - плохая идея. Будет прыгать вёрстка в некоторых случаях

        • Цена либо руб. либо ₽. И &nbsp; тоже был бы не лишним.

        Странные урлы. Есть https://marketplace.ace.su/catalog/zvezdochka-20-5 а есть https://marketplace.ace.su/catalog?ctg=2 - почему get параметр? Это ж не поиск и не фильтр

        Даже для тестового варианта мало категорий товаров. Есть подозрение, что chain-фильтр разбухнет до неприличия.

        Почему, кстати, не взяли какой-нить bootstrap? Да, было б не уникально, но гораздо более прилично.

        Удачи!


  1. Antig
    24.09.2021 06:46

    А можно узнать подробнее про дробление платежа и Сбер? Это же какую они предлагают комиссию, чтобы маркетплэйсу это было выгодно, при том что он сам сидит на комиссии. И где про это удовольствие можно почитать? А ещё если возврат, то Сбер в обратную делает?


  1. mgis
    24.09.2021 09:09

    Сам в самом начале пути написания своего маркетплейса. Правда, до конца не определился, а нужно ли оно. Гложут сомнения, а смогу ли, а нужно ли? Но это все ладно, вы подскажите как у вас по стеку?
    Вижу что на backend у вас django, больше никаких технических подробностей не вижу.

    Я для себя стартанул со следующего стека Django/NuxtJs/Postgresql/.
    Пока вроде все устраивает, да вот не нравится система роутинга nuxt, для того, чтоб сделать верхнеуровневые url категорий там уже приходится неплохо так изощряться.
    В общем есть сомнения у меня с фронтом. Да и django думаю заменить на FastApi.


    1. AlekseyACE83 Автор
      24.09.2021 15:33

      Всё зависит от ваших задач, Django это достаточно крупный фреймворк, имеющий такие бонусы как ОРМ, Шаблонизатор и перспективно развивающееся ассинхронное направление. FastApi используется только для построения RestApi модели сайта. Если вы делаете полноценный маркетплейс, то в Django есть django-rest-framework. Что касается NuxtJS, это очень спорное решение на мой взгляд. Когда мы говорим о маркетплейсе, мы говорим о чем-то, что будет существовать больше 5 лет, а у всех этих новомодных фронтовых фреймворках нет гарантий, что разработчики столько продержатся. Я бы использовал React. Так же можно подключить redis-server и настроить кэширование некоторых страниц, чтобы не было лишней нагрузки для шаблонизатора и базы данных.


      1. mgis
        25.09.2021 12:00

        Ну то, что Nuxt уйдет в небытие я точно не переживаю. Но все же его выбор у меня вызывает некоторые вопросы. Впервую очередь СЕО интересует. Разве у React есть SSR из коробки?