diff --git a/CHANGELOG.md b/CHANGELOG.md index 5dda462..7349fae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,14 @@ B站评论助手 版本历史。下载:https://dl.88531.cn/bili.html ·  --- +## v1.10.7 · 2026-10-21 + +### ✨ 新功能 +- **关掉购买页也不会丢卡**:订单号自动存在本地(30 分钟内有效),重新打开购买页会**自动恢复上次未完成的订单并继续查询支付结果**,套餐也会自动选回 +- 拿到卡密/激活成功后自动清除本地待处理订单,不会残留旧订单 + +--- + ## v1.10.6 · 2026-10-21 ### ✨ 新功能 diff --git a/buy.js b/buy.js index cb41099..ba9b3b1 100644 --- a/buy.js +++ b/buy.js @@ -7,6 +7,30 @@ let pollTimer = null; let lastPayType = null; // 记住当前支付方式,「重新下单」时直接复用 let payHelpShown = false; let helpTipStage = 0; // 1=30秒提示 2=120秒提示;同阶段不重复覆盖刚点出来的反馈 +const PENDING_KEY = 'biliBuyPendingOrder'; + +/** 订单号落本地:关掉页面再回来也能接着查卡,不会「付了钱拿不到码」 */ +function savePending() { + try { + localStorage.setItem(PENDING_KEY, JSON.stringify({ + orderNo, payType: lastPayType, + cardTypeId: selected ? selected.id : null, at: Date.now() + })); + } catch (e) { /* 隐私模式下不可用则忽略 */ } +} + +function clearPending() { + try { localStorage.removeItem(PENDING_KEY); } catch (e) {} +} + +function readPending(maxAgeMs) { + try { + const d = JSON.parse(localStorage.getItem(PENDING_KEY) || 'null'); + if (!d || !d.orderNo) return null; + if (!d.at || Date.now() - d.at > maxAgeMs) { clearPending(); return null; } + return d; + } catch (e) { return null; } +} function esc(s) { return String(s == null ? '' : s).replace(/[&<>"']/g, (c) => ({ @@ -79,6 +103,7 @@ async function createOrder(payType) { if (!res || !res.ok) throw new Error((res && res.message) || '创建订单失败'); orderNo = res.order.orderNo; + savePending(); status.textContent = `订单 ${orderNo}(¥${res.order.amount})已创建,正在打开支付页面…`; if (res.payUrl) window.open(res.payUrl, '_blank'); startPolling(); @@ -110,11 +135,13 @@ async function queryOrderOnce() { if (res.activated) { clearInterval(pollTimer); pollTimer = null; + clearPending(); showActivated(res); } else if (res.cardKey) { clearInterval(pollTimer); pollTimer = null; hidePayHelp(); + clearPending(); const status = $('order-status'); status.className = 'order-status error'; status.innerHTML = '✗ 已支付并已发卡,但自动激活未成功(' + @@ -180,6 +207,30 @@ function hidePayHelp() { if (tip) tip.textContent = ''; } +/** 打开购买页时恢复上次未完成的订单:关掉页面也不会「付了钱拿不到码」 */ +function resumePending() { + const d = readPending(30 * 60 * 1000); + if (!d) return; + orderNo = d.orderNo; + if (d.payType) lastPayType = d.payType; + if (d.cardTypeId && !selected) { + const p = packages.find((x) => String(x.id) === String(d.cardTypeId)); + if (p) { + selected = p; + document.querySelectorAll('.package').forEach((el) => { + el.classList.toggle('active', el.dataset.id === String(d.cardTypeId)); + }); + $('chosen-package').innerHTML = `已选商品:${esc(p.name)} 价格 ¥${esc(p.price)} ${esc(durationText(p.duration_days))}`; + $('step-pay').hidden = false; + } + } + $('order-panel').hidden = false; + const st = $('order-status'); + st.className = 'order-status pending'; + st.textContent = '⏳ 已恢复上次未完成的订单 ' + orderNo + ',正在查询支付结果…'; + startPolling(); +} + function wirePayHelp() { const rf = $('ph-refresh'), rn = $('ph-renew'); if (rf) rf.addEventListener('click', async () => { @@ -266,4 +317,4 @@ $('cb-copy') && $('cb-copy').addEventListener('click', async () => { }); wirePayHelp(); -loadPackages(); +loadPackages().then(resumePending); diff --git a/manifest.json b/manifest.json index 272f8cd..cb58e41 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "B站评论助手", - "version": "1.10.6", + "version": "1.10.7", "description": "B站网页版关键词评论助手:按搜索关键词找视频,默认模拟真人(打开视频页、滚到评论区、逐字输入、点发布),也可快速API直发;支持下载当前页视频;带防重复记录、可中断执行与页面实时进度浮层。", "permissions": ["storage", "tabs", "scripting", "sidePanel", "downloads", "declarativeNetRequest", "alarms"], "host_permissions": [