feat: 支付成功页直接显示卡密(激活失败也显示+手动指引)v1.8.4

购买页轮询到服务端发卡即渲染卡密框:等宽大字 + 一键复制(clipboard API + execCommand 降级)。自动激活成功显示「已自动激活本机」;失败显示「自动激活未生效」并指引粘贴卡密到侧边栏手动激活——付了钱拿不到卡密、只能找客服的情况不再出现。
This commit is contained in:
personal82555 committed 2026-10-20 22:17:52 +08:00
1 parent 98170e6d8a
commit 5be9027fe7
8 files changed
+128 -22

No files matched your search

+45 -15
View File
@@ -102,16 +102,11 @@ function startPolling() {
try {
const res = await chrome.runtime.sendMessage({ action: 'authQueryOrder', orderNo });
if (!res || !res.ok) return;
if (res.activated) {
if (res.cardKey) {
// 只要服务端已发卡就把卡密显示出来——哪怕自动激活失败,用户也能自己复制激活
clearInterval(pollTimer);
pollTimer = null;
showActivated(res);
} else if (res.cardKey && !res.activated) {
clearInterval(pollTimer);
pollTimer = null;
const status = $('order-status');
status.className = 'order-status error';
status.textContent = '✗ 已支付但激活失败:' + ((res.licenseState && res.licenseState.message) || '请把订单号发给客服手动处理');
showCard(res);
} else {
const status = $('order-status');
status.className = 'order-status pending';
@@ -123,16 +118,51 @@ function startPolling() {
}, 5000);
}
function showActivated(res) {
// 支付成功:显示卡密(激活成功/失败都显示,激活失败时给出手动激活指引)
function showCard(res) {
const status = $('order-status');
status.className = 'order-status success';
status.innerHTML = `
<div class="ok-title">✓ 支付成功,已自动激活</div>
<div class="ok-line">卡密:<b>${esc(res.cardKey || '')}</b></div>
<div class="ok-line">到期时间:${esc(res.expireTime || '永久')}</div>
<div class="ok-line muted">回到插件侧边栏即可使用全部功能(本机已授权)。</div>`;
const ok = !!res.activated;
status.className = 'order-status ' + (ok ? 'success' : 'error');
status.innerHTML = ok
? `<div class="ok-title">✓ 支付成功,已自动激活本机</div>
<div class="ok-line">到期时间:${esc(res.expireTime || '永久')}</div>
<div class="ok-line muted">回到插件侧边栏即可使用全部功能。</div>`
: `<div class="ok-title">✓ 支付成功</div>
<div class="ok-line warn">自动激活未生效${(res.licenseState && res.licenseState.message) ? ':' + esc(res.licenseState.message) : ''}</div>
<div class="ok-line muted">请复制下面的卡密,回到插件侧边栏「输入卡密」框粘贴 → 点「激活」即可。</div>`;
$('card-key').textContent = res.cardKey || '';
$('card-hint').textContent = ok
? '卡密已随本机自动激活,无需手动输入;保存好可换机或重装后使用。'
: '本页不会关闭也不会失效,卡密就在这里,随时可以复制。';
$('card-box').hidden = false;
$('card-box').scrollIntoView({ behavior: 'smooth', block: 'center' });
}
// 复制卡密(剪贴板 API 失败时降级 execCommand)
$('copy-card').addEventListener('click', async () => {
const key = ($('card-key').textContent || '').trim();
if (!key) return;
let ok = false;
try {
await navigator.clipboard.writeText(key);
ok = true;
} catch (e) { /* 降级 */ }
if (!ok) {
try {
const ta = document.createElement('textarea');
ta.value = key;
ta.style.cssText = 'position:fixed;left:-9999px';
document.body.appendChild(ta);
ta.select();
ok = document.execCommand('copy');
ta.remove();
} catch (e) { ok = false; }
}
$('copy-card').textContent = ok ? '✓ 已复制' : '复制失败,请手动选中卡密复制';
setTimeout(() => { $('copy-card').textContent = '复制卡密'; }, 2500);
});
document.querySelectorAll('.pay-btn').forEach((btn) => {
btn.addEventListener('click', () => createOrder(btn.dataset.pay));
});