Подготавливаем страницу…
Подготавливаем страницу…
Подходит для 1С-Битрикс CMS (веб-формы) и Bitrix24 (CRM-лиды). Ниже: где найти init.php, как узнать ID веб-формы и как проверить, что согласие записалось.
sk_ (secret, только server-side) forms_scope=[id1, id2, …] , и в каждом запросе передаёте form_id в body.Ключ создаёт менеджер 1ОПД и передаёт вам один раз. Все endpoints → API Reference
Прочитайте один раз: дальше в инструкции эти слова уже не будут пугать.
Без ключа сервер Bitrix не запишет ни одного согласия.
Откройте lk.v2.1opd.ru/lk/integrations и найдите карточку своего сайта. Скопируйте ключ sk_ и запишите form_id.
Со списком адресов 1ОПД пропустит sk_ только с них.
Bitrix обычно стоит на VPS или выделенном сервере. Дальше два пути, в зависимости от наличия SSH-доступа.
curl ifconfig.me, команда вернёт внешний IP.Обработчик должен знать, какую форму перехватывать.
В админке Bitrix откройте «Сервисы → Веб-формы → Список»: там перечислены формы с их ID.
7 для «Подписки на рассылку».Файл выполняется при каждом запросе, поэтому хук ставят сюда.
Подключитесь к серверу через FTP, SSH или панель хостинга и найдите файл /bitrix/php_interface/init.php.
?>, если он там есть (в большинстве файлов его нет).<?php и вставьте код ниже./bitrix/ лучше не трогать: используйте /local/php_interface/init.php. Bitrix грузит его автоматически, и обновление ядра его не затирает.Событие срабатывает после успешной отправки веб-формы.
Вставьте код в init.php и замените 3 места: ID веб-формы Bitrix (!== 7), form_id из ЛК 1ОПД и ключ sk_.
<?php
// /bitrix/php_interface/init.php (или /local/php_interface/init.php).
// Multi-form: один sk_ ключ обслуживает N веб-форм Bitrix. У ключа в ЛК
// 1ОПД должно быть forms_scope=[1, 2, …] со всеми form_id, в которые
// этот ключ может писать.
use Bitrix\Main\EventManager;
EventManager::getInstance()->addEventHandler(
'form',
'onAfterResultAdd',
function ($webFormId, $resultId) {
// ── НАСТРОЙКИ ────────────────────────────────────────────────────
$api_key = 'sk_xxxxxxxxxxxxxxxxxxxx'; // ← ваш sk_ ключ из ЛК 1ОПД
// Маппинг: ID веб-формы Bitrix → form_id в ЛК 1ОПД.
// ID Bitrix-формы видно в админке "Сервисы → Веб-формы → Список".
$form_id_map = [
7 => 1, // веб-форма #7 «Подписка» → форма согласия #1
12 => 2, // веб-форма #12 «Маркетинг» → форма согласия #2
];
// ─────────────────────────────────────────────────────────────────
$form_id = $form_id_map[(int) $webFormId] ?? null;
if (!$form_id) return; // этой формы в 1ОПД нет
$rs = CFormResult::GetDataByID($resultId, [], $arRes, $arRes2);
$fields = [];
$email = '';
foreach ($arRes as $code => $info) {
$value = is_array($info) ? reset($info)['USER_TEXT'] ?? '' : $info;
$fields[] = ['field' => $code, 'value' => (string) $value];
if (stripos($code, 'email') !== false) $email = (string) $value;
}
if ($email === '') return; // без email субъект не идентифицируется
$payload = json_encode([
'form_id' => $form_id,
'hash_field' => $email,
'fields' => $fields,
], JSON_UNESCAPED_UNICODE);
$ch = curl_init('https://app.1opd.ru/api/v2/create-agreement');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $payload,
CURLOPT_HTTPHEADER => [
'API-KEY: ' . $api_key,
'Content-Type: application/json',
],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 5,
]);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// Логируем ошибку в Bitrix-журнал ("Настройки → Журнал событий").
// 200 — записано, 202 — принято в очередь (наш бэкенд временно недоступен,
// согласие запишется само). Оба — успех: сравнение с одним лишь 200 писало бы
// в журнал ошибку на успешно принятом согласии.
if ($http_code !== 200 && $http_code !== 202) {
CEventLog::Log('WARNING', '1OPD_API_ERROR', 'main', $webFormId,
"HTTP $http_code: $response");
}
}
); Вариант для лид-формы Bitrix24 вместо веб-формы CMS.
В Bitrix24 (CRM) другой набор событий. Обработчик срабатывает после создания лида:
<?php
// Bitrix24 CRM — событие "лид создан"
AddEventHandler('crm', 'OnAfterCrmLeadAdd', function ($arFields) {
$email = '';
if (!empty($arFields['FM']['EMAIL'])) {
$first = reset($arFields['FM']['EMAIL']);
$email = $first['VALUE'] ?? '';
}
$payload = json_encode([
'form_id' => 1,
'hash_field' => $email,
'fields' => [
['field' => 'email', 'value' => $email],
['field' => 'name', 'value' => (string) ($arFields['NAME'] ?? '')],
['field' => 'last_name', 'value' => (string) ($arFields['LAST_NAME'] ?? '')],
['field' => 'lead_id', 'value' => (string) ($arFields['ID'] ?? '')],
],
]);
// ↓ cURL как в первом примере, sk_ ключ
$ch = curl_init('https://app.1opd.ru/api/v2/create-agreement');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $payload,
CURLOPT_HTTPHEADER => [
'API-KEY: sk_xxxxxxxxxxxxxxxxxxxx',
'Content-Type: application/json',
],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 5,
]);
curl_exec($ch);
curl_close($ch);
}); В Bitrix CMS поле «Согласие» добавляют в настройках веб-формы.
В админке Bitrix → «Сервисы → Веб-формы» → ваша форма → «Вопросы» → «Добавить вопрос» → тип «Флажок (checkbox)». Основному согласию дайте имя opd_consent и признак «обязательное». Для отдельного согласия на маркетинг добавьте второй чекбокс opd_consent_marketing, необязательный.
Даю согласие на обработку персональных данных в соответствии с
<a href="https://app.1opd.ru/public/d/<slug>/<client-id>/privacy_policy" target="_blank">Политикой обработки персональных данных</a>. (Bitrix допускает HTML в названиях полей: включите «HTML в названии» в настройках формы.)Даю согласие на получение информационной и рекламной рассылки. Журнал Bitrix и раздел «Согласия» в ЛК 1ОПД.
Самые частые проблемы и что с ними делать. Решает 95% случаев.
1. Через FTP откройте init.php и восстановите его из копии.
2. Сайт заработает. Вставьте код повторно и проверьте частые ошибки: пропущенная скобка, лишняя точка с запятой, незакрытая кавычка.
3. На локальной машине прогоните проверку синтаксиса php -l init.php: она укажет строку с ошибкой.
1. Проверьте, что вставлен ID веб-формы Bitrix, а не form_id из 1ОПД.
2. В Bitrix → «Настройки → Журнал событий» найдите красные строки про свою форму.
3. Добавьте в хук перед curl_exec строку error_log('1opd payload: ' . $payload);: в журнале станет видно, что уходит в 1ОПД.
По SSH выполните curl ifconfig.me и запишите адрес. Затем ЛК 1ОПД → ключ → IP-whitelist → добавьте его и подтвердите паролем.
Полный ключ состоит из префикса sk_ и 64 hex-символов. Проверьте, что в строке API-KEY нет лишних пробелов и переводов строки, и попросите менеджера 1ОПД сверить статус ключа.
Откройте init.php, найдите все упоминания onAfterResultAdd и оставьте одно.
Проверьте и /local/php_interface/init.php: обработчик мог оказаться и там, и в /bitrix/php_interface/init.php.
Для облачного Bitrix24 нужны исходящие webhooks: «Приложения → Разработчикам → Исходящий вебхук на событие OnCrmLeadAdd» → URL вашего сервера. Дальше запрос в 1ОПД отправляет уже ваш сервер.
Второй путь: «Бизнес-процессы» или «Триггеры CRM», куда добавляют шаг «HTTP-запрос» с телом в формате 1ОПД.
Откройте ЛК → «Интеграция»: персональные snippet'ы + готовый HTML-чекбокс с авто-ссылками на согласие и политику + кнопка «IP-whitelist» для каждого ключа.
Открыть ЛК →Запросите тестовый доступ: выдаём ключ под ваш домен и помогаем подключиться.
Связаться →Все endpoints, коды ошибок, форматы HMAC/Origin/IP. Таблица «какую защиту выбрать».
Открыть →Успехом считаются и 200, и 202. Проверка «строго 200» отметит ошибкой согласие, которое 1ОПД принял и доставит.
В массиве fields передавайте любые из 28 полей ниже, имя поля стоит в столбце field. Обязательное одно: email, он же идентификатор субъекта (hash_field). Остальные 27 опциональны, незаполненное поле не передавайте. Все значения 1ОПД шифрует на своей стороне (AES-256-GCM). Актуальный список полей конкретной формы отдаёт POST /api/v2/get-fields.
| field | Название | Примечание |
|---|---|---|
email | Электронная почта | обязательное · идентификатор (hash_field) |
first_name | Имя | опциональное |
last_name | Фамилия | опциональное |
sur_name | Отчество | опциональное |
birth_date | Дата рождения | опциональное |
phone_number | Номер телефона | опциональное |
birth_place | Место рождения | опциональное |
registration_address | Адрес регистрации | опциональное |
delivery_address | Адрес доставки | опциональное |
passport_details | Паспортные данные | опциональное |
inn | ИНН | опциональное |
snils | СНИЛС | опциональное |
bank_details | Банковские реквизиты | опциональное |
account_vk | Аккаунт VK | опциональное |
account_telegram | Аккаунт Telegram | опциональное |
account_instagram | Аккаунт Instagram | опциональное |
account_facebook | Аккаунт Facebook | опциональное |
account_viber | Аккаунт Viber | опциональное |
account_ok | Аккаунт OK | опциональное |
account_whatsapp | Аккаунт WhatsApp | опциональное |
job_title | Должность | опциональное |
organization_name | Название организации | опциональное |
field_of_activity | Сфера деятельности | опциональное |
city | Город | опциональное |
mattermost_account | Аккаунт Mattermost | опциональное |
slack_account | Аккаунт Slack | опциональное |
ms_teams_account | Аккаунт MS Teams | опциональное |
sex | Пол | значения male / female · в карточках: «мужчина» / «женщина» |
Набор одинаков для всех способов интеграции (Tilda, WordPress, Bitrix, браузерный JS, server-side API). Каждое значение приходит строкой длиной до 5000 символов.