feat: 支付成功页直接显示卡密(激活失败也显示+手动指引)v1.8.4
购买页轮询到服务端发卡即渲染卡密框:等宽大字 + 一键复制(clipboard API + execCommand 降级)。自动激活成功显示「已自动激活本机」;失败显示「自动激活未生效」并指引粘贴卡密到侧边栏手动激活——付了钱拿不到卡密、只能找客服的情况不再出现。
This commit is contained in:
1 parent
98170e6d8a
commit
5be9027fe7
8 files changed
+128
-22
No files matched your search
@@ -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));
|
||||
});
|
||||
|
||||
Reference in new issue
Block a user