Задать вопрос

Почему Telegram Login Widget не присылает сообщения?

Добрый день, коллеги!
Столкнулся с проблемой и не могу найти решение.
Заказчик хочет сделать авторизацию в админке через телеграм, я подумал ну ок, нет проблем. Сначала разрабатывал весь необходимый функционал локально, т.к. насколько я понял тестить tg login widget нужно на проде. Купил сервер, домен, задеплоил и приступил к подключению авторизации. Создал бота, установил привязанный домен, по началу все было отлично, но не долго)))
Виджет открывается, я ввожу телефон, мне выдает что то типо "Сообщение отправлено в телеграм, подтвердите вход", вот только сообщение почему то не приходит. Вынес все мозги нейронке, проверил на разных чекерах валидность SSL сертификата, но все попусту. Есть одна мысль, что мб бот блокирует домен .xyz (дешевый, часто используется для всяких скам сайтов). Ну, у меня без всякого фишинга и скама, обычная адмнка для управления основным приложением.

import {type FC, useEffect, useRef} from 'react';
import { observer } from 'mobx-react-lite';
import {type TelegramUser} from "@/libs/types/telegram";
import {authStore} from "@/entities/auth/slice";

interface TelegramLoginWidgetProps {
    botName: string;
    buttonSize?: 'large' | 'medium' | 'small';
    cornerRadius?: number;
    requestAccess?: boolean;
    usePic?: boolean;
    lang?: string;
}

declare global {
    interface Window {
        onTelegramAuth?: (user: TelegramUser) => void;
    }
}

const TelegramLoginWidget: FC<TelegramLoginWidgetProps> = observer(({
                                                                              botName,
                                                                              buttonSize = 'large',
                                                                              cornerRadius = 10,
                                                                              requestAccess = true,
                                                                              usePic = false,
                                                                              lang = 'ru'
                                                                          }) => {
    const ref = useRef<HTMLDivElement>(null);

    useEffect(() => {
        window.onTelegramAuth = (user: TelegramUser) => {
            // authStore.handleTelegramAuth(user);
            console.log('onTelegramAuth', user);
        };

        if (ref.current) {
            ref.current.innerHTML = '';

            const script = document.createElement('script');
            script.src = 'https://telegram.org/js/telegram-widget.js?22';
            script.setAttribute('data-telegram-login', botName);
            script.setAttribute('data-size', buttonSize);
            script.setAttribute('data-corner-radius', cornerRadius.toString());
            script.setAttribute('data-request-access', 'write');
            script.setAttribute('data-userpic', 'false');
            script.setAttribute('data-lang', lang);
            script.setAttribute('data-onauth', 'onTelegramAuth(user)');
            script.async = true;

            ref.current.appendChild(script);
        }

        return () => {
            if (window.onTelegramAuth) {
                delete window.onTelegramAuth;
            }
        };
    }, [botName, buttonSize, cornerRadius, requestAccess, usePic, lang]);

    return <div ref={ref}/>;
});

export default TelegramLoginWidget;
  • Вопрос задан
  • 232 просмотра
Подписаться 1 Простой 3 комментария
Решения вопроса 1
vovvkka
@vovvkka Автор вопроса
Решение: купил домен .com
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@nikitaHAllo
Почему Telegram Login Widget не отправляет запрос?

Бот не подключен к домену — зайди в @BotFather, выполни /setdomain и укажи точный адрес сайта (с https://). Поддомены тоже важны: sub.site.com ≠ site.com.

Проблемы с HTTPS — нужен валидный SSL-сертификат (не самоподписанный, без ошибок). Проверь его на SSL Labs.

Домен в зоне .xyz/.top — Telegram иногда блокирует "дешевые" домены. Попробуй .com/.net/.org.

Бот выключен — проверь статус бота в @BotFather (должен быть запущен) и активируй его командой /start в личном чате.

Кэш Telegram — после смены домена подожди 10–20 минут или сбрось настройки через /setdomain → none и добавь заново.

Совет: тестируй виджет на https://localhost (через ngrok), чтобы исключить проблемы с доменом.
Ответ написан
Комментировать
KEKSOV
@KEKSOV
Из личного опыта могу подтвердить - телега не захотела работать с сайтами в зоне .shop и .xyz
pesochnica.shop и pesochnica.xyz

Как только указал в настройках для бота через BotFather домен в зоне .ru, то стали приходить push сообщения в личную телегу...

Для тестирования использовал вот такой PHP скриптик (взял в примерах на сайте ТГ)
define('BOT_USERNAME', 'XXX'); // place username of your bot here

function getTelegramUserData() {
  if (isset($_COOKIE['tg_user'])) {
    $auth_data_json = urldecode($_COOKIE['tg_user']);
    $auth_data = json_decode($auth_data_json, true);
    return $auth_data;
  }
  return false;
}

if (isset($_GET['logout'])) {
  setcookie('tg_user', '');
  header('Location: tg.php');
}

$tg_user = getTelegramUserData();
if ($tg_user !== false) {
  $first_name = htmlspecialchars($tg_user['first_name']);
  $last_name = htmlspecialchars($tg_user['last_name']);
  if (isset($tg_user['username'])) {
    $username = htmlspecialchars($tg_user['username']);
    $html = "<h1>Hello, <a href=\"https://t.me/{$username}\">{$first_name} {$last_name}</a>!</h1>";
  } else {
    $html = "<h1>Hello, {$first_name} {$last_name}!</h1>";
  }
  if (isset($tg_user['photo_url'])) {
    $photo_url = htmlspecialchars($tg_user['photo_url']);
    $html .= "<img src=\"{$photo_url}\">";
  }
  $html .= "<p><a href=\"?logout=1\">Log out</a></p>";
} else {
  $bot_username = BOT_USERNAME;
  $html = <<<HTML
<h1>Hello, anonymous!</h1>
<script async src="https://telegram.org/js/telegram-widget.js?22" data-telegram-login="{$bot_username}" data-size="large" data-request-access="write" data-auth-url="unimportant.php"></script>
HTML;
}


  echo <<<HTML
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Login Widget Example</title>
  </head>
  <body><center>{$html}</center></body>
</html>
HTML;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы