diff --git a/app/api/create-user/route.ts b/app/api/create-user/route.ts index 085a63c..28e0cd4 100644 --- a/app/api/create-user/route.ts +++ b/app/api/create-user/route.ts @@ -29,7 +29,8 @@ export async function POST(request: NextRequest) { telegramUsername, firstName, lastName, - referrerId + referrerId, + source // Источник перехода (n8n, chat и т.д.) } = await request.json(); logger.debug('📥 Received data:', { @@ -40,11 +41,15 @@ export async function POST(request: NextRequest) { telegramUsername, firstName, lastName, - referrerId + referrerId, + source }); - // ⚠️ ВАЛИДАЦИЯ: telegramId обязателен! - if (!telegramId) { + // 🔓 ИСКЛЮЧЕНИЕ: Разрешаем n8n переходы даже без telegramId + const fromN8n = source === 'n8n' || source === 'chat'; + + // ⚠️ ВАЛИДАЦИЯ: telegramId обязателен (кроме n8n переходов) + if (!telegramId && !fromN8n) { logger.error('❌ VALIDATION FAILED: No telegramId provided'); return NextResponse.json( { diff --git a/app/page.tsx b/app/page.tsx index d34b9a9..9f77b5b 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -213,24 +213,32 @@ export default function Home() { fullData: tgUser }); - // ⚠️ ВАЖНО: Если Telegram не передал данные - НЕ создаем trial! - if (!tgUser?.id) { + // 🔓 ИСКЛЮЧЕНИЕ: Разрешаем создание для n8n переходов (когда есть source или utm параметры) + const source = urlParams.get('source') || urlParams.get('utm_source'); + const fromN8n = source === 'n8n' || source === 'chat' || urlParams.has('from_n8n'); + + // ⚠️ ВАЖНО: Если Telegram не передал данные И это не n8n переход - блокируем! + if (!tgUser?.id && !fromN8n) { console.error('❌ TRIAL BLOCKED: No Telegram user data!'); showToastNotification('❌ Откройте приложение через Telegram бота'); setIsLoading(false); return; } + // Для n8n переходов генерируем временный ID + const userId = tgUser?.id || Date.now(); + // Создаем trial подписку через API const response = await fetch('/api/create-user', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ planType: 'trial', - telegramId: tgUser.id, // Теперь 100% есть + telegramId: userId, // Telegram ID или временный для n8n telegramUsername: tgUser?.username || undefined, firstName: tgUser?.first_name || undefined, referrerId: referrerId || undefined, + source: fromN8n ? (source || 'n8n') : undefined, // Помечаем n8n переходы }), }); diff --git a/app/plans/page.tsx b/app/plans/page.tsx index d1e0fa3..2adc3d8 100644 --- a/app/plans/page.tsx +++ b/app/plans/page.tsx @@ -188,24 +188,33 @@ export default function PlansNew() { } : null }); - // ⚠️ ВАЖНО: Если Telegram не передал user.id - блокируем создание - if (!user?.id) { + // 🔓 ИСКЛЮЧЕНИЕ: Проверяем переход из n8n + const urlParams = new URLSearchParams(window.location.search); + const source = urlParams.get('source') || urlParams.get('utm_source'); + const fromN8n = source === 'n8n' || source === 'chat' || urlParams.has('from_n8n'); + + // ⚠️ ВАЖНО: Если Telegram не передал user.id И это не n8n переход - блокируем + if (!user?.id && !fromN8n) { console.error('❌ USER CREATION BLOCKED: No Telegram user ID!'); alert('❌ Откройте приложение через Telegram бота\n\nПриложение должно быть открыто в Telegram Mini App, а не в браузере.'); setStep('plan'); setIsCreatingUser(false); return; } + + // Для n8n переходов генерируем временный ID + const userId = user?.id || Date.now(); const requestBody = { planType, period, locationIds, - telegramId: user.id, // Теперь 100% есть + telegramId: userId, // Telegram ID или временный для n8n telegramUsername: user?.username || null, firstName: user?.first_name || null, lastName: user?.last_name || null, - referrerId: referrerId || null, // Добавляем referrerId + referrerId: referrerId || null, + source: fromN8n ? (source || 'n8n') : null, // Помечаем n8n переходы }; console.log('📤 REQUEST BODY:', requestBody);