文生文 · 对话
提示

    
function copyCode(elem) { navigator.clipboard.writeText(elem.innerText); const original = elem.innerText; elem.innerText = '已复制'; setTimeout(() => elem.innerText = original, 1000); } async function bindInvite() { const code = document.getElementById('inputInviteCode').value.trim(); if(!code) return toast('提示', '请输入邀请码'); try { const res = await fetch('/user/bindInvite', { method: 'POST', headers: getAuthHeaders('application/x-www-form-urlencoded'), body: `code=${code}` }); const data = await res.json(); if(data.error) { toast('失败', data.error); } else { toast('成功', data.message); fetchUserInfo(); } } catch(e) { toast('绑定失败', e.message || '绑定失败'); } } async function loadProducts() { const list = document.getElementById('productList'); list.innerHTML = '加载中...'; try { const res = await fetch('/payment/products'); const products = await res.json(); list.innerHTML = ''; products.forEach(p => { const card = document.createElement('div'); card.className = 'product-card'; card.onclick = () => selectProduct(p.id, card); card.innerHTML = `
${p.name}
¥${p.price}
${p.type === 'subscription' ? '时长: '+p.value+'天' : '流量: '+p.value+' Tokens'}
`; list.appendChild(card); }); } catch (e) { list.innerHTML = '加载失败'; } } function selectProduct(pid, cardElem) { selectedProductId = pid; document.querySelectorAll('.product-card').forEach(c => c.classList.remove('selected')); cardElem.classList.add('selected'); const area = document.getElementById('payActionArea'); if(!document.getElementById('btnPay')) { area.innerHTML = ''; const btn = document.createElement('button'); btn.id = 'btnPay'; btn.className = 'btn primary'; btn.style.width = '100%'; btn.style.marginTop = '15px'; btn.innerText = '立即支付'; btn.onclick = doPay; area.appendChild(btn); } } async function doPay() { if(!selectedProductId) return toast('提示', '请选择商品'); const payMethod = document.querySelector('input[name="payMethod"]:checked').value; try { const res = await fetch('/payment/create_order', { method: 'POST', headers: getAuthHeaders('application/x-www-form-urlencoded'), body: `product_id=${selectedProductId}&pay_method=${payMethod}` }); const data = await res.json(); if(data.error) return toast('失败', data.error); const order = data.order; // Mock Pay const ok = await uiConfirm(`订单已创建: ${order.order_no}\n金额: ¥${order.amount}\n\n模拟支付成功?`, '模拟支付'); if(ok) { const payRes = await fetch('/payment/pay', { method: 'POST', headers: {'Content-Type': 'application/x-www-form-urlencoded'}, body: `order_no=${order.order_no}` }); const payData = await payRes.json(); if(payData.message === 'Payment successful') { toast('成功', '支付成功!'); closeWallet(); fetchUserInfo(); } else { toast('支付失败', (payData.error || payData.message || '支付失败')); } } } catch (e) { toast('系统错误', e.message || '系统错误'); } } // Init fetchUserInfo();