Пейвол больших файлов из бота: /pay deep-link + освобождение по подписке
- /pay?tg&job&exp&sig: HMAC-проверка → сессия tg:<id> → /?pay_job=<id> → пейволл по заданию - /api/held/release: освобождение придержанного файла владельцу с активной подпиской - Фронт: ?pay_job открывает оплату файла (99₽/подписка); при активной подписке — освобождает бесплатно Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -1371,6 +1371,7 @@
|
||||
sub_autorenew_off: 'Автопродление выключено',
|
||||
sub_autorenew_disable: 'Отключить',
|
||||
sub_autorenew_enable: 'Включить',
|
||||
bot_file_released: 'Файл освобождён — обработка началась. Результат придёт в бот.',
|
||||
paywall_cancel: 'Отмена',
|
||||
paywall_need_login: 'Для подписки войдите в аккаунт',
|
||||
seo_title: 'Как работает pdf2scan',
|
||||
@@ -1515,6 +1516,7 @@
|
||||
sub_autorenew_off: 'Auto-renewal off',
|
||||
sub_autorenew_disable: 'Turn off',
|
||||
sub_autorenew_enable: 'Turn on',
|
||||
bot_file_released: 'File released — processing started. The result will arrive in the bot.',
|
||||
paywall_cancel: 'Cancel',
|
||||
paywall_need_login: 'Log in to subscribe',
|
||||
seo_title: 'How pdf2scan works',
|
||||
@@ -1659,6 +1661,7 @@
|
||||
sub_autorenew_off: 'Automatische Verlängerung aus',
|
||||
sub_autorenew_disable: 'Ausschalten',
|
||||
sub_autorenew_enable: 'Einschalten',
|
||||
bot_file_released: 'Datei freigegeben — Verarbeitung gestartet. Das Ergebnis kommt in den Bot.',
|
||||
paywall_cancel: 'Abbrechen',
|
||||
paywall_need_login: 'Zum Abonnieren anmelden',
|
||||
seo_title: 'So funktioniert pdf2scan',
|
||||
@@ -1803,6 +1806,7 @@
|
||||
sub_autorenew_off: 'Renouvellement automatique désactivé',
|
||||
sub_autorenew_disable: 'Désactiver',
|
||||
sub_autorenew_enable: 'Activer',
|
||||
bot_file_released: 'Fichier débloqué — traitement lancé. Le résultat arrivera dans le bot.',
|
||||
paywall_cancel: 'Annuler',
|
||||
paywall_need_login: 'Connectez-vous pour vous abonner',
|
||||
seo_title: 'Comment fonctionne pdf2scan',
|
||||
@@ -1947,6 +1951,7 @@
|
||||
sub_autorenew_off: 'Rinnovo automatico disattivato',
|
||||
sub_autorenew_disable: 'Disattiva',
|
||||
sub_autorenew_enable: 'Attiva',
|
||||
bot_file_released: 'File sbloccato — elaborazione avviata. Il risultato arriverà nel bot.',
|
||||
paywall_cancel: 'Annulla',
|
||||
paywall_need_login: 'Accedi per abbonarti',
|
||||
seo_title: 'Come funziona pdf2scan',
|
||||
@@ -2091,6 +2096,7 @@
|
||||
sub_autorenew_off: 'Renovación automática desactivada',
|
||||
sub_autorenew_disable: 'Desactivar',
|
||||
sub_autorenew_enable: 'Activar',
|
||||
bot_file_released: 'Archivo liberado — procesamiento iniciado. El resultado llegará al bot.',
|
||||
paywall_cancel: 'Cancelar',
|
||||
paywall_need_login: 'Inicia sesión para suscribirte',
|
||||
seo_title: 'Cómo funciona pdf2scan',
|
||||
@@ -2235,6 +2241,7 @@
|
||||
sub_autorenew_off: 'Renovação automática desativada',
|
||||
sub_autorenew_disable: 'Desativar',
|
||||
sub_autorenew_enable: 'Ativar',
|
||||
bot_file_released: 'Arquivo liberado — processamento iniciado. O resultado chegará no bot.',
|
||||
paywall_cancel: 'Cancelar',
|
||||
paywall_need_login: 'Entre para assinar',
|
||||
seo_title: 'Como funciona o pdf2scan',
|
||||
@@ -2628,6 +2635,22 @@
|
||||
if (!d.active) showPaywall(null, paywallFilePrice, (d.price || paywallSubPrice), 'renew');
|
||||
else scrollToSubCard();
|
||||
}
|
||||
// Пришли по ссылке оплаты файла из бота — открываем пейволл для этого задания
|
||||
if (window._payJobAfterLoad) {
|
||||
const job = window._payJobAfterLoad;
|
||||
window._payJobAfterLoad = null;
|
||||
if (d.active) {
|
||||
// уже есть подписка — освобождаем файл бесплатно, без повторной оплаты
|
||||
const body = { job_id: job };
|
||||
if (tgUser) body.user_id = tgUser.user_id || tgUser.id || 0;
|
||||
try {
|
||||
await fetch('/api/held/release', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(body) });
|
||||
showPaySuccess(t('bot_file_released'));
|
||||
} catch (_) {}
|
||||
} else {
|
||||
showPaywall(job, paywallFilePrice, (d.price || paywallSubPrice), 'file');
|
||||
}
|
||||
}
|
||||
} catch (_) { renderSubStatus({ active: false }); }
|
||||
}
|
||||
function renderSubStatus(d) {
|
||||
@@ -2833,6 +2856,12 @@
|
||||
window._openSubAfterLoad = true;
|
||||
try { history.replaceState({}, '', location.pathname); } catch (_) {}
|
||||
}
|
||||
// Приход по ссылке оплаты файла из бота (/pay → /?pay_job=<id>):
|
||||
// после загрузки сессии открываем пейволл для этого задания.
|
||||
if (p.has('pay_job')) {
|
||||
window._payJobAfterLoad = p.get('pay_job');
|
||||
try { history.replaceState({}, '', location.pathname); } catch (_) {}
|
||||
}
|
||||
})();
|
||||
|
||||
// ── Drop zone ─────────────────────────────────────────────────────────────
|
||||
|
||||
Reference in New Issue
Block a user