feat(auth): WeixinGzh QR/code login REST + server push endpoint
Add subscribe-mode static QR + keyword code login, service-mode scene QR polling, server URL verification, and modal-auth form/poll wiring.
This commit is contained in:
1 parent
72c0d10172
commit
ac3b765a83
3 files changed
+591
-6
No files matched your search
+48
-6
@@ -419,6 +419,37 @@
|
||||
|
||||
// ── QR Code Login (§10.7) ──
|
||||
|
||||
|
||||
function bindWeixingzhCodeForm(container) {
|
||||
if (!container) return;
|
||||
var form = container.querySelector('[data-aksrt-weixingzh-code]');
|
||||
if (!form || form._bound) return;
|
||||
form._bound = true;
|
||||
form.addEventListener('submit', function (e) {
|
||||
e.preventDefault();
|
||||
var input = form.querySelector('[name="code"]');
|
||||
var code = input ? String(input.value || '').trim() : '';
|
||||
if (!code) return;
|
||||
var btn = form.querySelector('button[type="submit"]');
|
||||
if (btn) btn.disabled = true;
|
||||
request('/auth/weixingzh-code', { code: code })
|
||||
.then(function (result) {
|
||||
var data = (result && result.data) || result || {};
|
||||
if ((result && result.ok) || (result && result.success) || data.logged_in) {
|
||||
onAuthSuccess(data.data || data);
|
||||
return;
|
||||
}
|
||||
throw new Error((result && (result.message || result.msg)) || '验证码错误');
|
||||
})
|
||||
.catch(function (err) {
|
||||
alert(err.message || '登录失败');
|
||||
})
|
||||
.finally(function () {
|
||||
if (btn) btn.disabled = false;
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function initQrLogin() {
|
||||
var qrPanel = modal.querySelector('[data-panel="qrcode"]');
|
||||
if (!qrPanel) return;
|
||||
@@ -442,9 +473,16 @@
|
||||
|
||||
request('/auth/qrcode-login', {})
|
||||
.then(function (result) {
|
||||
if (result.ok && result.data && result.data.qr_html) {
|
||||
container.innerHTML = result.data.qr_html;
|
||||
startQrPolling(result.data.check_url || '/auth/check-qrcode-login', result.data.token || '');
|
||||
var payload = (result && result.data) || result || {};
|
||||
var qrHtml = payload.qr_html || (payload.data && payload.data.qr_html) || '';
|
||||
var checkUrl = payload.check_url || (payload.data && payload.data.check_url) || '/auth/check-qrcode-login';
|
||||
var token = payload.token || (payload.data && payload.data.token) || '';
|
||||
if (qrHtml) {
|
||||
container.innerHTML = qrHtml;
|
||||
bindWeixingzhCodeForm(container);
|
||||
if (checkUrl && token) {
|
||||
startQrPolling(checkUrl, token);
|
||||
}
|
||||
} else {
|
||||
container.innerHTML = '<p class="aksrt-modal-auth__qr-error">扫码登录暂不可用</p>';
|
||||
}
|
||||
@@ -459,9 +497,13 @@
|
||||
qrLoginTimer = setInterval(function () {
|
||||
request(checkUrl, { token: token })
|
||||
.then(function (result) {
|
||||
if (result.ok && result.data && result.data.logged_in) {
|
||||
stopQrPolling();
|
||||
onAuthSuccess(result.data);
|
||||
var data = (result && result.data) || result || {};
|
||||
var body = data.data || data;
|
||||
if ((result && result.ok) || data.success || body.logged_in) {
|
||||
if (body.logged_in || (data.data && data.data.logged_in)) {
|
||||
stopQrPolling();
|
||||
onAuthSuccess(body.data || body);
|
||||
}
|
||||
}
|
||||
})
|
||||
.catch(function () { /* keep polling */ });
|
||||
|
||||
Reference in new issue
Block a user