v1.10.7: 购买页订单号本地持久化——关页面重开自动恢复订单继续查卡
This commit is contained in:
1 parent
f231657560
commit
ec0f342ee4
3 files changed
+61
-2
No files matched your search
@@ -4,6 +4,14 @@ B站评论助手 版本历史。下载:https://dl.88531.cn/bili.html ·
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
## v1.10.7 · 2026-10-21
|
||||||
|
|
||||||
|
### ✨ 新功能
|
||||||
|
- **关掉购买页也不会丢卡**:订单号自动存在本地(30 分钟内有效),重新打开购买页会**自动恢复上次未完成的订单并继续查询支付结果**,套餐也会自动选回
|
||||||
|
- 拿到卡密/激活成功后自动清除本地待处理订单,不会残留旧订单
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## v1.10.6 · 2026-10-21
|
## v1.10.6 · 2026-10-21
|
||||||
|
|
||||||
### ✨ 新功能
|
### ✨ 新功能
|
||||||
|
|||||||
@@ -7,6 +7,30 @@ let pollTimer = null;
|
|||||||
let lastPayType = null; // 记住当前支付方式,「重新下单」时直接复用
|
let lastPayType = null; // 记住当前支付方式,「重新下单」时直接复用
|
||||||
let payHelpShown = false;
|
let payHelpShown = false;
|
||||||
let helpTipStage = 0; // 1=30秒提示 2=120秒提示;同阶段不重复覆盖刚点出来的反馈
|
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) {
|
function esc(s) {
|
||||||
return String(s == null ? '' : s).replace(/[&<>"']/g, (c) => ({
|
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) || '创建订单失败');
|
if (!res || !res.ok) throw new Error((res && res.message) || '创建订单失败');
|
||||||
|
|
||||||
orderNo = res.order.orderNo;
|
orderNo = res.order.orderNo;
|
||||||
|
savePending();
|
||||||
status.textContent = `订单 ${orderNo}(¥${res.order.amount})已创建,正在打开支付页面…`;
|
status.textContent = `订单 ${orderNo}(¥${res.order.amount})已创建,正在打开支付页面…`;
|
||||||
if (res.payUrl) window.open(res.payUrl, '_blank');
|
if (res.payUrl) window.open(res.payUrl, '_blank');
|
||||||
startPolling();
|
startPolling();
|
||||||
@@ -110,11 +135,13 @@ async function queryOrderOnce() {
|
|||||||
if (res.activated) {
|
if (res.activated) {
|
||||||
clearInterval(pollTimer);
|
clearInterval(pollTimer);
|
||||||
pollTimer = null;
|
pollTimer = null;
|
||||||
|
clearPending();
|
||||||
showActivated(res);
|
showActivated(res);
|
||||||
} else if (res.cardKey) {
|
} else if (res.cardKey) {
|
||||||
clearInterval(pollTimer);
|
clearInterval(pollTimer);
|
||||||
pollTimer = null;
|
pollTimer = null;
|
||||||
hidePayHelp();
|
hidePayHelp();
|
||||||
|
clearPending();
|
||||||
const status = $('order-status');
|
const status = $('order-status');
|
||||||
status.className = 'order-status error';
|
status.className = 'order-status error';
|
||||||
status.innerHTML = '✗ <b>已支付并已发卡</b>,但自动激活未成功(' +
|
status.innerHTML = '✗ <b>已支付并已发卡</b>,但自动激活未成功(' +
|
||||||
@@ -180,6 +207,30 @@ function hidePayHelp() {
|
|||||||
if (tip) tip.textContent = '';
|
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 = `已选商品:<b>${esc(p.name)}</b> 价格 <b>¥${esc(p.price)}</b> ${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() {
|
function wirePayHelp() {
|
||||||
const rf = $('ph-refresh'), rn = $('ph-renew');
|
const rf = $('ph-refresh'), rn = $('ph-renew');
|
||||||
if (rf) rf.addEventListener('click', async () => {
|
if (rf) rf.addEventListener('click', async () => {
|
||||||
@@ -266,4 +317,4 @@ $('cb-copy') && $('cb-copy').addEventListener('click', async () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
wirePayHelp();
|
wirePayHelp();
|
||||||
loadPackages();
|
loadPackages().then(resumePending);
|
||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"manifest_version": 3,
|
"manifest_version": 3,
|
||||||
"name": "B站评论助手",
|
"name": "B站评论助手",
|
||||||
"version": "1.10.6",
|
"version": "1.10.7",
|
||||||
"description": "B站网页版关键词评论助手:按搜索关键词找视频,默认模拟真人(打开视频页、滚到评论区、逐字输入、点发布),也可快速API直发;支持下载当前页视频;带防重复记录、可中断执行与页面实时进度浮层。",
|
"description": "B站网页版关键词评论助手:按搜索关键词找视频,默认模拟真人(打开视频页、滚到评论区、逐字输入、点发布),也可快速API直发;支持下载当前页视频;带防重复记录、可中断执行与页面实时进度浮层。",
|
||||||
"permissions": ["storage", "tabs", "scripting", "sidePanel", "downloads", "declarativeNetRequest", "alarms"],
|
"permissions": ["storage", "tabs", "scripting", "sidePanel", "downloads", "declarativeNetRequest", "alarms"],
|
||||||
"host_permissions": [
|
"host_permissions": [
|
||||||
|
|||||||
Reference in new issue
Block a user