fix: исправлена интеграция платежей через Telegram Stars API

- справлена обработка ответа от эндпоинта /create-invoice-link
- обавлена поддержка JSON-формата ответа с полем invoice_link
- брано промежуточное подтверждение покупки для улучшения UX
- обавлено получение информации о пользователе через /users/{user_id}
- бновлен интерфейс профиля для отображения актуальных данных после оплаты
This commit is contained in:
kazachilo 2025-03-27 15:06:00 +03:00
parent 92424f6902
commit cde032fd57
2 changed files with 36 additions and 50 deletions

View File

@ -89,8 +89,13 @@ const apiService = {
throw new Error('Failed to create invoice link'); throw new Error('Failed to create invoice link');
} }
// Предполагаем, что бэкенд возвращает строку с URL инвойса // Парсим ответ как JSON и извлекаем поле invoice_link
return await response.text(); const data = await response.json();
if (!data.invoice_link) {
throw new Error('Invalid response format: missing invoice_link field');
}
return data.invoice_link;
} catch (error) { } catch (error) {
console.error('Error creating invoice link:', error); console.error('Error creating invoice link:', error);
throw error; throw error;

View File

@ -13,56 +13,37 @@ export const paymentService = {
const webApp = window.Telegram.WebApp; const webApp = window.Telegram.WebApp;
const userId = getCurrentUserId(); const userId = getCurrentUserId();
// Открываем окно оплаты Telegram try {
webApp.showPopup({ // Получаем ссылку на инвойс от бэкенда
title: 'Покупка токенов', const invoiceLink = await apiService.createInvoiceLink(
message: `Вы собираетесь купить пакет "${pack.title}" за ${pack.price} Stars (${pack.priceRub} ₽)`, userId,
buttons: [ pack.price,
{ pack.tokens + pack.bonusTokens
type: 'ok', );
text: 'Купить',
id: 'buy'
},
{
type: 'cancel',
text: 'Отмена'
}
]
}, async (buttonId: string) => {
if (buttonId === 'buy') {
try {
// Получаем ссылку на инвойс от бэкенда
const invoiceLink = await apiService.createInvoiceLink(
userId,
pack.price,
pack.tokens + pack.bonusTokens
);
// Открываем встроенный платеж Telegram // Открываем встроенный платеж Telegram без предварительного подтверждения
webApp.openInvoice(invoiceLink, async (status: 'paid' | 'cancelled' | 'failed' | 'pending') => { webApp.openInvoice(invoiceLink, async (status: 'paid' | 'cancelled' | 'failed' | 'pending') => {
if (status === 'paid') { if (status === 'paid') {
try { try {
// Получаем обновленную информацию о пользователе // Получаем обновленную информацию о пользователе
const userData = await apiService.getUserInfo(userId); const userData = await apiService.getUserInfo(userId);
if (onSuccess) { if (onSuccess) {
onSuccess(userData); onSuccess(userData);
}
} catch (error) {
console.error('Ошибка при получении данных пользователя:', error);
// Даже если не удалось получить данные, вызываем onSuccess
if (onSuccess) {
onSuccess();
}
}
} }
}); } catch (error) {
} catch (error) { console.error('Ошибка при получении данных пользователя:', error);
console.error('Ошибка при создании инвойса:', error);
webApp.showAlert('Произошла ошибка при создании платежа. Пожалуйста, попробуйте позже.'); // Даже если не удалось получить данные, вызываем onSuccess
if (onSuccess) {
onSuccess();
}
}
} }
} });
}); } catch (error) {
console.error('Ошибка при создании инвойса:', error);
webApp.showAlert('Произошла ошибка при создании платежа. Пожалуйста, попробуйте позже.');
}
} }
}; };