Разработка · 8 мин чтения

Интеграция API на сайт: порядок работ и типовые сложности

За последние два года у меня прошло около трёх десятков проектов, где заказчик просил не сайт с нуля, а интеграцию API на сайт: подключить приём оплаты, вывести статус доставки СДЭК, забрать данные из CRM или отправить заявку в Telegram-бота. Работа по структуре однотипная, а вот набор сложностей каждый раз свой, и заранее его не видно, пока не откроешь документацию конкретного сервиса. Ниже порядок работ, который использую на практике на проектах разного масштаба, от простого скрипта на Tilda до бэкенда на Laravel, и список проблем, которые вылезают чаще всего.

Что нужно подготовить до подключения стороннего API

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

  • Актуальную документацию API, а не первую ссылку из поиска. У Т‑Банка, например, отдельная документация для интернет-эквайринга и для API приёма платежей, их путают регулярно, а у части CRM вроде amoCRM и Bitrix24 версии REST API отличаются набором методов и форматом токенов.
  • Тестовый контур (sandbox) с отдельными ключами. Без него любая ошибка в коде превращается в реальную транзакцию или реальную отправку клиенту, а откатить списание задним числом получается не всегда.
  • Доступ к личному кабинету сервиса на стороне заказчика. Ключи API, доступ к кабинету СДЭК или Т‑Банка обычно оформлены на юрлицо клиента, и без доступа к логам ошибок в личном кабинете разбираться приходится вслепую по обрывочным сообщениям от сервера.

Отдельно фиксирую в техническом задании, какие данные передаются во внешний сервис и что приходит обратно: для доставки это набор полей адреса, вес и габариты заказа, а для эквайринга сумма, номер заказа и URL для возврата покупателя. На одном из последних проектов интернет-магазина понадобилось связать сразу три сервиса: Т‑Банк для оплаты, СДЭК для расчёта доставки и Bitrix24 для передачи заказов менеджерам, и без ТЗ с перечнем полей на входе и выходе для каждого сервиса разработка растянулась бы в разы дольше. Если документации нет вообще или она устарела, закладываю на исследование отдельное время, об этом дальше, в разделе про сложности.

Порядок работ при интеграции стороннего сервиса

Схема работает и для эквайринга, и для CRM, и для доставки, меняется только содержание шагов.

  1. Изучаю документацию и делаю тестовый запрос в песочнице через Postman или curl, до всякого кода в проекте, чтобы понять реальный формат ответа, а не тот, что нарисован в примерах.
  2. Продумываю, где будут храниться ключи и токены: переменные окружения на сервере, не в JS на фронте и не в публичном репозитории, даже если это черновой коммит.
  3. Реализую основной сценарий, например создание заказа в WooCommerce и передачу его в Т‑Банк на оплату, или расчёт стоимости доставки СДЭК по адресу покупателя на этапе оформления заказа.
  4. Добавляю обработку ошибок: таймауты, отказ сервиса, некорректный формат ответа, лимит запросов, для каждого случая отдельное поведение.
  5. Настраиваю приём вебхуков для асинхронных событий: оплата прошла, посылка передана в СДЭК, статус заказа изменился в CRM.
  6. Тестирую на реальных, но небольших суммах и объёмах, прежде чем открывать доступ всем пользователям.
  7. Выкладываю в боевой контур и слежу за логами первую неделю, именно тогда всплывают лимиты и краевые случаи, которых не было в песочнице.

Особенности интеграции на разных платформах

Способ подключения одного и того же API отличается в зависимости от того, есть ли у сайта свой сервер.

  • На Tilda нет своего бэкенда, поэтому запросы с приватным ключом идут через отдельный серверный обработчик, я пишу его на Node.js или PHP и размещаю на своём хостинге, а Tilda-скрипт на странице обращается уже к этому обработчику, а не напрямую к внешнему API.
  • На WordPress есть PHP на сервере, поэтому часть логики ложится прямо в тему или в плагин, ключи хранятся в конфигурации окружения, а не в базе данных в открытом виде.
  • На кастомном сайте на Laravel или Node.js структура заранее готова под такие задачи: есть очереди для повторных попыток, есть место для хранения токенов и логов, поэтому сложные интеграции с несколькими сервисами обычно и делают на такой основе.

Кроме классического хостинга под серверный обработчик иногда использую serverless-функции на Vercel или Netlify, если проект и так там развёрнут, тогда не нужен отдельный сервер только ради одной интеграции. Часть типовых задач под Tilda, вроде расчёта зон доставки или отображения промокодов, уже оформлена в виде готовых скриптов, и это быстрее, чем писать интеграцию с нуля под конкретный проект.

Бесплатный материал

🎁 Полезный скрипт в подарок

Подпишитесь на Telegram - пришлю готовый скрипт по этой теме.

Без спама. Отписка в 1 клик.

Аутентификация и хранение ключей доступа

У Т‑Банка подпись запроса считается по SHA-256 от конкатенации параметров и пароля терминала, у WooCommerce REST API используется пара consumer key и consumer secret с Basic Auth. У сервисов на OAuth2 добавляется ещё обновление access-токена по refresh-токену: access-токен обычно живёт от часа до суток, refresh-токен намного дольше, и если не обновлять его вовремя, интеграция начинает падать через месяц без видимых изменений в коде.

В любом случае ключи живут на сервере и не попадают в код, который отдаётся браузеру. Если сайт статический, например на Tilda, а секретный ключ нужен для подписи запроса, эту логику выношу в отдельный серверный обработчик, а фронт дергает уже его. Сюда же относится проблема CORS: часть внешних API вообще не разрешает запросы напрямую из браузера с чужого домена, и тогда серверный прокси нужен не только ради безопасности ключа, но и просто чтобы запрос прошёл. Дополнительно раз в несколько месяцев меняю ключи доступа вручную, особенно если к проекту подключались подрядчики со стороны, это дешевле, чем потом разбираться, откуда произошла утечка.

Вебхуки и обработка асинхронных ответов

Часть событий приходит не в ответ на запрос, а отдельным вызовом от внешнего сервиса на мой URL: Т‑Банк уведомляет о смене статуса платежа, СДЭК о движении посылки. Такой вебхук нужно проверить на подлинность, иначе кто угодно сможет прислать поддельное уведомление об оплате.

const crypto = require('crypto');

function isValidSignature(payload, signature, secret) {
  const expected = crypto
    .createHmac('sha256', secret)
    .update(payload)
    .digest('hex');
  return expected === signature;
}

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

Типовые сложности при интеграции API на сайт

Из того, что регулярно ломает планы:

  • Лимиты запросов. У большинства API есть rate limit, и при массовой рассылке через бота на aiogram или синхронизации каталога легко в него упереться: у Telegram Bot API, например, около 30 сообщений в секунду на одного бота, и при рассылке по большой базе часть сообщений нужно откладывать в очередь и отправлять с задержкой.
  • Несовпадение форматов данных: суммы в копейках у одного сервиса и в рублях у другого, даты в ISO 8601 против формата ДД.ММ.ГГГГ, телефон с +7 или без, из-за чего заявка может не пройти валидацию на стороне внешнего сервиса без внятного текста ошибки.
  • Версии API меняются без предупреждения. Так было с переходом части сервисов на новую версию протокола, старые интеграции переставали работать, хотя код на моей стороне никто не трогал.
  • Различия между песочницей и боевым контуром: в тесте часть полей может отсутствовать или приходить в упрощённом виде, и код, написанный под sandbox, падает на первом же боевом запросе.
  • Синхронное ожидание ответа внешнего сервиса на форме сайта. Если API отвечает медленно, пользователь видит зависшую кнопку отправки, и часть заявок теряется. Для таких сценариев обработку выношу в очередь, например через n8n, а пользователю сразу показываю, что заявка принята, а дальше она обрабатывается в фоне.

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

Сколько стоит и сколько занимает интеграция стороннего API

Цена и срок сильно зависят от количества сервисов в связке и от того, есть ли у стороннего API нормальная документация.

Тип интеграции Что входит Цена
Доработка Tilda-скрипта Один сервис, готовый API, простая передача данных без сложной логики от 3 000 ₽
Комплексная интеграция CRM, эквайринг и СДЭК в связке, вебхуки, обработка ошибок от 40 000 ₽
Автоматизация в n8n Связка нескольких API через сценарии без отдельного бэкенда от 25 000 ₽
AI-интеграция Подключение Claude API или OpenAI, обработка контекста, RAG при необходимости от 50 000 ₽
Отдельный бэкенд на Laravel Проксирование запросов, хранение токенов и логов интеграции от 100 000 ₽

По срокам: подключение одного сервиса с внятной документацией занимает 3-5 дней, связка из нескольких API с эквайрингом и доставкой растягивается на 3-4 недели. Например, связка Telegram-бота на aiogram с приёмом оплаты через Т‑Банк и уведомлением менеджеру в CRM обычно попадает в категорию комплексной интеграции, потому что затрагивает три сервиса сразу, а не один. Комиссия эквайринга зависит от тарифа, который заказчик согласовал с банком, а не от того, что подключаю я, эту цифру уточняйте у своего банка отдельно.

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

Сколько времени занимает интеграция стороннего API?

Для одного сервиса с рабочей документацией и песочницей обычно 3-5 дней вместе с тестированием. Если в проекте несколько сервисов, например оплата, доставка и CRM одновременно, срок растягивается до 3-4 недель, потому что каждый вебхук и каждую связку статусов нужно проверять отдельно, а не запускать всё сразу без промежуточных проверок.

Что делать, если у сервиса нет документации API?

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

Нужен ли отдельный сервер для интеграции API?

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

Можно ли хранить данные клиентов в Google Sheets или Airtable при интеграции?

Для персональных данных, то есть имён, телефонов, адресов доставки, нет, если сервис размещён за пределами России, это требование 152-ФЗ о локализации персональных данных. Для таких сценариев использую CRM или базу данных на сервере в РФ, а иностранные таблицы оставляю разве что для обезличенной аналитики без привязки к конкретному человеку.

Есть задача?

Обсудим в мессенджере

Расскажите, что нужно сделать — отвечу в течение 4 часов в рабочее время. Первая консультация бесплатно.

Продолжая пользование настоящим сайтом Вы выражаете своё согласие на обработку Ваших персональных данных (файлов куки) с использованием Yandex.Metrika.
Понятно