Верификация пользователей по телефону через 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, а также рекомендации по защите и интеграции.