Как создать уникальный OTP телефоный верификатор для WordPress

Верификация пользователей по телефону через OTP (One-Time Password) — востребованная функция в современных сайтах WordPress, особенно если вы хотите повысить безопасность регистрации или подтверждения действий. В этой статье мы подробно разберем, как создать собственный плагин для отправки и проверки одноразового пароля по SMS, используя API популярных SMS-сервисов и лучшие практики WordPress разработки.

Что такое OTP и зачем он нужен в WordPress

OTP — это одноразовый пароль, который генерируется для подтверждения личности пользователя. Обычно он действителен несколько минут и отправляется на номер телефона пользователя. В WordPress OTP применяется для:

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

Использование OTP повышает уровень безопасности и уменьшает риск мошенничества.

Выбор SMS-провайдера и интеграция с API

Для отправки SMS с кодом OTP вам понадобится SMS-сервис. Популярные варианты:

  • Twilio — универсальный и удобный API
  • Infobip — мощный сервис с глобальным охватом
  • SMSC.ru — российский SMS-провайдер с простым API

Для примера возьмем Twilio, но вы можете адаптировать код под любой сервис.

Подключение Twilio SDK в WordPress плагине

Установите библиотеку Twilio через Composer или вручную. В плагине подключите автозагрузчик:

require_once plugin_dir_path(__FILE__) . 'vendor/autoload.php';
use Twilio\Rest\Client;

Создайте функцию для отправки SMS с OTP:

function wpplugin_send_otp_sms($phone, $otp) {
    $sid = 'ВАШ_TWILIO_SID';
    $token = 'ВАШ_TWILIO_TOKEN';
    $client = new Client($sid, $token);
    try {
        $client->messages->create(
            $phone,
            [
                'from' => 'ВАШ_TWILIO_НОМЕР',
                'body' => 'Ваш код подтверждения: ' . $otp
            ]
        );
        return true;
    } catch (Exception $e) {
        error_log('Ошибка отправки OTP: ' . $e->getMessage());
        return false;
    }
}

Генерация и хранение OTP в WordPress

Для безопасной работы OTP нужно:

  • Генерировать случайный 6-значный код
  • Сохранять код и время создания в базе данных
  • Устанавливать срок действия кода (обычно 5–10 минут)

Можно использовать метаполя пользователя или собственную таблицу.

Пример функции генерации и сохранения OTP в user meta

function wpplugin_generate_and_save_otp($user_id) {
    $otp = rand(100000, 999999);
    update_user_meta($user_id, '_wpplugin_otp_code', $otp);
    update_user_meta($user_id, '_wpplugin_otp_time', time());
    return $otp;
}

Проверка кода с учетом времени:

function wpplugin_verify_otp($user_id, $otp_input) {
    $otp = get_user_meta($user_id, '_wpplugin_otp_code', true);
    $otp_time = get_user_meta($user_id, '_wpplugin_otp_time', true);
    if (!$otp || !$otp_time) {
        return false;
    }
    $valid_duration = 10 * 60; // 10 минут
    if (time() - $otp_time > $valid_duration) {
        return false; // Код просрочен
    }
    return $otp_input == $otp;
}

Добавление формы ввода телефона и OTP

Чтобы пользователь мог ввести номер телефона и получить OTP, создадим короткий шорткод, который выводит форму:

function wpplugin_otp_form_shortcode() {
    ob_start();
    if (!empty($_POST['wpplugin_phone'])) {
        $phone = sanitize_text_field($_POST['wpplugin_phone']);
        $user_id = get_current_user_id();
        if (!$user_id) {
            echo '<p>Пожалуйста, войдите в аккаунт для подтверждения телефона.</p>';
        } else {
            $otp = wpplugin_generate_and_save_otp($user_id);
            if (wpplugin_send_otp_sms($phone, $otp)) {
                echo '<p>Код отправлен на номер ' . esc_html($phone) . '</p>';
                echo wpplugin_otp_verify_form();
            } else {
                echo '<p>Ошибка при отправке кода. Попробуйте позже.</p>';
            }
        }
    } else {
        ?>
        <form method="post">
            <label>Введите номер телефона:</label>
            <input type="text" name="wpplugin_phone" required>
            <input type="submit" value="Получить код">
        </form>
        <?php
    }
    return ob_get_clean();
}
add_shortcode('wpplugin_otp_form', 'wpplugin_otp_form_shortcode');

Форма для ввода OTP после отправки кода:

function wpplugin_otp_verify_form() {
    return '<form method="post">
        <label>Введите код из SMS:</label>
        <input type="text" name="wpplugin_otp_code" required>
        <input type="submit" name="wpplugin_verify" value="Подтвердить">
    </form>';
}

Обработка проверки OTP и вывод результата

Добавим обработку проверки кода после отправки формы:

function wpplugin_handle_otp_verification() {
    if (!empty($_POST['wpplugin_verify'])) {
        $user_id = get_current_user_id();
        $otp_input = sanitize_text_field($_POST['wpplugin_otp_code']);
        if (wpplugin_verify_otp($user_id, $otp_input)) {
            echo '<p style="color:green;">Телефон успешно подтверждён!</p>';
            // Здесь можно записать статус подтверждения в user meta
            update_user_meta($user_id, '_wpplugin_phone_verified', 1);
        } else {
            echo '<p style="color:red;">Неверный или просроченный код.</p>';
            echo wpplugin_otp_verify_form();
        }
    }
}
add_action('wp_footer', 'wpplugin_handle_otp_verification');

Защита и лучшие практики реализации OTP

Чтобы ваш механизм верификации работал корректно и безопасно, учтите следующие рекомендации:

  • Ограничьте количество попыток ввода OTP для предотвращения перебора
  • Используйте nonce и проверку прав пользователя при обработке форм
  • Храните OTP только временно и очищайте после проверки или истечения срока
  • Поддерживайте корректный формат номера телефона, используя библиотеки или регулярные выражения
  • Информируйте пользователя о времени действия кода

Для контроля попыток можно хранить счетчик в user meta и блокировать повторные запросы в течение короткого времени.

Альтернативные решения и готовые плагины

Если хотите сэкономить время, рассмотрите готовые решения:

  • WPGPT — плагин с расширенными возможностями по работе с пользователями и верификацией
  • miniOrange OTP Verification — популярный плагин для подтверждения телефона и email

Но если вам нужна кастомизация под свой бизнес-процесс, создание собственного решения — лучший вариант.

Итоги

Создание собственного плагина для OTP верификации телефона в WordPress — задача вполне решаемая с помощью стандартных инструментов WP и API SMS-сервисов. Такой подход дает гибкость, безопасность и полный контроль над процессом. В статье приведены примеры кода для генерации, отправки и проверки OTP, а также рекомендации по защите и интеграции.

Как использовать хуки и фильтры в создании плагинов WordPress
30.12.2025
Как создать автозаполняемый формат данных в WordPress для удобного ввода
05.02.2026
Как правильно удалить оставшиеся заказы WooCommerce без ошибок
09.06.2026
Как добавить поддержку многоязычности в своем WordPress плагине
13.12.2025
Создать собственный шорткод WordPress с поддержкой параметров
05.11.2025