Вопрос или проблема
Я разрабатываю мини-приложение для 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 выглядит весьма обнадеживающе, но давайте убедимся, что всё сделано правильно и данные действительно отправляются на бэкенд.
Шаги для решения проблемы:
-
Извлечение параметра
start
: Убедитесь, что вы правильно получаете параметрstart
изinitDataUnsafe
. - Отправка данных на 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) {
// Логика для работы с реферальным кодом
}
// Остальная логика аутентификации...
}
Завершение:
-
Проверьте, что вы используете правильный маршрут в JavaScript-коде
{{ route('tg.authenticate') }}
, который должен совпадать с маршрутом в вашем файле маршрутов Laravel. -
Убедитесь, что CSRF-токен действительно передаётся и используется на сервере для предотвращения атак.
- Проверьте, что на стороне Laravel осуществляется корректная обработка входящих данных.
Эти шаги должны помочь вам успешно извлечь и отправить реферальный код на сервер. Если возникают дополнительные проблемы, проверьте консоль разработчика в браузере на наличие ошибок и убедитесь, что запросы обрабатываются корректно на стороне сервера.