From cde032fd57fdea71948b7aa5218b42a400301cc2 Mon Sep 17 00:00:00 2001 From: kazachilo Date: Thu, 27 Mar 2025 15:06:00 +0300 Subject: [PATCH] =?UTF-8?q?fix:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=B8=D0=BD=D1=82=D0=B5=D0=B3=D1=80?= =?UTF-8?q?=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BF=D0=BB=D0=B0=D1=82=D0=B5=D0=B6?= =?UTF-8?q?=D0=B5=D0=B9=20=D1=87=D0=B5=D1=80=D0=B5=D0=B7=20Telegram=20Star?= =?UTF-8?q?s=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - справлена обработка ответа от эндпоинта /create-invoice-link - обавлена поддержка JSON-формата ответа с полем invoice_link - брано промежуточное подтверждение покупки для улучшения UX - обавлено получение информации о пользователе через /users/{user_id} - бновлен интерфейс профиля для отображения актуальных данных после оплаты --- src/services/api.ts | 9 +++- src/services/paymentService.ts | 77 +++++++++++++--------------------- 2 files changed, 36 insertions(+), 50 deletions(-) diff --git a/src/services/api.ts b/src/services/api.ts index 938661b..ecc7372 100644 --- a/src/services/api.ts +++ b/src/services/api.ts @@ -89,8 +89,13 @@ const apiService = { throw new Error('Failed to create invoice link'); } - // Предполагаем, что бэкенд возвращает строку с URL инвойса - return await response.text(); + // Парсим ответ как JSON и извлекаем поле invoice_link + 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) { console.error('Error creating invoice link:', error); throw error; diff --git a/src/services/paymentService.ts b/src/services/paymentService.ts index 9ec63eb..3430f2c 100644 --- a/src/services/paymentService.ts +++ b/src/services/paymentService.ts @@ -13,56 +13,37 @@ export const paymentService = { const webApp = window.Telegram.WebApp; const userId = getCurrentUserId(); - // Открываем окно оплаты Telegram - webApp.showPopup({ - title: 'Покупка токенов', - message: `Вы собираетесь купить пакет "${pack.title}" за ${pack.price} Stars (${pack.priceRub} ₽)`, - buttons: [ - { - 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 - ); + try { + // Получаем ссылку на инвойс от бэкенда + const invoiceLink = await apiService.createInvoiceLink( + userId, + pack.price, + pack.tokens + pack.bonusTokens + ); - // Открываем встроенный платеж Telegram - webApp.openInvoice(invoiceLink, async (status: 'paid' | 'cancelled' | 'failed' | 'pending') => { - if (status === 'paid') { - try { - // Получаем обновленную информацию о пользователе - const userData = await apiService.getUserInfo(userId); - - if (onSuccess) { - onSuccess(userData); - } - } catch (error) { - console.error('Ошибка при получении данных пользователя:', error); - - // Даже если не удалось получить данные, вызываем onSuccess - if (onSuccess) { - onSuccess(); - } - } + // Открываем встроенный платеж Telegram без предварительного подтверждения + webApp.openInvoice(invoiceLink, async (status: 'paid' | 'cancelled' | 'failed' | 'pending') => { + if (status === 'paid') { + try { + // Получаем обновленную информацию о пользователе + const userData = await apiService.getUserInfo(userId); + + if (onSuccess) { + onSuccess(userData); } - }); - } catch (error) { - console.error('Ошибка при создании инвойса:', error); - webApp.showAlert('Произошла ошибка при создании платежа. Пожалуйста, попробуйте позже.'); + } catch (error) { + console.error('Ошибка при получении данных пользователя:', error); + + // Даже если не удалось получить данные, вызываем onSuccess + if (onSuccess) { + onSuccess(); + } + } } - } - }); + }); + } catch (error) { + console.error('Ошибка при создании инвойса:', error); + webApp.showAlert('Произошла ошибка при создании платежа. Пожалуйста, попробуйте позже.'); + } } };