StickerAI-Front/src/services/paymentService.ts

61 lines
2.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { TokenPack } from '../constants/tokenPacks';
import apiService from '../services/api';
import { getCurrentUserId } from '../constants/user';
export const paymentService = {
showBuyTokensPopup: async (pack: TokenPack, onSuccess?: (userData?: any) => void) => {
// Проверяем наличие Telegram WebApp
if (!window.Telegram?.WebApp) {
console.error('Telegram WebApp не доступен');
return;
}
const webApp = window.Telegram.WebApp;
const userId = getCurrentUserId();
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') {
// Функция для выполнения одной попытки получения данных пользователя
const fetchUserData = async (attempt: number) => {
try {
console.log(`Попытка ${attempt}/5 получения данных пользователя...`);
const userData = await apiService.getUserInfo(userId);
if (onSuccess) {
onSuccess(userData);
}
} catch (error) {
console.error(`Ошибка при получении данных пользователя (попытка ${attempt}/5):`, error);
// Если это последняя попытка и произошла ошибка, вызываем onSuccess без параметров
if (attempt === 5 && onSuccess) {
onSuccess();
}
}
};
// Выполняем первую попытку сразу
fetchUserData(1);
// Выполняем остальные попытки с интервалом в 1 секунду
for (let i = 2; i <= 5; i++) {
setTimeout(() => fetchUserData(i), (i - 1) * 1000);
}
}
});
} catch (error) {
console.error('Ошибка при создании инвойса:', error);
webApp.showAlert('Произошла ошибка при создании платежа. Пожалуйста, попробуйте позже.');
}
}
};