Contact Form 7: как добавить подтверждение телефонных номеров с OTP

Почему важно подтверждать телефонные номера в формах Contact Form 7

Подтверждение телефона с помощью одноразового пароля (OTP) повышает качество заявок и снижает спам. Это особенно актуально для форм обратной связи, регистрации и заказов, где важна достоверность контактов.

Диагностика: как понять, что подтверждение телефонов отсутствует или работает некорректно

  • Пользователи жалуются, что заявки приходят с неправдоподобными телефонами
  • Вы замечаете подозрительный рост спам-заявок с поддельными номерами
  • Форма принимает некорректные номера, из-за чего связаться с клиентом невозможно

Пошаговое решение: добавляем подтверждение телефона с OTP в Contact Form 7

1. Установка плагина для отправки SMS с OTP

Contact Form 7 не поддерживает OTP из коробки. Рекомендуется использовать плагин CF7 Smart SMS или любой другой проверенный плагин, который интегрируется с CF7 и позволяет отправлять OTP.

2. Настройка формы и добавление поля телефона

В редакторе Contact Form 7 добавьте поле телефона с обязательной валидацией:

[tel* your-phone placeholder "Введите телефон" pattern="\+?[0-9\s\-\(\)]{7,}"]

3. Добавление поля для ввода OTP

Добавьте дополнительное поле для кода подтверждения:

[text* otp-code placeholder "Введите код из SMS"]

4. Настройка отправки OTP при заполнении телефона

Это настраивается в плагине для SMS, обычно нужно указать шаблон и событие отправки. Если хотите сделать самостоятельно, можно использовать хук wpcf7_before_send_mail для генерации и отправки OTP через сторонний API. Например:

add_action('wpcf7_before_send_mail', function($contact_form) {
    $submission = WPCF7_Submission::get_instance();
    if (!$submission) return;

    $data = $submission->get_posted_data();
    $phone = $data['your-phone'] ?? '';
    $otp = rand(100000, 999999);

    // Сохраняем OTP в сессии или в пользовательском мета
    session_start();
    $_SESSION['cf7_otp'] = $otp;
    $_SESSION['cf7_phone'] = $phone;

    // Отправка SMS через API провайдера
    // Пример с использованием wp_remote_post
    $response = wp_remote_post('https://sms-api.example/send', [
        'body' => [
            'to' => $phone,
            'message' => "Ваш код подтверждения: $otp"
        ]
    ]);
});

5. Валидация введённого OTP

Для проверки кода используйте кастомную валидацию Contact Form 7:

add_filter('wpcf7_validate_text*', function($result, $tag) {
    $name = $tag->name;
    if ($name === 'otp-code') {
        $value = isset($_POST[$name]) ? trim($_POST[$name]) : '';
        session_start();
        if (!isset($_SESSION['cf7_otp']) || $value !== (string)$_SESSION['cf7_otp']) {
            $result->invalidate($tag, 'Неверный код подтверждения.');
        }
    }
    return $result;
}, 10, 2);

Проверка результата после внедрения

  • Отправьте форму с вашим номером — должно прийти SMS с OTP
  • Попробуйте ввести неправильный код — должна быть ошибка валидации
  • Введя правильный код — форма должна успешно отправиться
  • Проверьте логи плагина SMS и письма, чтобы убедиться, что всё работает

Частые ошибки и способы их исправления

  • Не приходит SMS: проверьте API ключ и настройки провайдера, убедитесь, что сервер может выполнять исходящие запросы
  • Код не сохраняется в сессии: убедитесь, что session_start() вызывается до вывода контента и не конфликтует с другими плагинами
  • Валидация OTP всегда не проходит: проверьте, что имя поля совпадает с тем, что указано в фильтре, и что сессия доступна
  • Форма отправляется без ввода OTP: используйте обязательное поле [text* otp-code] и кастомную валидацию

Практические советы по безопасности и производительности

  • Не храните OTP в базе данных без шифрования — лучше использовать сессии или transient с коротким временем жизни
  • Ограничьте количество попыток ввода OTP с одного IP, чтобы избежать перебора
  • Используйте HTTPS для защиты передачи данных формы и OTP
  • Кэширование страниц с формой отключите либо настройте исключения, чтобы не кэшировались динамические поля и сессии

Сравнение вариантов реализации подтверждения телефона с OTP

МетодПлюсыМинусыПример
Плагин CF7 Smart SMSГотовое решение, быстрый запускМожет быть платным, ограниченная кастомизацияСсылка
Своя реализация через API и хуки CF7Полный контроль, гибкостьТребует навыков PHP и работы с APIПример кода выше
Использование внешних сервисов (например, Twilio)Надежность, поддержка масштабированияДополнительные расходы, сложность интеграцииWP HTTP API + Twilio SDK

Добавь в закладки и поделись с друзьями:

⭐⭐⭐⭐⭐
Contact Form 7: как реализовать авторизацию пользователя через форму на основе PHP сессий
29.04.2026
Contact Form 7 и отправка данных в 1С через Webhook: практическое руководство
08.02.2026
Contact Form 7: динамические поля с подгрузкой данных из JSON файла
10.04.2026
Contact Form 7: вставка и обработка поля с Google Maps в форме WordPress
29.03.2026
Contact Form 7: как избежать потери данных при перезагрузке страницы
23.04.2026
×
WordPress
дай сайту суперсилу!

Скидки на топовые темы и плагины

Активировать суперсилу ⋙