优化支付宝支付流程与 Web 端体验
- 支付宝新窗口跳转,轮询与手动刷新增加加载反馈 - 支付回跳先校验订单状态,避免未付款误报成功 - 门户登录回调统一,云文件打开加载与版本冲突同步 - 精简本地 start.bat 与 README 说明 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user