WooCommerce авторизация через SMS без использования SMS-провайдеров: практическое решение

Диагностика проблемы: почему стандартные SMS-провайдеры не всегда подходят

Для многих онлайн-магазинов на WooCommerce настройка авторизации через SMS — важный шаг для повышения безопасности и удобства. Обычно для этого используют платные SMS-провайдеры (Twilio, Nexmo, etc.). Но что делать, если бюджет ограничен, или провайдер недоступен в регионе? В таких случаях можно реализовать авторизацию через SMS, используя альтернативные методы, без подключения к внешним SMS API.

Основная проблема — как отправить и проверить SMS-код без платных сервисов, ведь WordPress и WooCommerce из коробки не поддерживают такую функциональность.

Пошаговое решение: реализация SMS-подтверждения через Email-to-SMS шлюз и кастомный код

1. Использование Email-to-SMS шлюзов операторов сотовой связи

Большинство операторов предоставляют адреса для отправки SMS через email, например, номер_телефона@operator_sms_gateway.com. Это позволяет отправлять SMS бесплатно через email-сервисы.

Минус — операторская специфичность и необходимость знать формат адреса для каждого оператора.

2. Создание кастомного плагина для WooCommerce

Реализуем отправку кода подтверждения через email-to-SMS и проверку кода при авторизации.

<?php
/**
 * Plugin Name: WooCommerce SMS Auth Without Provider
 * Description: Авторизация через SMS с использованием Email-to-SMS шлюза.
 * Version: 1.0
 * Author: Ваше Имя
 */

add_action('woocommerce_login_form_start', 'wpa_sms_auth_form');
function wpa_sms_auth_form() {
    ?>
    <p class="form-row form-row-wide">
        <label for="sms_code">Код из SMS</label>
        <input type="text" name="sms_code" id="sms_code" class="input-text" />
    </p>
    <?php
}

add_action('woocommerce_login_post', 'wpa_verify_sms_code', 10, 2);
function wpa_verify_sms_code($username, $password) {
    if (isset($_POST['sms_code'])) {
        $input_code = sanitize_text_field($_POST['sms_code']);
        session_start();
        if (!isset($_SESSION['wpa_sms_code']) || $_SESSION['wpa_sms_code'] !== $input_code) {
            wc_add_notice('Неверный код подтверждения из SMS.', 'error');
            wp_safe_redirect(wc_get_page_permalink('myaccount'));
            exit;
        }
        unset($_SESSION['wpa_sms_code']);
    }
}

add_action('wp_ajax_send_sms_code', 'wpa_send_sms_code');
add_action('wp_ajax_nopriv_send_sms_code', 'wpa_send_sms_code');
function wpa_send_sms_code() {
    $phone = sanitize_text_field($_POST['phone']);

    // Пример адреса Email-to-SMS для оператора МТС (Россия)
    $sms_gateway = $phone . '@sms.mts.ru';

    $code = rand(100000, 999999);

    session_start();
    $_SESSION['wpa_sms_code'] = $code;

    wp_mail($sms_gateway, '', 'Ваш код для входа: ' . $code);

    wp_send_json_success('Код отправлен');
}
?>

3. Добавление кнопки отправки кода и JS для AJAX

В файл темы или плагина добавьте следующий HTML и JS для отправки кода по нажатию кнопки:

<input type="text" id="phone" placeholder="Введите номер телефона" />
<button id="send_sms_code">Отправить код</button>

<script type="text/javascript">
jQuery(document).ready(function($){
    $('#send_sms_code').on('click', function(e){
        e.preventDefault();
        var phone = $('#phone').val();
        if (!phone) {
            alert('Введите номер телефона');
            return;
        }
        $.post(woocommerce_params.ajax_url, {
            action: 'send_sms_code',
            phone: phone
        }, function(response) {
            if(response.success) {
                alert('Код отправлен');
            } else {
                alert('Ошибка отправки кода');
            }
        });
    });
});
</script>

Проверка результата: как убедиться, что авторизация работает

  • Заполните поле «Номер телефона» в форме входа и нажмите «Отправить код».
  • Проверьте, что на телефон пришло SMS (если оператор поддерживает Email-to-SMS).
  • Введите полученный код в поле «Код из SMS» и выполните вход.
  • Если код верный, пользователь авторизуется, иначе появится ошибка.

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

  • Письмо не доходит до телефона: Проверьте правильность Email-to-SMS адреса и поддержку оператора. Альтернативно используйте email для теста.
  • Сессия не сохраняет код: Убедитесь, что session_start() вызывается до любого вывода на страницу.
  • Ошибка AJAX запроса: Проверьте, что woocommerce_params.ajax_url доступен и подключен jQuery.
  • Код не совпадает: Проверьте правильность сравнения, очистку данных и отсутствие пробелов.

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

  • Ограничьте частоту отправки SMS-кодов для одного номера, чтобы избежать спама (например, не чаще 1 раза в 60 секунд).
  • Храните коды в сессии с таймаутом (например, 5 минут), затем удаляйте.
  • Используйте SSL (HTTPS) на сайте, чтобы защитить передаваемые данные.
  • Для продакшн-системы лучше интегрировать платного SMS-провайдера, так как Email-to-SMS шлюзы ненадежны и зависят от оператора.

Сравнение вариантов реализации авторизации через SMS

МетодПлюсыМинусыРекомендуется для
Email-to-SMS шлюзБесплатно, простоЗависит от оператора, ненадежно, ограниченноМалобюджетные проекты, тесты
Платные SMS-провайдеры (Twilio, Nexmo)Надежно, быстро, поддержкаПлатно, требуется настройка APIКоммерческие проекты с высокими требованиями
Использование мессенджеров (Telegram, WhatsApp)Дешево, удобноТребует интеграции и согласия пользователяПроекты с активной аудиторией в мессенджерах
Как сделать автоматическую разблокировку пользователей в WordPress после блокировки
02.04.2026
WordPress авторизация по IP адресу: настройка и примеры кода
21.01.2026
WordPress автоматическая смена пароля при первом входе
14.01.2026
WooCommerce: ограничение доступа к продуктам по ролям пользователей
07.05.2026
Как создать кастомный плагин для журналов входов в WordPress
16.03.2026