Spaces:
Paused
Paused
File size: 5,089 Bytes
7482820 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 | /**
* 支付页面 JavaScript
*/
const COUNTRY_CURRENCY_MAP = {
SG: 'SGD', US: 'USD', TR: 'TRY', JP: 'JPY',
HK: 'HKD', GB: 'GBP', EU: 'EUR', AU: 'AUD',
CA: 'CAD', IN: 'INR', BR: 'BRL', MX: 'MXN',
};
let selectedPlan = 'plus';
let generatedLink = '';
// 初始化
document.addEventListener('DOMContentLoaded', () => {
loadAccounts();
});
// 加载账号列表
async function loadAccounts() {
try {
const resp = await fetch('/api/accounts?page=1&page_size=100&status=active');
const data = await resp.json();
const sel = document.getElementById('account-select');
sel.innerHTML = '<option value="">-- 请选择账号 --</option>';
(data.accounts || []).forEach(acc => {
const opt = document.createElement('option');
opt.value = acc.id;
opt.textContent = acc.email;
sel.appendChild(opt);
});
} catch (e) {
console.error('加载账号失败:', e);
}
}
// 国家切换
function onCountryChange() {
const country = document.getElementById('country-select').value;
const currency = COUNTRY_CURRENCY_MAP[country] || 'USD';
document.getElementById('currency-display').value = currency;
}
// 选择套餐
function selectPlan(plan) {
selectedPlan = plan;
document.getElementById('plan-plus').classList.toggle('selected', plan === 'plus');
document.getElementById('plan-team').classList.toggle('selected', plan === 'team');
document.getElementById('team-options').classList.toggle('show', plan === 'team');
// 隐藏已生成的链接
document.getElementById('link-box').classList.remove('show');
generatedLink = '';
}
// 生成支付链接
async function generateLink() {
const accountId = document.getElementById('account-select').value;
if (!accountId) {
ui.showToast('请先选择账号', 'warning');
return;
}
const country = document.getElementById('country-select').value || 'SG';
const body = {
account_id: parseInt(accountId),
plan_type: selectedPlan,
country: country,
};
if (selectedPlan === 'team') {
body.workspace_name = document.getElementById('workspace-name').value || 'MyTeam';
body.seat_quantity = parseInt(document.getElementById('seat-quantity').value) || 5;
body.price_interval = document.getElementById('price-interval').value;
}
const btn = document.querySelector('.form-actions .btn-primary');
if (btn) { btn.disabled = true; btn.textContent = '生成中...'; }
try {
const resp = await fetch('/api/payment/generate-link', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(body),
});
const data = await resp.json();
if (data.success && data.link) {
generatedLink = data.link;
document.getElementById('link-text').value = data.link;
document.getElementById('link-box').classList.add('show');
document.getElementById('open-status').textContent = '';
ui.showToast('支付链接生成成功', 'success');
} else {
ui.showToast(data.detail || '生成链接失败', 'error');
}
} catch (e) {
ui.showToast('请求失败: ' + e.message, 'error');
} finally {
if (btn) { btn.disabled = false; btn.textContent = '生成支付链接'; }
}
}
// 复制链接
function copyLink() {
if (!generatedLink) return;
navigator.clipboard.writeText(generatedLink).then(() => {
ui.showToast('已复制到剪贴板', 'success');
}).catch(() => {
const ta = document.getElementById('link-text');
ta.select();
document.execCommand('copy');
ui.showToast('已复制到剪贴板', 'success');
});
}
// 无痕打开浏览器(携带账号 cookie)
async function openIncognito() {
if (!generatedLink) {
ui.showToast('请先生成链接', 'warning');
return;
}
const accountId = document.getElementById('account-select').value;
const statusEl = document.getElementById('open-status');
statusEl.textContent = '正在打开...';
try {
const body = { url: generatedLink };
if (accountId) body.account_id = parseInt(accountId);
const resp = await fetch('/api/payment/open-incognito', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(body),
});
const data = await resp.json();
if (data.success) {
statusEl.textContent = '已在无痕模式打开浏览器';
ui.showToast('无痕浏览器已打开', 'success');
} else {
statusEl.textContent = data.message || '未找到可用浏览器,请手动复制链接';
ui.showToast(data.message || '未找到浏览器', 'warning');
}
} catch (e) {
statusEl.textContent = '请求失败: ' + e.message;
ui.showToast('请求失败', 'error');
}
}
|