168 lines
8.1 KiB
JavaScript
168 lines
8.1 KiB
JavaScript
(function () {
|
|
'use strict';
|
|
|
|
function parseConfig(root) {
|
|
try { return JSON.parse(root.getAttribute('data-identity-config') || '{}'); } catch (_) { return {}; }
|
|
}
|
|
|
|
function uuid() {
|
|
if (window.crypto && crypto.randomUUID) return crypto.randomUUID();
|
|
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
|
var r = Math.random() * 16 | 0;
|
|
return (c === 'x' ? r : (r & 3 | 8)).toString(16);
|
|
});
|
|
}
|
|
|
|
function request(url, config, options) {
|
|
options = options || {};
|
|
options.credentials = 'same-origin';
|
|
options.headers = Object.assign({ 'X-WP-Nonce': config.nonce || '' }, options.headers || {});
|
|
return fetch(url, options).then(function (response) {
|
|
return response.json().then(function (payload) {
|
|
if (!response.ok || !payload || payload.success === false) {
|
|
throw new Error((payload && payload.message) || '请求失败');
|
|
}
|
|
return payload.data;
|
|
});
|
|
});
|
|
}
|
|
|
|
function loadScript(src) {
|
|
return new Promise(function (resolve, reject) {
|
|
var existing = document.querySelector('script[src="' + src + '"]');
|
|
if (existing) {
|
|
if (existing.dataset.loaded === '1') return resolve();
|
|
existing.addEventListener('load', resolve, { once: true });
|
|
existing.addEventListener('error', reject, { once: true });
|
|
return;
|
|
}
|
|
var script = document.createElement('script');
|
|
script.src = src;
|
|
script.async = true;
|
|
script.onload = function () { script.dataset.loaded = '1'; resolve(); };
|
|
script.onerror = reject;
|
|
document.head.appendChild(script);
|
|
});
|
|
}
|
|
|
|
function aliyunMetaInfo(config) {
|
|
if (config.provider !== 'aliyun') return Promise.resolve('');
|
|
return loadScript('https://o.alicdn.com/yd-cloudauth/cloudauth-cdn/jsvm_all.js').then(function () {
|
|
if (typeof window.getMetaInfo !== 'function') throw new Error('阿里云 MetaInfo 组件未加载成功');
|
|
var meta = window.getMetaInfo();
|
|
return typeof meta === 'string' ? meta : JSON.stringify(meta || {});
|
|
});
|
|
}
|
|
|
|
function init(root) {
|
|
if (!root || root.dataset.identityBound === '1') return;
|
|
root.dataset.identityBound = '1';
|
|
var config = parseConfig(root);
|
|
var modal = root.querySelector('#uc-auth-modal');
|
|
if (!modal) return;
|
|
var currentUuid = config.currentUuid || '';
|
|
var pollTimer = null;
|
|
var shouldPoll = false;
|
|
|
|
function open() { modal.classList.add('is-open'); modal.setAttribute('aria-hidden', 'false'); document.body.style.overflow = 'hidden'; }
|
|
function close() { modal.classList.remove('is-open'); modal.setAttribute('aria-hidden', 'true'); document.body.style.overflow = ''; }
|
|
root.querySelectorAll('[data-auth-modal-open]').forEach(function (button) { button.addEventListener('click', open); });
|
|
modal.querySelectorAll('[data-auth-modal-close]').forEach(function (button) { button.addEventListener('click', close); });
|
|
|
|
var statusBox = modal.querySelector('[data-auth-status]');
|
|
var createForm = modal.querySelector('[data-auth-create]');
|
|
var manualForm = modal.querySelector('[data-auth-manual]');
|
|
var stageNode = modal.querySelector('[data-auth-stage]');
|
|
var messageNode = modal.querySelector('[data-auth-status-message]');
|
|
var continueLink = modal.querySelector('[data-auth-continue]');
|
|
var refreshButton = modal.querySelector('[data-auth-refresh]');
|
|
var manualButton = modal.querySelector('[data-auth-manual-open]');
|
|
|
|
function render(data) {
|
|
if (!data) return;
|
|
currentUuid = data.uuid || currentUuid;
|
|
if (statusBox) statusBox.hidden = false;
|
|
if (createForm) createForm.hidden = true;
|
|
if (stageNode) stageNode.textContent = data.stage || data.status || '认证处理中';
|
|
if (messageNode) messageNode.textContent = data.message || '认证结果以站点服务端主动查询为准。';
|
|
if (continueLink) {
|
|
continueLink.hidden = !data.redirect_url;
|
|
if (data.redirect_url) continueLink.href = data.redirect_url;
|
|
}
|
|
if (manualButton) manualButton.hidden = data.next_action !== 'manual_or_retry';
|
|
shouldPoll = data.next_action === 'poll';
|
|
if (data.status === 'verified') {
|
|
shouldPoll = false;
|
|
stopPolling();
|
|
window.setTimeout(function () { window.location.reload(); }, 500);
|
|
} else if (shouldPoll) {
|
|
schedulePoll(data.poll_interval || 5);
|
|
} else {
|
|
stopPolling();
|
|
}
|
|
}
|
|
|
|
function refresh() {
|
|
if (!currentUuid) return Promise.resolve();
|
|
return request(config.restBase + '/' + encodeURIComponent(currentUuid) + '/refresh', config, { method: 'POST' }).then(render);
|
|
}
|
|
function schedulePoll(seconds) { stopPolling(); shouldPoll = true; pollTimer = window.setTimeout(function () { refresh().catch(function () {}).finally(function () { if (shouldPoll && currentUuid) schedulePoll(seconds); }); }, Math.max(3, seconds) * 1000); }
|
|
function stopPolling() { shouldPoll = false; if (pollTimer) window.clearTimeout(pollTimer); pollTimer = null; }
|
|
if (refreshButton) refreshButton.addEventListener('click', function () { refresh().catch(function (error) { if (messageNode) messageNode.textContent = error.message; }); });
|
|
document.addEventListener('visibilitychange', function () { if (document.visibilityState === 'visible' && currentUuid) refresh().catch(function () {}); });
|
|
|
|
if (createForm) {
|
|
var typeSelect = createForm.querySelector('[name="type"]');
|
|
var enterprise = createForm.querySelector('[data-enterprise-fields]');
|
|
var personLabel = createForm.querySelector('[data-auth-person-label]');
|
|
var idLabel = createForm.querySelector('[data-auth-id-label]');
|
|
function syncEnterprise() {
|
|
var enabled = typeSelect && typeSelect.value === 'enterprise';
|
|
if (enterprise) enterprise.hidden = !enabled;
|
|
if (enterprise) enterprise.querySelectorAll('input').forEach(function (input) { input.required = enabled; });
|
|
if (personLabel) personLabel.textContent = enabled ? '法定代表人姓名' : '真实姓名';
|
|
if (idLabel) idLabel.textContent = enabled ? '法定代表人身份证号' : '身份证号码';
|
|
}
|
|
if (typeSelect) typeSelect.addEventListener('change', syncEnterprise);
|
|
syncEnterprise();
|
|
createForm.addEventListener('submit', function (event) {
|
|
event.preventDefault();
|
|
var form = new FormData(createForm);
|
|
var payload = {};
|
|
form.forEach(function (value, key) { payload[key] = value; });
|
|
payload.consent = payload.consent === '1';
|
|
payload.client_request_id = uuid();
|
|
var button = createForm.querySelector('[type="submit"]');
|
|
if (button) button.disabled = true;
|
|
aliyunMetaInfo(config).then(function (metaInfo) {
|
|
if (metaInfo) payload.meta_info = metaInfo;
|
|
return request(config.restBase, config, {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(payload)
|
|
});
|
|
}).then(render).catch(function (error) {
|
|
var node = createForm.querySelector('[data-auth-message]');
|
|
if (node) node.textContent = error.message;
|
|
if (button) button.disabled = false;
|
|
});
|
|
});
|
|
}
|
|
|
|
if (manualButton) manualButton.addEventListener('click', function () { if (manualForm) manualForm.hidden = false; });
|
|
if (manualForm) manualForm.addEventListener('submit', function (event) {
|
|
event.preventDefault();
|
|
if (!currentUuid) return;
|
|
var files = manualForm.querySelector('[name="evidence[]"]');
|
|
if (files && files.files.length > 3) return window.alert('证明材料最多上传 3 张');
|
|
var body = new FormData();
|
|
Array.prototype.forEach.call((files && files.files) || [], function (file) { body.append('evidence[]', file); });
|
|
request(config.restBase + '/' + encodeURIComponent(currentUuid) + '/manual', config, { method: 'POST', body: body }).then(render).catch(function (error) { window.alert(error.message); });
|
|
});
|
|
|
|
if (currentUuid && ['provider_pending', 'provider_processing'].indexOf(config.currentStage) !== -1) schedulePoll(5);
|
|
}
|
|
|
|
window.AKSRTUserCenterAuth = { init: init };
|
|
})();
|