Почему важно подтверждать телефонные номера в формах 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 |