export const AUDIT_BIZ_SIGN_HEADER = 'X-Audit-Biz-Sign';
|
|
/** 无电子签名操作使用的前端事件关联键;32 位 UUID 与后端 biz-sign 长度约束兼容。 */
|
export function createAuditCorrelationId(): string {
|
const randomUUID = globalThis.crypto?.randomUUID?.();
|
if (randomUUID) return randomUUID.replaceAll('-', '');
|
|
const bytes = new Uint8Array(16);
|
if (globalThis.crypto?.getRandomValues) {
|
globalThis.crypto.getRandomValues(bytes);
|
} else {
|
for (let index = 0; index < bytes.length; index++) bytes[index] = Math.floor(Math.random() * 256);
|
}
|
bytes[6] = (bytes[6]! & 0x0f) | 0x40;
|
bytes[8] = (bytes[8]! & 0x3f) | 0x80;
|
return Array.from(bytes, (value) => value.toString(16).padStart(2, '0')).join('');
|
}
|
|
/** 从在线表单提交外层对象或实际业务数据中提取后端签发的 biz_sign。 */
|
export function resolveAuditBizSign(payload: any): string {
|
const direct = resolveDirectAuditBizSign(payload);
|
if (direct) return direct;
|
for (const nestedPayload of [payload?.formData, payload?.map]) {
|
const nested = resolveDirectAuditBizSign(nestedPayload);
|
if (nested) return nested;
|
}
|
if (typeof payload?.data !== 'string') return '';
|
try {
|
const formData = JSON.parse(payload.data);
|
return resolveDirectAuditBizSign(formData);
|
} catch {
|
return '';
|
}
|
}
|
|
export function buildAuditBizSignHeaders(payload: any, fallbackBizSign?: unknown): Record<string, string> {
|
const bizSign = resolveAuditBizSign(payload) || resolveDirectAuditBizSign({ biz_sign: fallbackBizSign });
|
return bizSign ? { [AUDIT_BIZ_SIGN_HEADER]: bizSign } : {};
|
}
|
|
function isValidBizSign(value: unknown): boolean {
|
return value != null && /^[\w-]{1,40}$/.test(String(value).trim());
|
}
|
|
function resolveDirectAuditBizSign(payload: any): string {
|
const value = payload?.biz_sign ?? payload?.bizSign ?? payload?.biz_sign_jnpfId;
|
return isValidBizSign(value) ? String(value).trim() : '';
|
}
|