Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions B24-Integration-Bridge/chathistory/faq.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
~1. Синхроницация в какую сторону? в обе?
~ЕСБ принимает - другой портал отправляет~
2. Одноразовая или как часто?
~Постоянная. Например как я вижу - сделка готова для передачи в ЕСБ - ее переводят на определенную стадию, при переводе данные передаются в ЕСБ. ~
3. если поля и там и там заполнены, пропускать? или сверять? если сверять то где заменять?
Создать новую сделку, 1 раз передать данные полей

374 changes: 374 additions & 0 deletions B24-Integration-Bridge/chathistory/intorg1.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,374 @@
~
исследуй возможность создания через вебхук - робота в сделке, который будет передавать данные сделки на другой портал через входящий вебхук другого портала.
Для этого изучи репозиторий в проекте Sergeilipiev/b24restdocs, наметь план и покажи его мне


Investigated webhook robot strategy for transferring deal data


Приветствую! Давайте исследуем возможность создания робота в сделке Битрикс24 для передачи данных через вебхуки. Начну с изучения проектной документации.


4 steps

Searched project for “CRM deal webhook handler automation trigger bizproc activity robot”
8 results












Mapped out webhook integration strategy for Bitrix24 portals.

Привет! Основываясь на документации b24restdocs и ваших требованиях, составил детальный план реализации робота для передачи данных сделок через вебхуки.

📋 Детальный план реализации интеграции
1. Архитектура решения
[Портал-источник] → [Робот на стадии] → [Вебхук] → [Портал ЕСБ] → [Создание сделки]
Компоненты системы:

Портал партнера - источник данных сделок
Робот автоматизации - инициатор передачи при смене стадии
Обработчик вебхука - промежуточный сервис трансформации данных
Портал ЕСБ - целевой портал для приема сделок
2. Этап 1: Настройка входящего вебхука в ЕСБ
2.1 Создание вебхука для приема данных
php
// URL вебхука будет иметь вид:
https://esb.bitrix24.ru/rest/USER_ID/SECRET_CODE/crm.deal.add.json

// Где:
// USER_ID - ID пользователя создавшего вебхук
// SECRET_CODE - секретный код доступа
2.2 Тестирование вебхука
bash
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"fields": {
"TITLE": "Тестовая сделка от партнера",
"TYPE_ID": "SALE",
"STAGE_ID": "NEW",
"COMPANY_ID": 123,
"CONTACT_ID": 456
}
}' \
https://esb.bitrix24.ru/rest/1/xxx/crm.deal.add.json
3. Этап 2: Создание промежуточного обработчика
3.1 Структура обработчика (handler.php)
php
<?php
// Конфигурация
define('ESB_WEBHOOK_URL', 'https://esb.bitrix24.ru/rest/1/xxx/');
define('LOG_FILE', __DIR__ . '/integration.log');

// Маппинг полей между порталами
$fieldMapping = [
// Поля партнера => Поля ЕСБ
'TITLE' => 'TITLE',
'OPPORTUNITY' => 'OPPORTUNITY',
'CURRENCY_ID' => 'CURRENCY_ID',
'COMPANY_ID' => 'UF_PARTNER_COMPANY_ID', // Кастомное поле в ЕСБ
'CONTACT_ID' => 'UF_PARTNER_CONTACT_ID',
'STAGE_ID' => 'STAGE_ID',
'SOURCE_ID' => 'SOURCE_ID',
'COMMENTS' => 'COMMENTS',
// Дополнительные поля согласно вашим соответствиям
];

// Обработка входящего запроса от робота
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$input = json_decode(file_get_contents('php://input'), true);

writeToLog($input, 'Incoming data from partner portal');

try {
// Валидация обязательных полей
if (empty($input['data']['FIELDS']['ID'])) {
throw new Exception('Deal ID is required');
}

// Получаем полные данные сделки
$dealData = getDealDetails($input);

// Трансформация данных
$esbDealData = transformDealData($dealData, $fieldMapping);

// Добавляем метаданные
$esbDealData['UF_SOURCE_PORTAL'] = $input['auth']['domain'];
$esbDealData['UF_SOURCE_DEAL_ID'] = $dealData['ID'];
$esbDealData['UF_TRANSFER_DATE'] = date('Y-m-d H:i:s');

// Отправка в ЕСБ
$result = sendToESB($esbDealData);

writeToLog($result, 'ESB response');

// Возвращаем успешный ответ роботу
echo json_encode(['success' => true, 'esb_deal_id' => $result['result']]);

} catch (Exception $e) {
writeToLog($e->getMessage(), 'Error');
http_response_code(500);
echo json_encode(['error' => $e->getMessage()]);
}
}

function getDealDetails($webhookData) {
$dealId = $webhookData['data']['FIELDS']['ID'];
$auth = $webhookData['auth'];

// Запрос полных данных сделки
$url = "https://{$auth['domain']}/rest/crm.deal.get";
$params = [
'id' => $dealId,
'auth' => $auth['access_token']
];

$response = callBitrix24($url, $params);
return $response['result'];
}

function transformDealData($sourceData, $mapping) {
$result = ['fields' => []];

foreach ($mapping as $sourceField => $targetField) {
if (isset($sourceData[$sourceField])) {
$result['fields'][$targetField] = $sourceData[$sourceField];
}
}

return $result;
}

function sendToESB($dealData) {
$url = ESB_WEBHOOK_URL . 'crm.deal.add.json';
return callBitrix24($url, $dealData);
}

function callBitrix24($url, $params) {
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query($params),
CURLOPT_HTTPHEADER => ['Content-Type: application/x-www-form-urlencoded']
]);

$response = curl_exec($curl);
curl_close($curl);

return json_decode($response, true);
}

function writeToLog($data, $title = '') {
$log = "\n------------------------\n";
$log .= date("Y.m.d G:i:s") . "\n";
$log .= $title . "\n";
$log .= print_r($data, true);
$log .= "\n------------------------\n";
file_put_contents(LOG_FILE, $log, FILE_APPEND);
}
?>
4. Этап 3: Настройка робота в CRM партнера
4.1 Создание исходящего вебхука
javascript
// В портале партнера создаем исходящий вебхук
// Настройки:
{
"name": "Передача сделки в ЕСБ",
"handler": "https://your-server.com/handler.php",
"event": "ONCRMDEALUPDATE",
"auth_type": "1" // С авторизацией
}
```

#### 4.2 Настройка робота автоматизации
```
1. Переходим в CRM > Настройки > Роботы и триггеры
2. Выбираем нужную стадию (например "Готово к передаче в ЕСБ")
3. Добавляем робот "Исходящий вебхук"
4. Указываем URL обработчика: https://your-server.com/handler.php
5. Настраиваем условия запуска
5. Этап 4: Расширенная функциональность
5.1 Обработка файлов и документов
php
function transferDealFiles($dealId, $sourceAuth, $targetDealId) {
// Получаем файлы из исходной сделки
$files = getFilesFromDeal($dealId, $sourceAuth);

foreach ($files as $file) {
// Скачиваем файл
$fileContent = downloadFile($file['downloadUrl'], $sourceAuth);

// Загружаем в целевую сделку
uploadFileToDeal($targetDealId, $fileContent, $file['name']);
}
}
5.2 Синхронизация товарных позиций
php
function syncProductRows($sourceDealId, $targetDealId, $auth) {
// Получаем товары из исходной сделки
$products = callBitrix24(
"https://{$auth['domain']}/rest/crm.deal.productrows.get",
['id' => $sourceDealId, 'auth' => $auth['access_token']]
);

// Маппинг ID товаров между порталами
$productMapping = getProductMapping();

$targetProducts = [];
foreach ($products['result'] as $product) {
$targetProducts[] = [
'PRODUCT_ID' => $productMapping[$product['PRODUCT_ID']] ?? null,
'PRODUCT_NAME' => $product['PRODUCT_NAME'],
'PRICE' => $product['PRICE'],
'QUANTITY' => $product['QUANTITY']
];
}

// Добавляем товары в целевую сделку
callBitrix24(
ESB_WEBHOOK_URL . 'crm.deal.productrows.set',
['id' => $targetDealId, 'rows' => $targetProducts]
);
}
6. Этап 5: Мониторинг и логирование
6.1 Система уведомлений
php
function notifyTransferStatus($dealId, $status, $details = []) {
$message = $status === 'success'
? "✅ Сделка #{$dealId} успешно передана в ЕСБ"
: "❌ Ошибка передачи сделки #{$dealId}: " . $details['error'];

// Отправка в чат Битрикс24
callBitrix24(
"https://partner.bitrix24.ru/rest/im.notify",
[
'to' => $details['responsible_id'],
'message' => $message,
'type' => $status === 'success' ? 'SYSTEM' : 'ERROR'
]
);

// Запись в историю сделки
callBitrix24(
"https://partner.bitrix24.ru/rest/crm.timeline.comment.add",
[
'fields' => [
'ENTITY_ID' => $dealId,
'ENTITY_TYPE' => 'deal',
'COMMENT' => $message
]
]
);
}
7. Тестирование и отладка
7.1 Скрипт тестирования
bash
#!/bin/bash
# test_integration.sh

# Тестовые данные сделки
TEST_DEAL='{
"event": "ONCRMDEALUPDATE",
"data": {
"FIELDS": {
"ID": "123"
}
},
"auth": {
"domain": "partner.bitrix24.ru",
"access_token": "test_token"
}
}'

# Отправка тестового запроса
curl -X POST \
-H "Content-Type: application/json" \
-d "$TEST_DEAL" \
https://your-server.com/handler.php
8. План развертывания
Фаза 1: Подготовка (1-2 дня)
Создание входящего вебхука в ЕСБ
Развертывание обработчика на сервере
Настройка HTTPS и SSL сертификатов
Создание тестовых сделок
Фаза 2: Настройка (2-3 дня)
Маппинг всех полей между порталами
Настройка робота на тестовой стадии
Тестирование базовой передачи данных
Настройка логирования
Фаза 3: Тестирование (3-4 дня)
Тест передачи различных типов сделок
Проверка обработки ошибок
Нагрузочное тестирование
Валидация данных в ЕСБ
Фаза 4: Внедрение (1-2 дня)
Перенос на продуктивную стадию
Обучение пользователей
Мониторинг первых передач
Документирование процесса
9. Требования к инфраструктуре
yaml
Сервер обработчика:
- PHP >= 7.4
- HTTPS с валидным SSL
- cURL extension
- Доступ к портам 443
- Логирование: 100MB
- Uptime: 99.5%

Сетевые требования:
- Белый IP адрес
- Открытые исходящие соединения к *.bitrix24.ru
- Таймаут соединения: 30 секунд
- Максимальный размер запроса: 10MB
10. Безопасность
php
// Проверка подлинности запроса
function validateWebhook($auth) {
$allowedDomains = ['partner1.bitrix24.ru', 'partner2.bitrix24.ru'];

if (!in_array($auth['domain'], $allowedDomains)) {
throw new Exception('Unauthorized domain');
}

// Проверка токена приложения
if ($auth['application_token'] !== EXPECTED_APP_TOKEN) {
throw new Exception('Invalid application token');
}

return true;
}
📌 Следующие шаги
Сегодня вы упомянули соответствия кодировок полей - давайте их детально пропишем для точного маппинга
Определим конкретную стадию для запуска передачи
Настроим тестовый контур для проверки интеграции
Готов приступить к реализации. Начнем с маппинга полей?









Intorg







~
Loading