API-интеграция для собственного сайта: REST API, Webhook и способы подключения сторонних систем

Чтобы связать сайт с CRM, email-маркетингом, платёжным шлюзом и аналитикой, есть всего два подхода: REST API с активным запросом (Pull) и Webhook с пассивной отправкой (Push). Контринтуитивно...

独立站 API 集成:REST 拉取 与 Webhook 推送的分工API Integration: REST pull vs Webhook push Webhook 失败了你不知道 —— 关键数据同步必须用定时拉取做对账Webhook failures are silent — use scheduled pull for critical reconciliation 对比维度Dimension REST API(拉)REST API (pull) Webhook(推)Webhook (push) 触发方式Trigger 定时轮询 / 主动请求Scheduled polling 事件发生时对方主动推On event, pushed by source 实时性Realtime 分钟级延迟(轮询间隔)Minute-level lag 秒级实时Second-level realtime 失败可见性Failure visibility 请求失败立即可见,自动重试Errors visible, auto-retry 推送失败对方重试,你不知道Failures silent to you 适用场景Use case 数据同步、报表、对账Sync, reporting, reconciliation 新线索通知、订单状态变更New lead alert, order update 认证方式Auth API Key / OAuth 2.0API Key / OAuth 2.0 签名验证(HMAC)HMAC signature verification 推荐组合:Webhook 做实时通知 + 每小时定时 REST 拉取做对账兜底Best combo: webhook for realtime + hourly REST pull as backup Webhook 负责秒级通知,REST 每小时拉一次增量数据,两边不一致以 REST 为准Webhook alerts in seconds, hourly REST pulls catch what webhook missed 红线:不要把 API Key 写在前端 JavaScript 里 —— 任何人 F12 就能看到Red line: never expose API keys in frontend JS 所有 API 请求必须走后端代理,前端只调自己服务器的接口Proxy all calls through your backend
Сравнение REST API (Pull) и Webhook (Push) по пяти параметрам и рекомендуемая схема

API-интеграция для собственного сайта: REST API, Webhook и способы подключения сторонних систем

Сначала вывод: Чтобы связать сайт с CRM, email-маркетингом, платёжным шлюзом и аналитикой, есть всего два подхода: REST API с активным запросом (Pull) и Webhook с пассивной отправкой (Push). Контринтуитивный вывод: Webhook — не панацея. Он подходит для мгновенных уведомлений, но если Webhook не сработает, вы об этом не узнаете. Для синхронизации критичных данных нужен ежечасный REST-запрос по расписанию как страховка для сверки. Рекомендуемая схема: Webhook для мгновенных уведомлений + REST по расписанию для сверки данных. Без любого из этих двух уровней не обойтись. API Key должен храниться на бэкенде: ключ, видимый во фронтенде через F12, равносилен публичному.

1. WordPress REST API: сначала разберитесь в стандартных возможностях

Начиная с версии 4.7 в WordPress встроен REST API — плагины не нужны. Формат эндпоинта: https://ваш-домен/wp-json/wp/v2/posts. Откройте его в браузере — увидите список статей в формате JSON. По умолчанию этот API публичный: любой может читать ваши статьи, страницы и медиатеку. Это и плюс (удобно подключаться), и риск (внутренние данные открыты).

Для операций записи (создание статей, изменение заказов, добавление пользователей) нужна аутентификация. WordPress поддерживает два способа: Application Passwords (простой, генерируется на странице профиля пользователя, подходит для вызовов с собственного сервера) и OAuth 2.0 (сложный, подходит для авторизации сторонних приложений). Для подключения сайта к собственной CRM достаточно Application Passwords. Не храните логин и пароль admin жёстко в коде ради простоты.

Как решить: вам нужно читать данные из WordPress или записывать? Только чтение (список статей, записи заказов) — GET-запрос с Application Passwords. Запись (создание заказов, обновление пользователей, отправка Webhook) — POST/PUT-запросы, а права должны быть минимальными: например, только «редактирование заказов», без «управления всеми настройками». Как собрать стек — см.Технологический стек crater.

Эндпоинт Метод Зачем нужен Требования к сертификации
/wp-json/wp/v2/posts GET Чтение списка статей Публичный (опубликованные)
/wp-json/wp/v2/posts POST Создание статьи Application Passwords
/wp-json/wc/v3/orders GET Чтение заказов WooCommerce Consumer Key
/wp-json/wc/v3/orders POST Создание заказа Consumer Key
/wp-json/wp/v2/users GET Чтение списка пользователей Пароль администратора
/wp-json/wp/v2/media POST Загрузка изображений Редактирование указанных паролей

2. Webhook: мгновенные уведомления по событиям

Webhook и REST API отличаются направлением. В REST вы сами идёте на сервер партнёра за данными, а Webhook — это когда сервер партнёра сам присылает данные вам, как только происходит событие. Например, когда в WooCommerce появляется новый заказ, он отправляет POST-запрос на URL, указанный в настройках Webhook, а в теле запроса — JSON с деталями заказа. Вам не нужно каждую минуту опрашивать «нет ли нового заказа» — заказ приходит автоматически.

WooCommerce поддерживает Webhook из коробки. Добавить его можно в WooCommerce → Настройки → Дополнительно → Webhooks. Нужно заполнить: событие-триггер (создание заказа, обновление заказа, отмена заказа), URL приёма (эндпоинт на вашем сервере, например https://ваш-домен/wp-json/custom/v1/new-order), способ подписи (HMAC-SHA256 — с помощью секретного ключа проверяется, что запрос действительно пришёл из WooCommerce, а не подделан кем-то другим).

Контринтуитивный вывод:Если Webhook не доставляется, вы, скорее всего, об этом даже не узнаете. Когда WooCommerce отправляет Webhook, а ваш сервер отвечает 500, он повторит попытку несколько раз (по умолчанию до 5 раз с увеличивающимся интервалом). Но если все 5 попыток провалятся, он сдаётся: вы не получаете ни данных, ни какого-либо уведомления. Поэтому критичные данные нельзя держать только на Webhook — нужен резервный механизм в виде периодического опроса. Как настроить интеграцию с CRM, читайте в разделе Интеграция CRM с собственным сайтом.

Событие Хук WooCommerce Куда отправлять Приоритет
Создание нового заказа woocommerce_order_created CRM + уведомление в Slack Максимальная
Изменение статуса заказа woocommerce_order_status_changed Письмо клиенту + обновление в CRM Высокий
Успешная оплата woocommerce_payment_complete Обновление в системе лояльности Высокий
Оформление возврата woocommerce_order_refunded Отметка в CRM + уведомление в бухгалтерию Средний
Регистрация нового пользователя user_register Список для email-рассылки Средний
Публикация/снятие товара с публикации woocommerce_product_set_visibility Синхронизация со складской системой Низкая

III. Периодический опрос через REST: сверка как страховка

Webhook отвечает за мгновенные уведомления, но вам обязательно нужен ещё один слой — периодический опрос для сверки. Делается это просто: пишете скрипт на WP-Cron, который запускается раз в час, обращается к WooCommerce REST API и забирает заказы, созданные или обновлённые за последний час, а затем сравнивает их с теми, что уже есть в вашей базе. Если Webhook пропустил какой-то заказ (например, ваш сервер в момент отправки вернул 502), периодический опрос его подтянет.

В параметрах запроса при периодическом опросе нужно передавать метку времени. Например, GET /wp-json/wc/v3/orders?after=2026-09-21T10:00:00&per_page=100 вернёт все заказы после 10:00, по 100 штук на страницу. Если вернулось 100 записей, значит, скорее всего, есть ещё — продолжайте листать страницы. После этого удалите дубликаты по ID заказа: то, что уже есть в базе, пропускаете, новое вставляете. Это и есть простейшая логика сверки.

Пример: в среду в 15:00 SSL-сертификат сервера истёк и вернул 525 на 40 минут. За это время вебхуки трёх новых заказов не прошли. Если бы был только вебхук, эти три заказа потерялись бы. Но настроена почасовая выгрузка: в 16:00 она подхватила пропущенные заказы, и клиенты получили письма с подтверждением. Как настроить мониторинг, см.Мониторинг сайта и оповещения.

Способ синхронизации Частота Задержка Действия при сбое
Вебхук-уведомления По событию Секунды Партнёр сдаётся после 5 попыток
Почасовая выгрузка Каждый час ровно Минуты При сбое повторит в следующий раз
Ежедневная сверка всех данных Каждый день в 3 часа ночи Дни Отчёт о расхождениях проверяет человек
WebSocket в реальном времени В реальном времени Миллисекунды При обрыве нужно переподключение

Четыре. Аутентификация и безопасность: ключ на бэкенде, подпись запроса

Самая частая ошибка в безопасности при интеграции по API — хранить API-ключ в клиентском JavaScript. Любой откроет в браузере F12 → вкладку Network и увидит ваш ключ, а потом будет дёргать ваш API сколько угодно. Правильно так: фронтенд обращается только к вашему серверу, а сервер добавляет API-ключ и пересылает запрос третьей стороне. Таким прокси на бэкенде может быть пользовательский REST-эндпоинт WordPress или простой сервис на Node.js/Python.

Принимая вебхук, обязательно проверяйте подпись. WooCommerce при отправке вебхука добавляет в HTTP-заголовки X-WC-Webhook-Signature — это подпись HMAC-SHA256, посчитанная по телу запроса с вашим Webhook Secret. Вы считаете такую же подпись на своём эндпоинте и сравниваете с заголовком: совпало — обрабатываете. Не совпало — запрос подделан, сразу возвращайте 403. Без проверки подписи любой может отправить POST с фальшивым заказом на ваш эндпоинт, и в CRM посыплются мусорные лиды.

Пример: вы принимаете вебхуки HubSpot, и кто-то узнал ваш URL. Он отправляет POST с фальшивым «новым лидом». Без проверки подписи этот лид попадёт в HubSpot, продавец будет вести его полдня, а потом выяснит, что он ненастоящий. С проверкой HMAC запрос HubSpot приходит с верной подписью, а у поддельного подпись не сходится — его сразу отсекает 403. Подробности интеграции с CRM см.Интеграция CRM с собственным сайтом.

Пункт безопасности Неправильный подход Правильный подход
Где хранится API-ключ В клиентском JS В переменных окружения на сервере
Проксирование запросов Фронтенд обращается к API третьей стороны напрямую Фронтенд обращается к своему серверу, бэкенд пересылает
Проверка подписи вебхука Без проверки, обрабатываем как есть Сравнение HMAC-SHA256 с заголовком
HTTPS Приём вебхуков по HTTP Только HTTPS, TLS 1.2 и выше
Белый список IP Без ограничений по IP источника Белый список по официальным диапазонам IP партнёра
Логи ошибок При сбое ничего не записывается Все ответы вне 2xx пишутся в лог

Пять. Список частых интеграций с третьими сторонами

В независимом магазине обычно пять типов сторонних интеграций: CRM (HubSpot, Salesforce, Zoho), email-маркетинг (Mailchimp, ConvertKit, Klaviyo), платёжные шлюзы (Stripe, PayPal), аналитика (Google Analytics 4, Hotjar) и поддержка клиентов (Intercom, Zendesk). Способ подключения у каждого свой, но принцип один: где можно — Webhook (в реальном времени), а для ключевых данных добавьте периодическую выгрузку как страховку.

Не бросайтесь сразу писать код для интеграции. Сначала проверьте, нет ли готового плагина в каталоге WordPress: у HubSpot есть официальный плагин, у Mailchimp — официальный, у Stripe — официальное расширение для WooCommerce. Готовые плагины закрывают 80% задач, а оставшиеся 20% (например, маппинг кастомных полей) добираются через Webhook или собственный код. Написать интеграцию двух систем самому — это обычно больше 20 часов отладки, а установка готового плагина занимает час. Как выбрать CRM-плагин, читайте в Заявки с сайта в CRM.

Тип системы Рекомендуемый подход Способ интеграции Ожидаемые трудозатраты
CRM (HubSpot) Официальный плагин + Webhook Плагин синхронизирует автоматически 2–4 часа
Email-маркетинг (Mailchimp) Официальный плагин Регистрация автоматически добавляет в список 1–2 часа
Оплата (Stripe) Официальное расширение WooCommerce Webhook синхронизирует статус заказа 1–2 часа
Аналитика (GA4) Плагин Site Kit by Google Автоматическая разметка на фронтенде 30 минут
Поддержка (Intercom) Официальный плагин чата Сниппет кода на фронтенде 30 минут
Собственная ERP Своя интеграция через REST Периодическая выгрузка + Webhook Больше 20 часов

FAQ: частые вопросы

Чем REST API отличается от Webhook и что лучше?
Направление противоположное. REST API — это когда вы сами идёте на сервер другой системы за данными (Pull): нужен опрос по расписанию, задержка в минутах, но об ошибке вы узнаете. Webhook — это когда другая система сама присылает вам данные при наступлении события (Push): задержка в секундах, но об ошибке вы можете не узнать. Лучшего варианта нет, рекомендуем комбинировать: Webhook для уведомлений в реальном времени (новый заказ или лид приходит за секунды), ежечасная выгрузка через REST для сверки и подстраховки (добирает то, что пропустил Webhook). Не полагайтесь на один Webhook для ключевых данных.
Нужен ли плагин для WordPress REST API?
Нет. В WordPress 4.7 и выше REST API встроен из коробки, эндпоинт — /wp-json/wp/v2/posts. Чтение опубликованного контента открыто, а для записи (создание записей, изменение заказов) нужна аутентификация по application password. API WooCommerce находится по адресу /wp-json/wc/v3/, а Consumer Key и Consumer Secret нужно сгенерировать в настройках WooCommerce. Если нужно добавить собственные эндпоинты (например, для приёма Webhook), напишите их через встроенную функцию register_rest_route() — дополнительный плагин не понадобится.
Где хранить API Key и можно ли использовать его на фронтенде?
Никогда не храните ключи во фронтенд-JavaScript. Любой откроет F12, увидит ваш ключ и начнёт дёргать ваш API от вашего имени. Правильно так: ключ хранится в переменных окружения на сервере (wp-config.php или файл .env), фронтенд обращается только к вашему серверу, а бэкенд добавляет ключ и проксирует запрос к стороннему сервису. Если фронтенду нужен прямой вызов стороннего API (например, Stripe.js), используйте Publishable Key от этого сервиса — публичный ключ, он для того и предназначен. Secret Key всегда остаётся на бэкенде.
Как убедиться, что запрос на приёмник Webhook настоящий?
Проверяйте по HMAC-подписи. Когда WooCommerce, Stripe, HubSpot и другие сервисы отправляют Webhook, они кладут в HTTP-заголовок значение подписи (например, X-WC-Webhook-Signature). На приёмнике вы считаете HMAC-SHA256 от исходного body с оговорённым Secret и сравниваете с тем, что в заголовке. Совпало — обрабатываете, не совпало — возвращаете 403. Важно: считайте именно от исходной строки body, а не от JSON после парсинга и повторной сериализации, иначе различия в пробелах и переносах строк сломают подпись.
Что делать, если Webhook не доставился?
По умолчанию WooCommerce повторяет отправку, если приёмник вернул код не из диапазона 2xx: до 5 попыток с растущими интервалами (1 минута, 5 минут, 15 минут, 1 час, 3 часа). После пятой неудачи попытки прекращаются. От вас нужны две вещи. Первое: логируйте ошибки на приёмнике, чтобы потом разобраться. Второе: добавьте ежечасный REST-запрос по расписанию как страховку — он подтянет заказы, которые потерялись. Не считайте Webhook стопроцентно надёжным: временная недоступность сервера, истёкший SSL, сбои сети — всё это приводит к потерям.
Для интеграции со сторонней системой брать готовый плагин или писать самому?
В 80% случаев хватает готового плагина. У HubSpot, Mailchimp, Stripe, GA4 есть официальные плагины: ставите, вписываете API Key — и готово, 1–4 часа работы. Свои руки нужны для оставшихся 20% — нестандартный маппинг полей, связка нескольких систем, стыковка с внутренней ERP. Написать REST-интеграцию между двумя системами — это обычно от 20 часов отладки: аутентификация, обработка ошибок, повторы, логи. Критерий простой: если плагин закрывает 80% вашего маппинга полей — берите плагин, иначе думайте о своём решении.

В заключение

В интеграции по API важна не сложность, а надёжность. Цель одна: данные не теряются, статусы верные, при сбое есть где посмотреть. Webhook быстрый, но ненадёжный, REST медленный, но управляемый — только вместе они дают продакшен-решение. Любой из них по отдельности рано или поздно приведёт к потере данных.

Три шага к внедрению: для ключевых интеграций ставьте Webhook с уведомлениями в реальном времени и проверкой HMAC на приёмнике; добавьте ежечасный REST-запрос по расписанию для сверки — он автоматически подтянет пропущенное; все API Key держите в переменных окружения на бэкенде, а фронтенд пусть обращается только к прокси на вашем сервере.

Одна фраза, которую стоит запомнить: Webhook — это «мгновенное уведомление», REST — «регулярная сверка». Полагаться только на уведомления и не сверяться — всё равно что слышать звонок в дверь и не проверять почтовый ящик.

crater
crater Эксперт Crater

Официальный аккаунт организации · crater Crater

环形山 (Crater) — компания, которая помогает выходить на зарубежные рынки: разработка сайтов на WordPress, Google SEO и комплексный рост в GEO. Мы работаем с умными устройствами, промышленным оборудованием, SaaS и новой энергетикой.

Возможности продуктаБелая книга по методологииОтраслевые отчёты
965篇分享
78статей в базе знаний