Подготавливаем страницу…
Подготавливаем страницу…
Два варианта: PHP-хук на стороне сервера либо 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. Внесите в whitelist адрес хостинг-сервера: тогда украденный ключ перестанет работать откуда-либо ещё.
curl ifconfig.me и получите внешний IP.Основной файл темы, где размещают обработчики событий.
Надёжнее всего работать через child-тему: правка переживёт обновление. Если 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]. Вторая часть тега и есть name, чаще всего email или your-email.Вариант для случая, когда доступа к PHP нет.
Установите бесплатный плагин «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); Согласие субъект даёт явным действием (ст. 9 ч. 1 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].Три места проверки: ЛК 1ОПД, WP-лог, DevTools.
Отправьте тестовую заявку через форму с реальным адресом почты, затем пройдите проверки по очереди.
wp-content/debug.log, там будут HTTP-логи запросов на app.1opd.ru. Лог включает строка define('WP_DEBUG_LOG', true); в wp-config.php.app.1opd.ru/api/v2/create-agreement. Приём означают 200 и 202.Самые частые проблемы и что с ними делать. Решает 95% случаев.
1. Через FTP или панель хостинга откройте wp-content/themes/ВАША-ТЕМА/functions.php
2. Удалите вставленный код и верните копию из шага 03.
3. Сайт заработает. Дальше ищите ошибку: чаще всего это пропущенная скобка или точка с запятой.
Надёжнее работать через Code Snippets: код там проверяется до сохранения, и риска положить весь сайт нет.
1. Проверьте IP whitelist: в ЛК → ключ → блок «IP-whitelist» должен содержать адрес сервера, если список не пуст.
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_ состоит из префикса и 64 hex-символов, pk_ из префикса и 48.
2. Убедитесь, что для PHP взят sk_, а для JS pk_.
3. Попросите менеджера 1ОПД проверить, что ключ активен.
Выполните на сервере curl ifconfig.me и получите внешний IP. Затем ЛК 1ОПД → ключ → IP-whitelist → добавьте этот адрес и подтвердите паролем.
Если у хостинга несколько исходящих адресов, внесите все.
Поставьте в массиве опций wp_remote_post значение 'blocking' => false: тогда запрос в 1ОПД уйдёт асинхронно и не сломает отправку формы.
Второй вариант: обернуть вызов в try/catch, тогда форма уйдёт и при недоступности 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 символов.