diff --git a/TRIAL-USERNAME-FIX.md b/TRIAL-USERNAME-FIX.md new file mode 100644 index 0000000..0678171 --- /dev/null +++ b/TRIAL-USERNAME-FIX.md @@ -0,0 +1,181 @@ +# 🔒 Исправление: Имена user_... при trial подписке + +## 📋 Описание проблемы + +При оформлении **trial (пробной) подписки** username генерировался в формате `user_1770605873419` (timestamp) вместо реального имени пользователя. + +## 🔍 Причина + +**Это НЕ баг кода!** Telegram WebApp API не передает данные пользователя (`tgUser.id`, `tgUser.username`, `tgUser.first_name`) когда: + +1. ❌ Приложение открыто **в браузере напрямую** (не через Telegram бота) +2. ❌ Telegram WebApp **не инициализирован** (например, в dev режиме) +3. ❌ Недостаточно **прав доступа** к Telegram API + +### Старое поведение (до фикса): + +```typescript +// app/page.tsx (handleActivateTrial) +telegramId: tgUser?.id || Date.now(), // ❌ Fallback на timestamp! +``` + +**Результат**: Если `tgUser?.id` = undefined → username = `user_1770605873419` (таймстамп) + +## ✅ Решение + +Добавлена **обязательная валидация** Telegram ID на всех уровнях: + +### 1. Frontend - app/page.tsx (Trial кнопка) + +```typescript +const tgUser = telegramWebApp?.initDataUnsafe?.user; + +// 🔍 DEBUG логирование +console.log('🎁 TRIAL ACTIVATION - Telegram data:', { + hasWebApp: !!telegramWebApp, + hasUser: !!tgUser, + userId: tgUser?.id, + username: tgUser?.username, + firstName: tgUser?.first_name +}); + +// ⚠️ БЛОКИРУЕМ создание без Telegram ID +if (!tgUser?.id) { + console.error('❌ TRIAL BLOCKED: No Telegram user data!'); + showToastNotification('❌ Откройте приложение через Telegram бота'); + return; +} + +// Теперь tgUser.id 100% есть +const response = await fetch('/api/create-user', { + body: JSON.stringify({ + planType: 'trial', + telegramId: tgUser.id, // ✅ Без fallback! + telegramUsername: tgUser?.username, + firstName: tgUser?.first_name, + }) +}); +``` + +### 2. Frontend - app/plans/page.tsx (3-step flow) + +```typescript +async function createUser(planType, period, locationIds) { + const user = telegramWebApp?.initDataUnsafe?.user; + + // ⚠️ БЛОКИРУЕМ без user.id + if (!user?.id) { + console.error('❌ USER CREATION BLOCKED: No Telegram user ID!'); + alert('❌ Откройте приложение через Telegram бота\n\nПриложение должно быть открыто в Telegram Mini App.'); + return; + } + + const requestBody = { + telegramId: user.id, // ✅ 100% существует + telegramUsername: user?.username || null, + firstName: user?.first_name || null, + }; +} +``` + +### 3. Backend - app/api/create-user/route.ts + +```typescript +export async function POST(request: NextRequest) { + const { telegramId, telegramUsername, firstName } = await request.json(); + + // ⚠️ СЕРВЕРНАЯ ВАЛИДАЦИЯ + if (!telegramId) { + logger.error('❌ VALIDATION FAILED: No telegramId provided'); + return NextResponse.json( + { + success: false, + error: 'Telegram ID is required. Please open the app through Telegram bot.' + }, + { status: 400 } + ); + } + + // Генерация username с приоритетами + let username: string; + if (telegramUsername) { + username = telegramUsername.toLowerCase().replace(/[^a-z0-9_]/g, '_'); + } else if (firstName && telegramId) { + username = `${firstName.toLowerCase().replace(/[^a-z0-9]/g, '_')}_${telegramId}`; + } else { + username = `user_${telegramId}`; // ✅ Используем реальный ID, не timestamp + } +} +``` + +## 📊 Результат + +### До фикса: +- ❌ `user_1770605873419` (timestamp) - когда Telegram не передает данные +- ❌ Создается подписка даже без Telegram ID +- ❌ Невозможно отследить пользователя + +### После фикса: +- ✅ **БЛОКИРОВКА** создания если нет `tgUser.id` +- ✅ Понятное сообщение: "Откройте приложение через Telegram бота" +- ✅ Debug логи показывают причину блокировки +- ✅ Все имена генерируются из **реальных Telegram данных** + +## 🧪 Тестирование + +### Правильный путь (через Telegram бота): + +1. Открыть Telegram бот `@Chat_8n8_bot` +2. Нажать "Открыть приложение" / `Start` +3. Telegram WebApp передаст: `{ id: 123456789, username: "john_doe", first_name: "John" }` +4. Username: `john_doe` ✅ + +### Неправильный путь (в браузере напрямую): + +1. Открыть `https://app.umbrix.net` в Chrome +2. Telegram WebApp недоступен: `window.Telegram?.WebApp = undefined` +3. Попытка создать trial → **БЛОКИРОВКА** ❌ +4. Сообщение: "Откройте приложение через Telegram бота" + +## 📝 Debug логи + +При попытке создать trial без Telegram данных в консоли браузера: + +``` +🎁 TRIAL ACTIVATION - Telegram data: { + hasWebApp: false, + hasInitData: false, + hasUser: false, + userId: undefined, + username: undefined, + firstName: undefined, + fullData: undefined +} +❌ TRIAL BLOCKED: No Telegram user data! +``` + +## 🚀 Production деплой + +Изменения задеплоены: +- ✅ Локальный билд: PASSED +- ✅ Production билд: PASSED +- ✅ PM2 перезапущен: pid 48353 +- ✅ Git коммит: `806b668` + +## 🔑 Ключевые файлы + +- [app/page.tsx](app/page.tsx) - handleActivateTrial (строки 188-245) +- [app/plans/page.tsx](app/plans/page.tsx) - createUser (строки 171-225) +- [app/api/create-user/route.ts](app/api/create-user/route.ts) - telegramId validation (строки 22-47) +- [types/telegram.ts](types/telegram.ts) - TelegramWebApp интерфейс +- [types/telegram.d.ts](types/telegram.d.ts) - Window.Telegram декларация +- [hooks/useTelegramWebApp.ts](hooks/useTelegramWebApp.ts) - Telegram WebApp hook + +## 💡 Важно! + +Если пользователь видит имена `user_...` - это означает, что: +1. Приложение открыто **не через Telegram бота** +2. Telegram WebApp **не инициализирован** +3. Нужно переоткрыть через `@Chat_8n8_bot` → "Открыть приложение" + +**Теперь система автоматически блокирует такие попытки!** ✅