Подготавливаем страницу…
Подготавливаем страницу…
Два варианта: PHP-хук (server-side, безопасно) или JS-событие (если нет доступа к коду темы). Объясняем где найти functions.php, как добавить чекбокс согласия, как проверить.
sk_ живёт на сервере, нельзя угнать из браузераpk_ + Origin whitelistПрочитайте один раз — дальше в инструкции эти слова уже не будут пугать.
Для PHP-хука нужен sk_, для JS — pk_.
Зайдите на lk.v2.1opd.ru/lk/integrations под логином от менеджера 1ОПД. В разделе «Интеграция» найдите карточку вашего сайта.
form_id формы, под которую интегрируетесь.sk_ в JS-код или footer.php — этот ключ уйдёт в браузер посетителя и его смогут использовать для подделки записей. Для JS — только pk_.Без IP whitelist'а sk_ ключ принять не будет.
1ОПД должен знать «с какого IP может приходить запрос с этим sk_». Иначе даже правильный ключ будет отклонён. IP — это адрес вашего хостинг-сервера.
curl ifconfig.me — вы получите ваш внешний IP.Это основной файл темы, где живут «обработчики событий».
Лучший способ — через child-тему (не потеряете изменения при обновлении). Если её нет — можно прямо в основной теме или через плагин «Code Snippets» (он сохраняет код вне темы).
functions.php.Для Contact Form 7 — хук wpcf7_before_send_mail.
Скопируйте код ниже, добавьте в самый конец вашего functions.php (или в новый сниппет «Code Snippets»). Замените 3 места: sk_xxxx → ваш ключ, form_id 1 → ваш, your-email → name поля email вашей формы CF7.
<?php
// functions.php в вашей теме (или mu-plugin / Code Snippets).
// Срабатывает ПЕРЕД отправкой письма из Contact Form 7.
//
// Multi-form: один sk_ ключ обслуживает обе цели обработки (основное согласие
// + маркетинг). На каждую поставленную галочку шлём отдельный POST со своим
// form_id. У ключа в ЛК 1ОПД должно быть forms_scope=[1, 2].
add_action('wpcf7_before_send_mail', function ($contact_form) {
$submission = WPCF7_Submission::get_instance();
if (!$submission) return;
$data = $submission->get_posted_data();
// ── НАСТРОЙКИ ────────────────────────────────────────────────────────
$api_key = 'sk_xxxxxxxxxxxxxxxxxxxx'; // ← ваш sk_ ключ из ЛК 1ОПД
$email = $data['your-email'] ?? ''; // ← name поля email в CF7
// Соответствие: имя acceptance-чекбокса в CF7 → form_id в 1ОПД
$consent_form_ids = [
'opd_consent' => 1, // основное согласие на ПДн (обязат.)
'opd_consent_marketing' => 2, // маркетинговая рассылка (опц.)
];
// ─────────────────────────────────────────────────────────────────────
if ($email === '') return; // без email субъект не идентифицируется
// Поля для отправки — все кроме служебных acceptance-чекбоксов.
$skip_keys = array_keys($consent_form_ids);
$payload_fields = [];
foreach ($data as $k => $v) {
if (in_array($k, $skip_keys, true)) continue;
if (is_array($v)) $v = implode(',', $v);
$payload_fields[] = ['field' => $k, 'value' => (string) $v];
}
foreach ($consent_form_ids as $checkbox_name => $form_id) {
// CF7 [acceptance] передаёт '1' (отмечено) или пусто (не отмечено).
$is_checked = !empty($data[$checkbox_name]);
if (!$is_checked) continue;
wp_remote_post('https://app.1opd.ru/api/v2/create-agreement', [
'headers' => [
'API-KEY' => $api_key,
'Content-Type' => 'application/json',
],
'body' => wp_json_encode([
'form_id' => $form_id,
'hash_field' => $email,
'fields' => $payload_fields,
]),
'timeout' => 5,
'blocking' => false, // не блокируем отправку письма CF7
]);
}
}, 10, 1); [email* your-email]. your-email и есть name. Часто бывает email или your-email.Если нет доступа к PHP — JS-вариант ставится за минуту.
Установите плагин «Insert Headers and Footers» (бесплатный). После активации: Настройки → Insert Headers and Footers → раздел «Scripts in Footer».
<script>
// CF7 диспатчит wpcf7mailsent после успешной отправки.
// Multi-form: один pk_ ключ → N форм согласия (forms_scope=[1,2,…]).
document.addEventListener('wpcf7mailsent', function (e) {
var data = {};
e.detail.inputs.forEach(function (i) { data[i.name] = i.value; });
var OPD_KEY = 'pk_xxxxxxxxxxxxxxxxxxxx'; // ← ваш pk_ ключ
var OPD_API = 'https://app.1opd.ru/api/v2/create-agreement';
var FORM_IDS = {
opd_consent: 1, // основное согласие
opd_consent_marketing: 2, // маркетинг (опц.)
};
var skipKeys = Object.keys(FORM_IDS);
var fields = Object.entries(data)
.filter(function (p) { return skipKeys.indexOf(p[0]) === -1; })
.map(function (p) { return { field: p[0], value: String(p[1]) }; });
function sendConsent(formId) {
return fetch(OPD_API, {
method: 'POST',
headers: { 'API-KEY': OPD_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({
form_id: formId,
hash_field: data['your-email'],
fields: fields,
}),
});
}
if (data['opd_consent']) sendConsent(FORM_IDS.opd_consent);
if (data['opd_consent_marketing']) sendConsent(FORM_IDS.opd_consent_marketing);
}, false);
</script> https://mywp.ru и https://www.mywp.ru.wpcf7mailsent работает только для CF7. Для WPForms и других плагинов JS-варианта нет — нужно использовать Способ A (PHP) или их собственные хуки.Если у вас WPForms вместо CF7, используйте wpforms_process_complete.
WPForms имеет свой набор PHP-хуков. Добавьте этот код в functions.php (вместо или вместе с CF7-вариантом, если у вас обе формы):
<?php
// WPForms — хук wpforms_process_complete. Multi-form, один sk_ ключ.
add_action('wpforms_process_complete', function ($fields, $entry, $form_data, $entry_id) {
$api_key = 'sk_xxxxxxxxxxxxxxxxxxxx'; // ← ваш sk_ ключ
// form_id в 1ОПД зависит от ID формы WPForms (form_data['id']).
$form_id_map = [
// WPForms ID => form_id в ЛК 1ОПД
7 => 1, // подписка
12 => 2, // маркетинг
];
$form_id = $form_id_map[(int) $form_data['id']] ?? null;
if (!$form_id) return; // эту форму в 1ОПД не пишем
$email = '';
$payload_fields = [];
foreach ($fields as $f) {
if ($f['type'] === 'email') $email = $f['value'];
$payload_fields[] = ['field' => $f['name'], 'value' => (string) $f['value']];
}
if ($email === '') return;
wp_remote_post('https://app.1opd.ru/api/v2/create-agreement', [
'headers' => [
'API-KEY' => $api_key,
'Content-Type' => 'application/json',
],
'body' => wp_json_encode([
'form_id' => $form_id,
'hash_field' => $email,
'fields' => $payload_fields,
]),
'timeout' => 5,
'blocking' => false,
]);
}, 10, 4); Пользователь должен явно согласиться. Без этого 152-ФЗ нарушается.
В Contact Form 7 есть специальный тег [acceptance]. Откройте форму CF7 → в редакторе вставьте такой шорткод (он создаст чекбокс с ссылками на ваши документы):
[acceptance opd_consent default:0]
Даю согласие на обработку персональных данных в соответствии с
<a href="https://app.1opd.ru/public/d/<your-slug>/<client-id>/privacy_policy" target="_blank">Политикой обработки персональных данных</a>.
[/acceptance]
[acceptance opd_consent_marketing default:0 optional]
Даю согласие на получение информационной и рекламной рассылки.
[/acceptance] [acceptance ...] и [/acceptance].3 пути убедиться: ЛК 1ОПД / WP-лог / DevTools.
Отправьте тестовую заявку через свою форму с реальным email-ом. Затем проверяйте по очереди.
wp-content/debug.log. Должны быть HTTP-логи запросов на app.1opd.ru. Включить лог: в wp-config.php поставить define('WP_DEBUG_LOG', true);.app.1opd.ru/api/v2/create-agreement → должно быть 200 OK.Самые частые проблемы и что с ними делать. Решает 95% случаев.
1. Через FTP или хостинг-панель откройте wp-content/themes/ВАША-ТЕМА/functions.php
2. Удалите вставленный код (вернитесь к backup'у из шага 03).
3. Сайт оживёт. Затем найдите ошибку — чаще всего пропущенная скобка или точка с запятой.
Лучше использовать Code Snippets — там код проверяется до сохранения, без риска положить весь сайт.
1. Проверьте IP whitelist: в ЛК → ключ → блок «IP-whitelist» — там должен быть IP вашего сервера.
2. Включите WP_DEBUG_LOG и посмотрите wp-content/debug.log — там должны быть строки про wp_remote_post.
3. Проверьте что your-email в коде совпадает с name поля email в CF7 (часто бывает email вместо your-email).
Свяжитесь с хостингом и попросите разрешить исходящие HTTPS-соединения с вашего сервера. Часто провайдеры включают это бесплатно при запросе.
Альтернатива: переключитесь на JS-вариант (Способ B) — он работает из браузера, хостинг тут ни при чём.
1. Проверьте что ключ скопирован полностью (sk_ начинается с sk_ и длиной 30+ символов).
2. Убедитесь что для PHP вы используете sk_, для JS — pk_.
3. Свяжитесь с менеджером 1ОПД — он проверит что ключ активен.
Запустите на сервере curl ifconfig.me — получите внешний IP. В ЛК 1ОПД → ключ → IP-whitelist → добавьте этот IP. Подтвердите паролем.
Если у вашего хостинга несколько исходящих IP — добавьте их все.
В коде обработчика — установите 'blocking' => false в массиве опций wp_remote_post. Тогда запрос в 1ОПД пойдёт асинхронно и не сломает отправку формы.
Или оберните вызов в try/catch — если 1ОПД временно недоступен, форма всё равно отправится.
Альтернативные плагины с тем же функционалом:
Откройте ЛК → «Интеграция»: персональные snippet'ы + готовый HTML-чекбокс с авто-ссылками на согласие и политику + кнопка «IP-whitelist» для каждого ключа.
Открыть ЛК →Запросите тестовый доступ — выдаём ключ под ваш домен и помогаем подключиться.
Связаться →Все endpoints, коды ошибок, форматы HMAC/Origin/IP. Таблица «какую защиту выбрать».
Открыть →