Получение реферального кода из параметра старта Telegram-бота с помощью JavaScript на лендинг-странице и отправка на Laravel бэкэнд

Вопрос или проблема

Я разрабатываю мини-приложение для Telegram, у него есть опции для пользователей, чтобы рекомендовать других пользователей приложению и получать за это вознаграждение. Я завершил аутентификацию и многие функции/логики приложения. Но я не смог извлечь реферальный код из реферальной ссылки, например: https://t.me/my_bot?start=RefC0d3. Я много пробовал, но ничего не сработало.

Пожалуйста, может кто-то помочь мне с этим. Я застрял здесь. Спасибо.

Мой код на JS приведен ниже:

const telegramWebApp = await loadTelegramSdk();
                if (telegramWebApp) {
                    const { id, first_name, username, start_param } = telegramWebApp.initDataUnsafe;
                    console.log('Информация о пользователе Telegram:', { id, first_name, username, start_param });

                    const csrfToken = document.querySelector('meta[name="csrf-token"]')?.getAttribute('content');

                    const headers = {
                        'Content-Type': 'application/json',
                    };

                    if (csrfToken) {
                        headers['X-CSRF-TOKEN'] = csrfToken;
                    }

                    const requestBody = {
                        ...telegramWebApp.initDataUnsafe,
                        referral_code: start_param // Добавить реферальный код в тело запроса
                    };

                    const response = await fetch("{{ route('tg.authenticate') }}", {
                        method: 'POST',
                        headers: headers,
                        body: JSON.stringify(requestBody) // Отправить реферальный код в теле запроса
                    });

                    const data = await response.json();
                    if (data.message === 'Успешная авторизация' || data.message === 'Пользователь создан и авторизован') {
                        console.log(`Добро пожаловать ${first_name || username}!`);
                        setTimeout(() => {
                            window.location.href="https://stackoverflow.com/questions/79004679/{{ route("tg.dashboard') }}'; // Перенаправить через 1.5 секунды
                        }, 1500);
                    } else {
                        console.error('Ошибка аутентификации:', data.message);
                    }
                }

В моем контроллере я использовал Log::info('Запрос Inputs:', $request->all()); для проверки входных данных, но JavaScript не отправляет реферальный код.

Ответ или решение

Чтобы извлечь реферальный код из параметра start в ссылке телеграм-бота и отправить его на сервер Laravel, вы можете использовать следующий подход. Ваша текущая реализация на JavaScript выглядит весьма обнадеживающе, но давайте убедимся, что всё сделано правильно и данные действительно отправляются на бэкенд.

Шаги для решения проблемы:

  1. Извлечение параметра start: Убедитесь, что вы правильно получаете параметр start из initDataUnsafe.

  2. Отправка данных на Laravel: Проверьте, что данные отправляются в нужном формате, а также, что на стороне Laravel вы корректно принимаете их.

Модифицированный JavaScript-код:

async function init() {
    const telegramWebApp = await loadTelegramSdk();
    if (telegramWebApp) {
        const { id, first_name, username, start_param } = telegramWebApp.initDataUnsafe;
        console.log('Информация о пользователе Telegram:', { id, first_name, username, start_param });

        const csrfToken = document.querySelector('meta[name="csrf-token"]')?.getAttribute('content');

        const headers = {
            'Content-Type': 'application/json',
        };

        if (csrfToken) {
            headers['X-CSRF-TOKEN'] = csrfToken;
        }

        const requestBody = {
            user_id: id,
            first_name: first_name,
            username: username,
            referral_code: start_param // Передаем реферальный код
        };

        try {
            const response = await fetch("{{ route('tg.authenticate') }}", {
                method: 'POST',
                headers: headers,
                body: JSON.stringify(requestBody) // Отправляем все данные
            });

            const data = await response.json();
            if (data.message === 'Logged in successfully' || data.message === 'User created and logged in') {
                console.log(`Добро пожаловать, ${first_name || username}!`);
                setTimeout(() => {
                    window.location.href = "{{ route('tg.dashboard') }}"; // Перенаправление после 1.5 секунд
                }, 1500);
            } else {
                console.error('Ошибка аутентификации:', data.message);
            }
        } catch (error) {
            console.error('Ошибка сети:', error);
        }
    }
}

init();

Laravel контроллер:

Убедитесь, что ваш контроллер принимает данные правильно. Пример:

public function authenticate(Request $request)
{
    Log::info('Request Input:', $request->all());

    // Проверяем наличие реферального кода
    $referralCode = $request->input('referral_code');
    if ($referralCode) {
        // Логика для работы с реферальным кодом
    }

    // Остальная логика аутентификации...
}

Завершение:

  1. Проверьте, что вы используете правильный маршрут в JavaScript-коде {{ route('tg.authenticate') }}, который должен совпадать с маршрутом в вашем файле маршрутов Laravel.

  2. Убедитесь, что CSRF-токен действительно передаётся и используется на сервере для предотвращения атак.

  3. Проверьте, что на стороне Laravel осуществляется корректная обработка входящих данных.

Эти шаги должны помочь вам успешно извлечь и отправить реферальный код на сервер. Если возникают дополнительные проблемы, проверьте консоль разработчика в браузере на наличие ошибок и убедитесь, что запросы обрабатываются корректно на стороне сервера.

Оцените материал
Добавить комментарий

Капча загружается...