В процессе автоматизации интернет-магазина часто возникает задача: после успешной оплаты заказа на сайте нужно обновить соответствующую сделку в CRM Битрикс24. Однако стандартная интеграция не всегда синхронизирует статусы автоматически. В этой статье я расскажу, как решить эту проблему с помощью обработчика события и REST API.
Проблема: оплата прошла, а сделка не обновилась
Ситуация знакома многим: вы настроили модуль PayKeeper для приёма платежей, оплата успешно проходит, статус заказа в интернет-магазине меняется на «Оплачен», но в карточке сделки Битрикс24 ничего не меняется. Менеджеры вынуждены проверять оплату вручную, что снижает эффективность работы.
Стандартная интеграция «Обмен с 1С-Битрикс Управление сайтом» обновляет только статус заказа на сайте, но не передаёт изменения в CRM. Для полноценной синхронизации требуется написать собственный обработчик.
Архитектура решения
Наше решение основано на двух ключевых элементах:
1. Событие OnSaleOrderStatusChange — срабатывает при изменении статуса заказа в 1С-Битрикс.
2. REST API Битрикс24 — позволяет обновлять данные сделки удалённо через вебхук.
Связь заказа и сделки хранится в поле ORIGIN_ID, которое является идентификатором элемента во внешней системе.
Пошаговая реализация
Шаг 1. Настройка вебхука в Битрикс24
Для работы с API необходимо создать вебхук с правами на чтение и обновление сделок:
1. Зайдите в Битрикс24 → Настройки → Интеграции → Вебхуки.
2. Создайте новый вебхук.
3. В правах выберите:
- crm.deal.list — для поиска сделки по ID заказа
- crm.deal.update — для обновления сделки
4. Скопируйте полученный URL — он понадобится в коде.
Шаг 2. Подготовка файла init.php
Модуль PayKeeper требует подключения обработчика событий для полноценной работы. Откройте файл /local/php_interface/init.php (или /bitrix/php_interface/init.php) и добавьте строку:
include_once $_SERVER["DOCUMENT_ROOT"] . '/bitrix/modules/sale/handlers/paysystem/paykeeper/eventhandler.php';
Это обязательное условие для корректной работы модуля.
Шаг 3. Код обработчика события
Вот готовый обработчик, который при изменении статуса заказа на «Оплачен» обновляет соответствующую сделку:
<?php
/**
* Обработчик события смены статуса заказа
* При изменении статуса на "Оплачен" обновляет сделку в Битрикс24
*/
AddEventHandler("sale", "OnSaleOrderStatusChange", "UpdateBitrix24DealOnPay");
function UpdateBitrix24DealOnPay($ID, $event)
{
// НАСТРОЙТЕ ЭТИ ПАРАМЕТРЫ
$webhookUrl = 'https://ваш_битрикс24.bitrix24.ru/rest/1/ваш_вебхук/';
// Что менять в сделке при оплате
$updateFields = [
'STAGE_ID' => 'WON', // Меняем стадию на "Успешно завершена"
'UF_CRM_ПОЛЕ_ОПЛАТЫ' => 'Y' // Отметка об оплате
];
// Проверяем, что статус изменился на "Оплачен" (F)
if ($event->getNewValue() !== "F") {
return;
}
$orderId = $ID;
// Логируем начало обработки
file_put_contents($_SERVER["DOCUMENT_ROOT"] . "/bx24_sync.log",
date('Y-m-d H:i:s') . " - Заказ #$orderId: статус изменен на 'Оплачен'\n",
FILE_APPEND);
// --- Шаг 1: Ищем сделку по ORIGIN_ID ---
$result = callRest($webhookUrl . 'crm.deal.list', [
'filter' => ['ORIGIN_ID' => (string)$orderId],
'select' => ['ID', 'TITLE', 'STAGE_ID']
]);
if (isset($result['error'])) {
file_put_contents($_SERVER["DOCUMENT_ROOT"] . "/bx24_sync.log",
date('Y-m-d H:i:s') . " - Ошибка поиска: " . $result['error_description'] . "\n",
FILE_APPEND);
return;
}
if (empty($result['result'])) {
file_put_contents($_SERVER["DOCUMENT_ROOT"] . "/bx24_sync.log",
date('Y-m-d H:i:s') . " - Сделка для заказа #$orderId не найдена\n",
FILE_APPEND);
return;
}
$dealId = $result['result'][0]['ID'];
// --- Шаг 2: Обновляем сделку ---
$updateResult = callRest($webhookUrl . 'crm.deal.update', [
'id' => $dealId,
'fields' => $updateFields
]);
if (isset($updateResult['error'])) {
file_put_contents($_SERVER["DOCUMENT_ROOT"] . "/bx24_sync.log",
date('Y-m-d H:i:s') . " - Ошибка обновления #$dealId: " . $updateResult['error_description'] . "\n",
FILE_APPEND);
return;
}
file_put_contents($_SERVER["DOCUMENT_ROOT"] . "/bx24_sync.log",
date('Y-m-d H:i:s') . " - ✅ Сделка #$dealId успешно обновлена!\n",
FILE_APPEND);
}
/**
* Вспомогательная функция для выполнения REST-запросов
*/
function callRest($url, $params = [])
{
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_POST => 1,
CURLOPT_HEADER => 0,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => $url,
CURLOPT_POSTFIELDS => http_build_query($params),
]);
$response = curl_exec($curl);
curl_close($curl);
return json_decode($response, true);
}
?>
Ключевые моменты кода:
- OnSaleOrderStatusChange — событие, которое срабатывает при смене статуса заказа.
- Поиск сделки ведётся по полю ORIGIN_ID, которое хранит ID заказа из интернет-магазина.
- callRest — универсальная функция для отправки REST-запросов.
- Логирование помогает отлаживать работу обработчика в файле /bx24_sync.log.
Шаг 4. Тестирование
Перед внедрением в продакшен обязательно протестируйте:
1. Создайте тестовый заказ на сайте.
2. Проверьте, что в сделке заполнено поле ORIGIN_ID (должен быть ID заказа).
3. Измените статус заказа на «Оплачен» через админку.
4. Проверьте лог-файл /bx24_sync.log на наличие ошибок.
5. Убедитесь, что в сделке обновились нужные поля.
Возможные проблемы и их решение
Проблема: Файл init.php не подключается
Решение: Проверьте, что файл лежит в /local/php_interface/ или /bitrix/php_interface/
Проблема: Сделка не найдена
Решение: Убедитесь, что в сделке заполнено поле ORIGIN_ID — именно по нему ведётся поиск
Проблема: Статус не меняется на «Оплачен»
Решение: Проверьте настройки модуля PayKeeper: выберите нужный статус в поле «Статус заказа после оплаты»
Проблема: Ошибка авторизации вебхука
Решение: Проверьте права вебхука: нужны crm.deal.list и crm.deal.update
Заключение
Мы разобрали, как настроить автоматическую синхронизацию статуса оплаты из 1С-Битрикс в сделки Битрикс24. Решение использует стандартное событие OnSaleOrderStatusChange и REST API, что делает его надёжным и гибким для дальнейшей доработки.
При правильной настройке менеджеры больше не будут тратить время на ручную проверку оплат — сделки будут обновляться автоматически в момент изменения статуса заказа.
