Диагностика проблемы: почему стандартные 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) | Дешево, удобно | Требует интеграции и согласия пользователя | Проекты с активной аудиторией в мессенджерах |