Диагностика проблемы: зачем нужна авторизация через SMS в WooCommerce
Стандартная авторизация в WooCommerce и WordPress основана на логине и пароле. Однако в некоторых случаях требуется более удобный и быстрый способ входа — например, по номеру телефона с подтверждением через SMS. Это снижает барьер для покупки и повышает конверсию, особенно на мобильных устройствах.
Типичные задачи:
- Войти в аккаунт без пароля, только по номеру телефона и коду из SMS.
- Обеспечить безопасность с помощью одноразового пароля (OTP).
- Избежать установки громоздких плагинов, чтобы не нагружать сайт.
Пошаговое решение: реализация авторизации через SMS с использованием собственного кода
1. Добавляем форму входа с номером телефона
Создаем кастомную форму логина, где вместо логина пользователь вводит телефон.
<form id="sms-login-form" method="post" action="">
<input type="tel" name="sms_phone" placeholder="Ваш номер телефона" required pattern="\+?\d{10,15}" />
<button type="submit" name="send_sms_code">Получить код</button>
</form>2. Отправка SMS с кодом подтверждения
Подключаем обработчик в functions.php или в своем плагине:
add_action('init', function() {
if (isset($_POST['send_sms_code'])) {
$phone = sanitize_text_field($_POST['sms_phone']);
// Генерируем 6-значный код
$code = wp_rand(100000, 999999);
// Сохраняем код и номер в сессию
if (!session_id()) {
session_start();
}
$_SESSION['sms_login_code'] = $code;
$_SESSION['sms_login_phone'] = $phone;
// Отправка SMS (пример с внешним сервисом, замените на ваш API)
$message = "Ваш код для входа: $code";
$result = send_sms($phone, $message); // функция отправки SMS
if ($result) {
wp_redirect(add_query_arg('sms_sent', '1', wp_get_referer()));
exit;
} else {
wp_die('Ошибка при отправке SMS');
}
}
});Для функции send_sms($phone, $message) нужно интегрировать любой SMS-шлюз, например, через API Twilio, Nexmo, или российского провайдера. Ниже пример простой заглушки:
function send_sms($phone, $message) {
// Реальная реализация зависит от выбранного API
// Здесь просто имитация успеха
return true;
}3. Форма ввода кода и проверка
После отправки кода показываем форму для ввода кода:
<form id="sms-code-form" method="post" action="">
<input type="text" name="sms_code" placeholder="Введите код из SMS" required pattern="\d{6}" />
<button type="submit" name="verify_sms_code">Войти</button>
</form>Обрабатываем проверку кода:
add_action('init', function() {
if (isset($_POST['verify_sms_code'])) {
if (!session_id()) {
session_start();
}
$input_code = sanitize_text_field($_POST['sms_code']);
if (isset($_SESSION['sms_login_code'], $_SESSION['sms_login_phone']) && $_SESSION['sms_login_code'] == $input_code) {
$phone = $_SESSION['sms_login_phone'];
// Ищем пользователя по метаполю с телефоном
$user = get_users(array(
'meta_key' => 'billing_phone',
'meta_value' => $phone,
'number' => 1,
'count_total' => false
));
if ($user) {
// Авторизуем пользователя
wp_set_current_user($user[0]->ID);
wp_set_auth_cookie($user[0]->ID);
unset($_SESSION['sms_login_code'], $_SESSION['sms_login_phone']);
wp_redirect(home_url());
exit;
} else {
wp_die('Пользователь с таким номером не найден');
}
} else {
wp_die('Неверный код');
}
}
});Проверка результата после внедрения
- Перейдите на страницу с формой и введите номер телефона, который есть в базе WooCommerce (обычно хранится в мета данных пользователя
billing_phone). - Проверьте, что приходит SMS с кодом (в тестах можно логировать код в debug.log).
- Ввод кода должен привести к успешной авторизации без пароля.
- Проверьте, что после авторизации пользователь действительно залогинен (например, функция
is_user_logged_in()возвращает true).
Частые ошибки и как их исправить
- Код не отправляется: проверьте корректность интеграции с SMS-шлюзом и наличии ключей API.
- Код не совпадает: убедитесь, что сессия стартует до сохранения данных, а код не перезаписывается.
- Пользователь не найден: проверьте, что номер телефона пользователя точно совпадает с вводимым, включая формат и префиксы (+7, 8 и т.п.). Желательно нормализовать номер (удалять пробелы, скобки).
- Авторизация не сохраняется: убедитесь, что вызваны функции
wp_set_current_userиwp_set_auth_cookieи нет ошибок.
Практические советы по безопасности и производительности
- Ограничьте число попыток ввода кода в течение определенного времени, чтобы избежать перебора (например, через transient или IP-логирование).
- Используйте короткий TTL для сессии с кодом, например, 5 минут.
- Храните коды только в сессии, не в базе данных, чтобы снизить риски.
- Нормализуйте телефонные номера при сохранении и при вводе (убирайте все кроме цифр и знака +), чтобы избежать несоответствий.
- Для высокой нагрузки лучше использовать отдельный микросервис SMS или очереди для отправки.
Таблица сравнения вариантов реализации авторизации через SMS
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Плагин (например, WP SMS Login) | Быстрая установка, готовые функции | Нагрузка, лишний код, часто платные API | Если нужна простота и нет времени на разработку |
| Своя реализация на PHP и API SMS | Контроль, легковесность, можно подстроить под бизнес | Требует навыков, время на разработку и тестирование | Когда важна кастомизация и оптимизация |
| Внешние сервисы с OAuth/SMS (например, Firebase) | Надежность, масштабируемость | Сложнее интегрировать, зависимость от сторонних сервисов | Для крупных проектов с большим трафиком |