← Статьи
Инструменты

Интеграция калькулятора с сайтом через API: как настроить обмен каталогом, ценами и заявками

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

Интеграция калькулятора с сайтом через API: как настроить обмен каталогом, ценами и заявками

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

Дальше разберём, из чего состоит этот обмен, где чаще всего рвётся и какие решения принимают до разработки, а не после первого инцидента.

Что именно связывает API между калькулятором и сайтом?

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

У каждого потока свой ритм. Каталог меняется редко и пачками — например, при обновлении прайса. Расчёт происходит постоянно и требует быстрого ответа. Заявка — редкое, но самое чувствительное событие: потерянные данные здесь означают потерянную сделку, а не косметический дефект интерфейса.

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

Почему калькулятор не должен хранить свою копию прайса?

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

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

Вторая проблема копии — стоимость поддержки. Каждое изменение номенклатуры нужно проводить дважды, каждую формулу — синхронизировать в двух местах, а тестировать оба контура. Чем больше продуктовая матрица, тем быстрее такая схема съедает ресурс команды.

Третий эффект — потеря управляемости. Когда цены живут в нескольких местах, никто не может ответить на простой вопрос: какая цена действовала в момент расчёта. Для коммерческого предложения, которое живёт неделю, это критично.

Какие сущности передаются по API?

Состав обмена проще, чем кажется, если разделить данные на три слоя: что продаём, чем эти позиции отличаются и сколько это стоит.

Товар и его идентификатор

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

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

Характеристики и правила

Второй слой — параметры, по которым клиент выбирает: размеры, материалы, мощность, комплектация. Для калькулятора это входные данные формул, для конфигуратора — ещё и основание для проверки совместимости. Как это устроено на стороне продукта, описано в обзоре конфигуратора оборудования.

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

Цена и условия её действия

Третий слой — цена. И здесь главная ошибка — считать цену одним числом. На практике цена — это набор: значение, валюта, база расчёта (с налогом или без), дата начала действия, источник. Число без этих атрибутов невозможно корректно сложить с другими числами, и именно на этом ломаются расчёты итогов.

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

Как устроена синхронизация цен?

Есть три рабочих режима, и выбор между ними — вопрос частоты изменений, а не моды на архитектуру.

Полная выгрузка

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

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

Инкрементальные изменения

Каталог отдаёт только то, что изменилось с прошлого раза. Это дешевле по трафику и быстрее, но требует одного условия: у изменений должен быть признак, по которому их можно отобрать. Без него «инкремент» превращается в полную выгрузку с лишним названием.

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

Событие вместо расписания

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

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

Версия прайса и дата действия

Отдельный вопрос, который всплывает позже всех и стоит дороже всех: что делать с уже выпущенными коммерческими предложениями, когда цена изменилась.

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

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

Как результат расчёта возвращается на сайт и в учётную систему?

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

Идентификатор расчёта нужен для сверки. Когда клиент звонит и говорит «у меня на сайте была другая цена», по нему можно поднять конкретный расчёт и увидеть, какие данные в нём участвовали. Без идентификатора разговор идёт по памяти.

Дальше — способ доставки. Опрос (сайт периодически спрашивает, нет ли новых заявок) проще в отладке, но даёт задержку и лишний трафик. Вебхук (система сама вызывает ваш адрес при событии) быстрее, но требует, чтобы адрес был доступен и умел отвечать на повторы. Частая ошибка — считать вебхук гарантированной доставкой: он не гарантирует ничего, пока на стороне получателя не реализована идемпотентность.

Идемпотентность — это когда повторная обработка одного и того же события не создаёт второй заказ. Достигается она просто: у события есть уникальный ключ, получатель его запоминает. Без этого один сбой сети превращается в дубль заявки, а менеджер — в человека, который вручную ищет совпадения.

Что делать, если API недоступен?

Считать, что API недоступен не будет, — самая распространённая ошибка в таких проектах. Он будет недоступен: на время обновления, из-за сетевого сбоя, из-за исчерпанного лимита. Вопрос не в том, случится ли это, а в том, что увидит клиент.

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

Второе — таймауты и повторные попытки. Запрос, который висит без ответа, хуже ошибки: он держит страницу и не даёт показать хоть что-то. Короткий таймаут и несколько повторов с нарастающей паузой закрывают большинство кратковременных сбоев.

Третье — предохранитель. Если сервис отвечает ошибками подряд, продолжать долбить его бессмысленно: это только удлиняет восстановление. После серии неудач обмен приостанавливается на короткое время, а затем проверяется пробным запросом.

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

Отдельно продумывают заявку. Если учётная система недоступна, заявка не должна исчезать: она сохраняется локально с признаком «не передана» и уходит повторно. Клиент при этом видит подтверждение, а не ошибку — он свою часть работы выполнил.

Ключи доступа и лимиты: что закладывать сразу?

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

Отдельный ключ на каждую интеграцию. Общий ключ «на всё» удобен ровно до первого инцидента: когда нужно отозвать доступ у одного подрядчика, отзывать приходится у всех.

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

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

Лимиты. Даже честный клиент может случайно устроить нагрузку — например, пересчитывая каталог в цикле после ошибки. Лимит частоты и очередь запросов защищают от такого сценария лучше, чем договорённости.

Журнал обращений. Без логов невозможно ответить на вопрос «почему вчера цена была другой». Логировать стоит не только ошибки, но и факт выдачи данных: кто, что и когда запросил.

Как проверить интеграцию до запуска?

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

Дальше проверяют сценарии сбоя. Отключить API и посмотреть, что видит клиент. Замедлить ответ и посмотреть, не зависает ли страница. Прислать событие дважды и убедиться, что второй заказ не создался. Эти три проверки ловят большинство будущих аварий и занимают меньше времени, чем разбор одной реальной.

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

И последнее: приёмка должна идти по сценариям, а не по факту «страница открывается». Список из десятка реальных клиентских путей — с обновлением цены посередине, с недоступным API, с повторной отправкой — даёт больше, чем неделя ручного тыканья.

С чего начать, если каталог пока в Excel?

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

Дальше — нормализация прайса и перенос данных в каталог. Этот шаг описан в обзоре параметрического каталога и data layer: импорт, единая структура характеристик и цен, выдача данных в интерфейсы по API. Ключевая идея проста — один источник, из которого читают все инструменты, вместо нескольких копий.

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

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

Частые вопросы

Нужен ли API, если каталог небольшой?

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

Кто должен быть источником истины — сайт или каталог?

Каталог. Сайт, калькулятор и кабинет — потребители. Если истиной становится интерфейс, любая правка в нём создаёт расхождение, которое невозможно отследить.

Как часто обновлять цены на сайте?

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

Что показывать клиенту, если цены недоступны?

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

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

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

Как понять, что интеграция работает правильно?

По трём признакам: расчёт совпадает с эталонным, изменение цены доезжает до сайта предсказуемо, а недоступность API не превращается в потерянную заявку или неверную сумму на экране.


← К списку статей