优化支付宝支付流程与 Web 端体验

- 支付宝新窗口跳转,轮询与手动刷新增加加载反馈
- 支付回跳先校验订单状态,避免未付款误报成功
- 门户登录回调统一,云文件打开加载与版本冲突同步
- 精简本地 start.bat 与 README 说明

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
24kycj
2026-06-23 11:27:45 +08:00
parent 23b958753d
commit 4d19d7e814
13 changed files with 400 additions and 214 deletions
+64 -17
View File
@@ -135,6 +135,7 @@
}
function soonReportSaveError(err) {
if (err && err.conflictSynced) return;
if (typeof window.soonShowApiError === 'function') {
window.soonShowApiError({
status: err && err.status,
@@ -656,9 +657,22 @@
}
function soonReportOpenLoadError(message) {
soonHideOpenFileLoading();
soonToast(message || '文件加载失败', 'error');
}
function soonShowOpenFileLoading() {
if (typeof layer === 'undefined' || !layer.load) return;
soonHideOpenFileLoading();
window._soonOpenLoadIdx = layer.load(1, { shade: [0.12, '#000'] });
}
function soonHideOpenFileLoading() {
if (window._soonOpenLoadIdx == null) return;
if (typeof layer !== 'undefined' && layer.close) layer.close(window._soonOpenLoadIdx);
window._soonOpenLoadIdx = null;
}
function soonToast(message, type) {
if (typeof window.soonToast === 'function') window.soonToast(message, type);
}
@@ -737,29 +751,60 @@
return String(pathOrKey).split(/[/\\]/).pop();
}
function soonFetchOrderStatus(orderNo) {
var url = soonApiBase() + '/pay/orders/' + encodeURIComponent(orderNo);
var fetchFn = typeof window.soonAuthedFetch === 'function'
? window.soonAuthedFetch(url, { headers: { Accept: 'application/json' } })
: fetch(url, { headers: { Authorization: 'Bearer ' + soonGetAccessToken(), Accept: 'application/json' } });
return fetchFn.then(function (r) {
if (!r.ok) return null;
return r.json();
}).then(function (j) {
return j && j.ok && j.data ? j.data : null;
}).catch(function () {
return null;
});
}
function soonPollOrderPaid(orderNo, attemptsLeft, delayMs) {
return soonFetchOrderStatus(orderNo).then(function (data) {
if (data && data.status === 'paid') return data;
if (attemptsLeft <= 1) return data;
return new Promise(function (resolve) {
setTimeout(function () {
resolve(soonPollOrderPaid(orderNo, attemptsLeft - 1, delayMs));
}, delayMs);
});
});
}
function soonHandlePayReturn() {
var paid = null;
var flag = false;
var orderNo = null;
try {
paid = new URLSearchParams(location.search).get('paid');
orderNo = new URLSearchParams(location.search).get('paid');
} catch (e) { /* ignore */ }
try {
flag = !!sessionStorage.getItem('soon_pay_return');
} catch (e) { /* ignore */ }
if (!paid && !flag) return;
try {
sessionStorage.removeItem('soon_pay_return');
} catch (e) { /* ignore */ }
if (paid) {
try {
var u = new URL(location.href);
u.searchParams.delete('paid');
history.replaceState(null, '', u.pathname + (u.search || '') + (u.hash || ''));
} catch (e) { /* ignore */ }
}
soonLoadMembership(true).then(function () {
soonRefreshPortalIdentity();
soonToast('支付成功,会员已激活', 'success');
if (!orderNo) return;
try {
var u = new URL(location.href);
u.searchParams.delete('paid');
history.replaceState(null, '', u.pathname + (u.search || '') + (u.hash || ''));
} catch (e) { /* ignore */ }
if (!soonGetAccessToken()) return;
soonPollOrderPaid(orderNo, 10, 3000).then(function (data) {
if (data && data.status === 'paid') {
return soonLoadMembership(true).then(function () {
soonRefreshPortalIdentity();
soonToast('支付成功,会员已激活', 'success');
});
}
if (data && data.status === 'cancelled') {
soonToast('订单已取消', 'warn');
return;
}
soonToast('支付尚未完成,如已付款请稍后在会员中心查看', 'warn');
});
}
@@ -783,6 +828,8 @@
window.soonTryConsumeCloudImport = soonTryConsumeCloudImport;
window.soonClearPendingImport = soonClearPendingImport;
window.soonReportOpenLoadError = soonReportOpenLoadError;
window.soonShowOpenFileLoading = soonShowOpenFileLoading;
window.soonHideOpenFileLoading = soonHideOpenFileLoading;
window.soonParseTemplateKey = soonParseTemplateKey;
window.soonMakeTemplateKey = soonMakeTemplateKey;
window.soonSoonTypeFromJson = soonSoonTypeFromJson;