Files
app_umbrix/TRIAL-USERNAME-FIX.md

6.7 KiB
Raw Blame History

🔒 Исправление: Имена 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

Старое поведение (до фикса):

// 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 кнопка)

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)

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

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

🔑 Ключевые файлы

💡 Важно!

Если пользователь видит имена user_... - это означает, что:

  1. Приложение открыто не через Telegram бота
  2. Telegram WebApp не инициализирован
  3. Нужно переоткрыть через @Chat_8n8_bot → "Открыть приложение"

Теперь система автоматически блокирует такие попытки!