/
itp_practice
/
itp_backend
Обзор
Документация
Войти
/
itp_practice
/
itp_backend
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
app/Http/Controllers/TelegramWebhookController.php
193 строки
8 KB
vivanenko
tg register
29 май 2025, 19:11
29 май 2025, 19:11
94c4ab4
Код
Авторство
О чём код?
<?php namespace App\Http\Controllers; use App\DTOs\Auth\TelegramAuthData; use App\Models\User; use App\Services\Auth\TelegramAuthService; use App\Services\TelegramService; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Log; class TelegramWebhookController extends Controller { public function __construct( private readonly TelegramService $telegramService, private readonly TelegramAuthService $telegramAuthService ) {} public function handle(Request $request): JsonResponse { try { $data = $request->all(); Log::info('Telegram webhook data', $data); // Обработка сообщений if (isset($data['message'])) { return $this->handleMessage($data); } // Обработка callback query (кнопки) if (isset($data['callback_query'])) { return $this->handleCallbackQuery($data['callback_query']); } return response()->json(['message' => 'OK']); } catch (\Exception $e) { Log::error('Telegram webhook error', [ 'error' => $e->getMessage(), 'trace' => $e->getTraceAsString() ]); return response()->json(['error' => 'Internal server error'], 500); } } /** * Обработка сообщений с использованием нового TelegramAuthService */ private function handleMessage(array $webhookData): JsonResponse { try { // Создаем DTO из webhook данных $authData = TelegramAuthData::fromTelegramWebhook($webhookData); $message = $webhookData['message']; $chatId = $message['chat']['id']; $text = $message['text'] ?? ''; // Обработка команды /start if (str_starts_with($text, '/start')) { return $this->handleStartCommand($authData); } // Обработка других команд if ($text === '/help') { $this->telegramService->sendMessage($chatId, "📋 Доступные команды:\n\n" . "/start - Регистрация/авторизация\n" . "/help - Справка\n" . "/profile - Ваш профиль" ); } elseif ($text === '/profile') { return $this->handleProfileCommand($authData); } return response()->json(['message' => 'OK']); } catch (\Exception $e) { Log::error('Error handling Telegram message', [ 'error' => $e->getMessage(), 'webhook_data' => $webhookData ]); // Отправляем ошибку пользователю if (isset($webhookData['message']['chat']['id'])) { $this->telegramService->sendMessage( $webhookData['message']['chat']['id'], "❌ Произошла ошибка. Попробуйте позже." ); } return response()->json(['message' => 'OK']); } } /** * Обработка команды /start с использованием TelegramAuthService */ private function handleStartCommand(TelegramAuthData $authData): JsonResponse { try { // Используем новый TelegramAuthService для авторизации $authResult = $this->telegramAuthService->authenticate($authData); $user = $authResult->user; $isNewUser = $authResult->isNewUser; if ($isNewUser) { // Новый пользователь - отправляем приветствие с токеном для веба $webMessage = "🎉 Добро пожаловать!\n\n" . "Вы успешно зарегистрированы в нашей системе.\n\n"; if ($authData->hasStartToken()) { $webMessage .= "🔑 Ваш токен авторизации: <code>{$authData->startToken}</code>\n\n"; } $webMessage .= "Теперь вы можете:\n" . "• Использовать наши веб-сервисы\n" . "• Управлять тарифами\n" . "• Отслеживать статистику\n\n" . "Введите /help для получения справки"; $this->telegramService->sendMessage($authData->chatId, $webMessage); } else { // Существующий пользователь $welcomeBackMessage = "👋 С возвращением, {$user->name}!\n\n"; if ($authData->hasStartToken()) { $welcomeBackMessage .= "🔑 Ваш токен авторизации: <code>{$authData->startToken}</code>\n\n"; } $welcomeBackMessage .= "Введите /profile для просмотра профиля или /help для справки"; $this->telegramService->sendMessage($authData->chatId, $welcomeBackMessage); } Log::info('Successfully processed /start command', [ 'user_id' => $user->id, 'telegram_id' => $authData->telegramId, 'is_new_user' => $isNewUser, 'has_start_token' => $authData->hasStartToken() ]); } catch (\Exception $e) { Log::error('Error processing /start command', [ 'telegram_id' => $authData->telegramId, 'error' => $e->getMessage() ]); $this->telegramService->sendMessage($authData->chatId, "❌ Ошибка при регистрации. Попробуйте позже или обратитесь в поддержку." ); } return response()->json(['message' => 'OK']); } /** * Обработка команды /profile */ private function handleProfileCommand(TelegramAuthData $authData): JsonResponse { $user = User::where('telegram_id', $authData->telegramId)->first(); if (!$user) { $this->telegramService->sendMessage($authData->chatId, "❌ Пользователь не найден. Введите /start для регистрации." ); } else { $profileMessage = "👤 Ваш профиль:\n\n" . "🆔 ID: {$user->id}\n" . "📛 Имя: {$user->name}\n" . "📧 Email: {$user->email}\n" . "📱 Telegram: @{$user->telegram_username}\n" . "✅ Статус: " . ($user->is_telegram_verified ? "Верифицирован" : "Не верифицирован") . "\n" . "📅 Дата регистрации: " . $user->created_at->format('d.m.Y H:i'); $this->telegramService->sendMessage($authData->chatId, $profileMessage); } return response()->json(['message' => 'OK']); } private function handleCallbackQuery(array $callbackQuery): JsonResponse { $chatId = $callbackQuery['from']['id']; $data = $callbackQuery['data']; // Здесь можно добавить обработку различных callback_data от кнопок // Например, подтверждение действий, выбор тарифа и т.д. return response()->json(['message' => 'OK']); } }