WooCommerce: авторизация по телефону без SMS-провайдеров

Проблема: необходимость авторизации по телефону без использования SMS-провайдеров

В стандартных решениях WooCommerce и WordPress для авторизации по телефону часто используется отправка SMS с кодом подтверждения от сторонних провайдеров. Это повышает стоимость и сложность настройки, а также вызывает задержки и зависимость от сторонних сервисов. Задача — реализовать авторизацию по телефону без реальной отправки SMS, например, используя одноразовые коды, генерируемые и проверяемые локально, или альтернативные методы подтверждения, чтобы упростить процесс и снизить издержки.

Диагностика проблемы

Перед реализацией важно понять, почему именно SMS-провайдеры не подходят:

  • Высокая стоимость SMS
  • Проблемы с доставкой сообщений
  • Зависимость от сторонних сервисов
  • Необходимость работать в условиях отсутствия интернета или ограничений мобильной связи

Если ваша цель — протестировать авторизацию по телефону на этапе разработки или обеспечить локальную двухфакторную аутентификацию, лучше использовать альтернативные методы.

Пошаговое решение: реализация авторизации по телефону без SMS-провайдеров

1. Добавляем поле телефона на страницу входа и регистрации

function wc_add_phone_field() {
    woocommerce_form_field( 'billing_phone', array(
        'type'          => 'tel',
        'required'      => true,
        'label'         => __('Телефон'),
        'placeholder'   => __('Введите номер телефона'),
        'class'         => array('form-row-wide'),
        'priority'      => 22,
    ), '');
}
add_action( 'woocommerce_register_form_start', 'wc_add_phone_field' );
add_action( 'woocommerce_login_form_start', 'wc_add_phone_field' );

2. Генерируем одноразовый код и сохраняем его в сессии (без реального SMS)

function wc_generate_otp_code() {
    return wp_rand(100000, 999999);
}

function wc_store_otp_code() {
    if ( ! session_id() ) {
        session_start();
    }
    $_SESSION['wc_otp_code'] = wc_generate_otp_code();
}
add_action('woocommerce_login_form', 'wc_store_otp_code');

В реальном решении код можно показывать на странице или отправлять альтернативным способом (например, email). В данном случае код хранится в сессии для проверки.

3. Добавляем поле для ввода OTP-кода

function wc_add_otp_field() {
    woocommerce_form_field( 'otp_code', array(
        'type'          => 'text',
        'required'      => true,
        'label'         => __('Код подтверждения'),
        'placeholder'   => __('Введите код'),
        'class'         => array('form-row-wide'),
        'priority'      => 25,
    ), '');
}
add_action( 'woocommerce_login_form', 'wc_add_otp_field' );

4. Проверяем введённый OTP-код при попытке входа

function wc_validate_otp_code( $username ) {
    if ( ! session_id() ) {
        session_start();
    }
    if ( isset($_POST['otp_code'], $_SESSION['wc_otp_code']) ) {
        if ( $_POST['otp_code'] !== strval($_SESSION['wc_otp_code']) ) {
            return new WP_Error( 'authentication_failed', __('Неверный код подтверждения.')); 
        }
    } else {
        return new WP_Error( 'authentication_failed', __('Код подтверждения обязателен.')); 
    }
    return $username;
}
add_filter( 'authenticate', 'wc_validate_otp_code', 30, 1 );

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

  • Откройте страницу входа WooCommerce.
  • Введите номер телефона и нажмите войти.
  • Убедитесь, что сессия создаётся и в ней хранится одноразовый код (можно временно вывести его на экран для теста).
  • Введите правильный код OTP — вход должен пройти успешно.
  • Введите неправильный код — появится ошибка «Неверный код подтверждения».

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

  • Ошибка: Код подтверждения не сохраняется в сессии.
    Причина: Сессия не стартовала или отключена сервером.
    Решение: Добавьте session_start() в начале хуков и проверьте настройки PHP.
  • Ошибка: Поля телефона или OTP не отображаются на форме.
    Причина: Неправильный хук или приоритет.
    Решение: Используйте хуки woocommerce_register_form_start и woocommerce_login_form с приоритетом по умолчанию.
  • Ошибка: Пользователь может войти без ввода кода.
    Причина: Проверка OTP не применяется.
    Решение: Убедитесь, что фильтр authenticate добавлен с приоритетом выше 20 (после проверки имени пользователя и пароля).

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

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

Сравнение вариантов реализации авторизации по телефону без SMS-провайдеров

МетодПлюсыМинусы
Одноразовые коды в сессии (локально)Быстрая настройка, нет зависимости от сервисовНе подходит для реального подтверждения, подходит только для тестов
Отправка кода на EmailИспользуется существующий канал, бесплатенЗадержка доставки, нужен email у пользователя
Генерация QR-кода с временным токеномСовременно, можно интегрировать с приложениямиСложнее реализовать, требует клиентского ПО
WordPress регистрация без подтверждения Email: как реализовать и зачем это нужно
30.03.2026
WordPress авторизация через REST API с токеном для приватной сети
19.03.2026
WordPress авторизация по OTP без SMS: настройка и примеры кода
10.02.2026
WooCommerce: авторизация по телефону без SMS-провайдеров
26.06.2026
WordPress автоматическая смена пароля при первом входе
14.01.2026