Разработка серверных приложений Битрикс24
Представьте: интернет-магазин на Magento, 5000+ заказов в день. Каждый нужно превратить в сделку Битрикс24, назначить ответственного, отправить уведомление в Telegram. Без серверного приложения — ручная работа или вебхуки с ограничениями: привязаны к сессии, не масштабируются. Серверное приложение решает это полностью автоматически: работает в фоне, использует OAuth 2.0, подписывается на события. Мы реализовали 50+ таких интеграций для ритейла, логистики и финтеха. За более чем 5 лет выработали архитектуру, выдерживающую миллионы запросов в сутки. Но есть нюансы: токены могут истечь, события могут приходить валом, а батч-запросы требуют грамотной паузы. Разберём ключевые моменты, которые превращают простую интеграцию в отказоустойчивый production.
Чем серверное приложение отличается от webhook?
Вебхуки в Битрикс24 — входящие URL, куда Битрикс24 шлёт события. Они удобны для простых сценариев, но имеют ограничения: привязаны к конкретному пользователю, не поддерживают OAuth, не могут быть тиражными. Серверное приложение (тип server) — полноценный OAuth-клиент:
- Авторизуется от имени установившего пользователя с сохранением токенов.
- Работает в фоне (демон, очередь задач, cron).
- Поддерживает многопортальность (одно приложение — много клиентов).
- Имеет собственный обработчик событий через
event.bind.
Серверное приложение в 10 раз надёжнее вебхуков при высокой нагрузке и не зависит от сессии. Для сложных сценариев — единственный рабочий вариант.
| Критерий | Вебхук | Серверное приложение |
|---|---|---|
| Аутентификация | По сессии пользователя | OAuth 2.0 (client_id + client_secret) |
| Фоновая работа | Нет | Да (демон, cron) |
| Многопортальность | Нет | Да, через member_id |
| Обработка событий | Только от одного пользователя | Любые события портала |
| Безопасность | Низкая (зависит от сессии) | Высокая (токены с refresh) |
Как работает OAuth в серверном приложении?
Битрикс24 использует Authorization Code Flow. Приложение перенаправляет пользователя на страницу авторизации с client_id, response_type=code, state. После подтверждения код обменивается на токены через POST к oauth.bitrix.info. Токены содержат access_token, refresh_token, expires_at и member_id. Согласно документации Битрикс24, refresh_token живёт 1 месяц, после чего требуется повторная авторизация. Важно хранить токены в защищённом хранилище (база данных, AWS Secrets Manager, Vault). member_id — уникальный идентификатор портала, служит ключом в multi-tenant архитектуре.
Member_id: идентификация портала
member_id — хеш, однозначно идентифицирующий портал. Возвращается вместе с токенами и не меняется. В многопортальном приложении служит ключом для хранения токенов и конфигурации каждого клиента.
Как обеспечить надёжное хранение токенов?
В production используем таблицу:
CREATE TABLE bitrix_tokens ( id SERIAL PRIMARY KEY, member_id VARCHAR(64) UNIQUE NOT NULL, domain VARCHAR(255) NOT NULL, access_token TEXT NOT NULL, refresh_token TEXT NOT NULL, expires_at TIMESTAMPTZ NOT NULL, scope TEXT, created_at TIMESTAMPTZ DEFAULT NOW(), updated_at TIMESTAMPTZ DEFAULT NOW() ); Refresh при истечении:
def get_valid_token(member_id: str) -> str: token = db.get_token(member_id) if token.expires_at < datetime.now() + timedelta(minutes=5): response = requests.post( 'https://oauth.bitrix.info/oauth/token/', data={ 'grant_type': 'refresh_token', 'client_id': CLIENT_ID, 'client_secret': CLIENT_SECRET, 'refresh_token': token.refresh_token, } ) new_token = response.json() db.update_token(member_id, new_token) return new_token['access_token'] return token.access_token Добавляйте 5-минутный буфер — иначе токен может истечь между проверкой и запросом. Альтернативно используйте Vault.
Пример хранения токенов в Vault
vault kv put secret/bitrix/member_abc123 \ access_token=xxx \ refresh_token=yyy \ expires_at=2025-01-01T00:00:00Z Подписка на события портала
Подписка через REST: POST /rest/event.bind с параметрами event, handler, auth_type. При срабатывании Битрикс24 шлёт POST на handler. Поддерживаются все события CRM: добавление, обновление, удаление сделок, лидов, контактов.
Handler должен отвечать 200 OK за 3 секунды. Если обработка дольше — немедленно возвращайте 200 и отправляйте задачу в очередь (RabbitMQ, Redis Streams, SQS):
@app.route('/webhooks/bitrix/deal-add', methods=['POST']) def handle_deal_add(): data = request.json task_queue.enqueue(process_new_deal, data) return jsonify({'status': 'accepted'}), 200 Работа с батч-запросами
REST API лимит: 2 запроса в секунду (50 для платных). При массовых операциях используйте батч:
POST /rest/batch { "halt": 0, "cmd": { "get_deal": "crm.deal.get?id=42", "get_contact": "crm.contact.get?id=17", "get_company": "crm.company.get?id=5" } } В одном батче до 50 команд. halt=1 останавливает при ошибке.
Как настроить OAuth за 4 шага
- Зарегистрируйте приложение в Битрикс24 (тип
server). - Укажите
redirect_uri— эндпоинт, принимающий код авторизации. - Реализуйте обмен кода на токены через POST к
oauth.bitrix.info. - Сохраните токены вместе с
member_idв защищённом хранилище.
Каждый шаг требует тестирования: сбои на этапе авторизации — частая ошибка.
Многопортальная архитектура
Если приложение обслуживает несколько порталов, структура должна изолировать данные:
-
/api/v1/{member_id}/sync— синхронизация. -
/webhooks/{member_id}/event— приём событий.
Использование member_id в URL удобно, но проверяйте подпись запроса — избегайте IDOR.
Какие этапы включает разработка серверного приложения?
- Анализ требований и проектирование.
- Реализация на PHP/Python с REST API.
- Интеграция с внешними системами (1С, CRM, платежные шлюзы).
- Деплой (Docker, CI/CD).
- Документация и обучение.
- Поддержка месяц после запуска.
Сроки разработки
| Тип приложения | Срок |
|---|---|
| Простая интеграция (однонаправленная синхронизация) | от 3 до 7 дней |
| Двусторонняя синхронизация с одной внешней системой | от 2 до 4 недель |
| Многопортальное приложение с Маркетом | от 1 до 3 месяцев |
| Enterprise-интеграция (несколько систем, очереди, мониторинг) | индивидуально |
Основная сложность — не REST API, а надёжность: идемпотентность, retry-логика, мониторинг токенов. На это уходит 40–60% времени. Мы гарантируем стабильное решение. Если вам нужна разработка серверного приложения, свяжитесь с нами — обсудим вашу задачу и предложим оптимальный срок. Получите консультацию, чтобы убедиться, что мы подходим под ваш проект.
Почему стоит выбрать серверное приложение? Потому что это единственный способ сделать интеграцию, которая не требует ручного вмешательства и выдерживает нагрузку. Доверьте автоматизацию экспертам.







