wplang.ru wordpress WP Lang

WooCommerce: как добавить авторизацию через Telegram без плагинов

Диагностика задачи: зачем нужна авторизация через Telegram в WooCommerce

В условиях растущей популярности мессенджеров среди пользователей интернет-магазинов, интеграция авторизации через Telegram становится важной для упрощения входа и повышения конверсии. При этом многие хотят избежать установки дополнительных плагинов, чтобы не нагружать сайт и избежать конфликтов.

Типичная задача — добавить кнопку "Войти через Telegram" на страницу авторизации WooCommerce с использованием Telegram OAuth и получить данные пользователя для регистрации или входа.

Как работает авторизация через Telegram: кратко о механизме

Telegram предоставляет виджет авторизации, который позволяет получить данные пользователя после его подтверждения. При нажатии на кнопку пользователь подтверждает передачу базовой информации (ID, имя, username) вашему сайту.

Для использования Telegram Login Widget не требуется отдельный OAuth-сервер. Данные передаются через безопасный callback, который нужно валидировать на стороне сайта.

Пошаговое решение: интеграция Telegram Login в WooCommerce без плагинов

1. Создание Telegram бота и получение Bot Token

Для начала создайте бота через @BotFather в Telegram и сохраните токен. Он понадобится для проверки данных авторизации.

2. Добавление кнопки Telegram Login на страницу входа WooCommerce

В файле functions.php вашей темы или в отдельном сниппете добавьте код для вывода кнопки:

add_action('woocommerce_login_form', 'add_telegram_login_button');
function add_telegram_login_button() {
    echo '<script async src="https://telegram.org/js/telegram-widget.js?15" data-telegram-login="YourBotUsername" data-size="large" data-userpic="false" data-auth-url="' . esc_url( site_url('/telegram-auth/') ) . '"></script>';
}

Замените YourBotUsername на имя вашего бота без @.

3. Создание страницы обратного вызова для приема и проверки данных Telegram

Создайте в корне сайта или в WordPress точку входа (например, через rewrite rule или кастомный endpoint) по адресу /telegram-auth/, где будет обрабатываться переданный Telegram объект.

Пример кода для endpoint (можно вставить в functions.php):

add_action('init', function () {
    add_rewrite_rule('^telegram-auth/?$', 'index.php?telegram_auth=1', 'top');
});

add_filter('query_vars', function ($vars) {
    $vars[] = 'telegram_auth';
    return $vars;
});

add_action('template_redirect', function () {
    if (get_query_var('telegram_auth')) {
        process_telegram_auth();
        exit;
    }
});

function process_telegram_auth() {
    $data = $_GET;
    if (!isset($data['hash'])) {
        wp_die('Ошибка авторизации Telegram: нет данных');
    }

    $bot_token = 'YOUR_BOT_TOKEN'; // замените на токен вашего бота

    $check_hash = $data['hash'];
    unset($data['hash']);

    $data_check_arr = [];
    foreach ($data as $key => $value) {
        $data_check_arr[] = $key . '=' . $value;
    }
    sort($data_check_arr);
    $data_check_string = implode("\n", $data_check_arr);

    $secret_key = hash('sha256', $bot_token, true);
    $hash = hash_hmac('sha256', $data_check_string, $secret_key);

    if (strcmp($hash, $check_hash) !== 0) {
        wp_die('Ошибка авторизации Telegram: неверный хеш');
    }

    // Проверка времени авторизации (не старше 1 дня)
    if ((time() - $data['auth_date']) > 86400) {
        wp_die('Ошибка авторизации Telegram: сессия устарела');
    }

    // Ищем пользователя по Telegram ID или создаем нового
    $telegram_id = intval($data['id']);
    $user = get_users(['meta_key' => 'telegram_id', 'meta_value' => $telegram_id, 'number' => 1]);

    if (empty($user)) {
        // Создаем нового пользователя
        $username = sanitize_user($data['username'] ?? 'tguser' . $telegram_id);
        $email = $username . '@telegram.local'; // заглушка email
        $password = wp_generate_password(12, false);

        $user_id = wp_create_user($username, $password, $email);
        if (is_wp_error($user_id)) {
            wp_die('Ошибка создания пользователя');
        }
        update_user_meta($user_id, 'telegram_id', $telegram_id);
        $user = get_user_by('id', $user_id);
    } else {
        $user = $user[0];
    }

    // Авторизуем пользователя
    wp_set_current_user($user->ID);
    wp_set_auth_cookie($user->ID);

    // Редирект на страницу аккаунта
    wp_redirect(get_permalink(get_option('woocommerce_myaccount_page_id')));
    exit;
}

Замените YOUR_BOT_TOKEN на токен вашего бота.

Как проверить, что интеграция работает

  • Откройте страницу входа WooCommerce — должна отображаться кнопка Telegram Login.
  • Нажмите кнопку, подтвердите авторизацию в Telegram.
  • Вы должны попасть на страницу аккаунта WooCommerce без ошибок.
  • Проверьте в панели администратора, что для пользователя в meta есть поле telegram_id.

Частые ошибки и как их исправить

  • Проблема: Кнопка Telegram не отображается.
    Причина: Неверно указан bot username или неправильно подключен скрипт.
    Решение: Проверьте, что имя бота указано без @, убедитесь, что скрипт загружается без ошибок.
  • Проблема: Ошибка "неверный хеш" при авторизации.
    Причина: Неправильный токен бота или повреждение данных.
    Решение: Проверьте токен, убедитесь что сравнение хеша реализовано точно по документации Telegram.
  • Проблема: Пользователь не создается или не авторизуется.
    Причина: Ошибка в создании пользователя или конфликт с уже существующим логином.
    Решение: Добавьте отладочный вывод ошибок, проверьте уникальность login/email.

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

  • Проверяйте auth_date, чтобы не принимать устаревшие данные.
  • Используйте wp_nonce_field и другие WP методы защиты при расширении логики.
  • Для email используйте заглушку, чтобы избежать конфликтов с реальными почтами, или интегрируйте запрос email через Telegram Privacy API (если потребуется).
  • Кэшируйте правила rewrite после добавления новой rewrite rule командой flush_rewrite_rules() один раз через админку или в коде с условием.

Краткое сравнение вариантов интеграции Telegram авторизации

МетодПлюсыМинусы
Плагин (например, Telegram Login for WP)Быстрая установка, минимальный кодДополнительная нагрузка, возможные конфликты
Свой код (описанный выше)Полный контроль, минимальная нагрузка, кастомизацияНеобходим опыт PHP и WP, требует поддержки
Через внешние OAuth сервисыМожет быть более универсальноСложнее настроить, требует сторонних сервисов
×
Оптимизируй свой сайт!

Скидка -15% на премиум плагин Clearfy Pro

Купить плагин сейчас ⋙