// ============ 小程序扫码登录功能 ============ let miniappScene = ''; let miniappPollTimer = null; let miniappPollCount = 0; // 加载小程序二维码 async function loadMiniappQRCode() { const qrLoading = document.getElementById('qrLoading'); const qrImg = document.getElementById('qrCodeImg'); const qrExpired = document.getElementById('qrExpired'); qrLoading.style.display = 'flex'; qrImg.style.display = 'none'; qrExpired.style.display = 'none'; updateQRStatus('pending', '等待扫码...'); try { // 1. 生成 scene 码 const genResponse = await fetch(`${API_BASE}/miniapp-auth/generate-qr`, { method: 'POST', headers: { 'Content-Type': 'application/json' } }); const genData = await genResponse.json(); if (genData.code !== 200) { showToast(genData.message || '生成二维码失败', 'error'); qrLoading.innerHTML = ' 加载失败'; return; } miniappScene = genData.data.scene; // 2. 获取小程序码图片 const qrResponse = await fetch(`${API_BASE}/miniapp-auth/get-wxacode`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ scene: miniappScene }) }); const qrData = await qrResponse.json(); if (qrData.code !== 200) { showToast(qrData.message || '获取小程序码失败', 'error'); qrLoading.innerHTML = ' 加载失败'; return; } // 3. 显示二维码 qrImg.src = qrData.data.qr_url; qrImg.onload = () => { qrLoading.style.display = 'none'; qrImg.style.display = 'block'; }; // 4. 开始轮询 startMiniappPolling(); } catch (error) { console.error('加载小程序码失败:', error); qrLoading.innerHTML = ' 网络错误'; } } // 刷新二维码 function refreshQRCode() { miniappPollCount = 0; loadMiniappQRCode(); } // 开始轮询登录状态 function startMiniappPolling() { stopMiniappPolling(); miniappPollCount = 0; const poll = async () => { if (!miniappScene || miniappPollCount >= 60) { stopMiniappPolling(); document.getElementById('qrExpired').style.display = 'flex'; return; } try { const response = await fetch(`${API_BASE}/miniapp-auth/check-status?scene=${miniappScene}`); const data = await response.json(); if (data.code === 200) { const status = data.data.status; switch (status) { case 'confirmed': stopMiniappPolling(); updateQRStatus('success', '登录成功'); localStorage.setItem('user_token', data.data.token); localStorage.setItem('user_info', JSON.stringify(data.data.user)); showToast('登录成功', 'success'); setTimeout(() => location.href = getRedirectUrl(), 1000); return; case 'scanned': updateQRStatus('scanned', '已扫码,等待确认...'); break; case 'pending': default: updateQRStatus('pending', '等待扫码...'); break; } } else if (data.code === 410) { stopMiniappPolling(); document.getElementById('qrExpired').style.display = 'flex'; updateQRStatus('error', '二维码已过期'); return; } } catch (error) { console.error('轮询失败:', error); } miniappPollCount++; miniappPollTimer = setTimeout(poll, 5000); }; poll(); } // 停止轮询 function stopMiniappPolling() { if (miniappPollTimer) { clearTimeout(miniappPollTimer); miniappPollTimer = null; } } // 更新二维码状态显示 function updateQRStatus(status, text) { const statusEl = document.getElementById('qrStatus'); const statusClass = status === 'pending' ? 'pending' : status === 'scanned' ? 'scanned' : status === 'success' ? 'success' : 'error'; statusEl.innerHTML = `${text}`; }