Referencia de Mensajes
Detalle completo de todos los mensajes que podés enviar y recibir del iframe.
Resumen
| Mensaje | Dirección | Descripción |
|---|---|---|
lakaut.init | Tu app → Iframe | Inicializar sesión |
lakaut.load.file | Tu app → Iframe | Enviar documento para firmar |
lakaut.ready | Iframe → Tu app | Iframe listo para recibir init |
lakaut.handshake.ack | Iframe → Tu app | Confirma conexión establecida |
lakaut.signature.completed | Iframe → Tu app | Notifica firma exitosa |
lakaut.error | Iframe → Tu app | Notifica error |
Mensajes que enviás al iframe
lakaut.init
Inicializá la sesión de firma. Debe enviarse después de recibir lakaut.ready o cuando el iframe haya cargado.
iframe.contentWindow.postMessage({
type: 'lakaut.init',
payload: {
nonce: 'uuid-unico-sesion',
idemKey: 'uuid-idempotencia',
integratorId: 'tu-integrator-id',
userData: {
dni: '12345678',
cuil: '20-12345678-9',
email: 'usuario@empresa.com',
gender: 'M',
phone: '1122334455',
name: 'Juan Pérez',
address: 'Av. Corrientes 1234, CABA'
},
// Opcional: cargar documento en el init
autoLoadFile: {
fileName: 'contrato.pdf',
mime: 'application/pdf',
base64: 'JVBERi0xLjcK...'
}
}
}, 'https://www.lakautac.com.ar');
Campos del payload
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
nonce | string | ✅ | UUID único para esta sesión. Usar crypto.randomUUID() |
idemKey | string | ✅ | Clave de idempotencia. Previene firmas duplicadas si se reintenta |
integratorId | string | ✅ | Tu identificador de integrador (proporcionado por Lakaut) |
userData | object | ✅ | Datos del usuario firmante |
userData.dni | string | ⚪ | DNI del firmante (8 dígitos). Alternativa a CUIL |
userData.cuil | string | ⚪ | CUIL del firmante (formato: XX-XXXXXXXX-X) |
userData.email | string | ✅ | Email del firmante |
userData.gender | string | ✅ | Género: 'M' (masculino), 'F' (femenino) o 'X' (otro) |
userData.phone | string | ✅ | Número de teléfono del firmante (10 dígitos) |
userData.name | string | ⚪ | Nombre completo del firmante |
userData.address | string | ⚪ | Domicilio del firmante |
autoLoadFile | object | ⚪ | Documento a cargar automáticamente |
autoLoadFile.fileName | string | ✅* | Nombre del archivo |
autoLoadFile.mime | string | ✅* | Tipo MIME ('application/pdf') |
autoLoadFile.base64 | string | ✅* | Contenido en Base64 sin prefijo |
*Requerido si se incluye autoLoadFile
Podés enviar dni o cuil (o ambos). Si enviás solo el DNI, el sistema puede derivar el CUIL automáticamente junto con el género.
lakaut.load.file
Enviá un documento para que el usuario lo firme. Debe enviarse después de recibir lakaut.handshake.ack.
iframe.contentWindow.postMessage({
type: 'lakaut.load.file',
payload: {
fileName: 'contrato.pdf',
mime: 'application/pdf',
base64: 'JVBERi0xLjcK...'
}
}, 'https://www.lakautac.com.ar');
Campos del payload
| Campo | Tipo | Requerido | Descripción |
|---|---|---|---|
fileName | string | ✅ | Nombre del archivo a mostrar al usuario |
mime | string | ✅ | Tipo MIME. Debe ser 'application/pdf' |
base64 | string | ✅ | Contenido del PDF en Base64 (sin prefijo data:...) |
El fileName se muestra al usuario durante el proceso de firma. Usá un nombre descriptivo como "Contrato de Servicios - Cliente ABC.pdf".
También podés enviar el documento directamente en lakaut.init usando el campo autoLoadFile, evitando la necesidad de enviar este mensaje por separado.
Mensajes que recibís del iframe
lakaut.ready
Notifica que el iframe cargó y está listo para recibir la inicialización.
window.addEventListener('message', (event) => {
if (event.origin !== 'https://www.lakautac.com.ar') return;
if (event.data.type === 'lakaut.ready') {
console.log('Iframe listo, enviando init...');
enviarInit();
}
});
Payload
Este mensaje no incluye payload adicional.
Usá lakaut.ready en lugar de iframe.onload para saber cuándo enviar el init. Es más confiable porque confirma que el código del iframe está ejecutándose.
lakaut.handshake.ack
Confirma que el iframe recibió la inicialización y está listo para operar.
window.addEventListener('message', (event) => {
if (event.origin !== 'https://www.lakautac.com.ar') return;
if (event.data.type === 'lakaut.handshake.ack') {
console.log('Conexión establecida, iframe listo');
// Ahora podés enviar lakaut.load.file si querés
}
});
Payload
Este mensaje no incluye payload adicional.
lakaut.signature.completed
Notifica que el usuario completó la firma exitosamente. Incluye el documento firmado.
{
type: 'lakaut.signature.completed',
payload: {
eventId: 'uuid-del-evento',
idemKey: 'uuid-original-que-enviaste',
signedDocId: 'signed_abc123',
document: {
fileName: 'contrato.pdf',
mime: 'application/pdf',
size: 248950,
sha256: 'a1b2c3d4e5f6...',
objectKey: 's3-key-interno'
},
consumption: 'FIRMA_SIMPLE',
delivery: {
mode: 'binary',
fileBase64: 'JVBERi0xLjcK...'
}
}
}
Campos del payload
| Campo | Tipo | Descripción |
|---|---|---|
eventId | string | Identificador único de este evento |
idemKey | string | La misma idemKey que enviaste en lakaut.init |
signedDocId | string | ID único del documento firmado (para referencia futura) |
document.fileName | string | Nombre del archivo firmado |
document.mime | string | Tipo MIME del documento ('application/pdf') |
document.size | number | Tamaño en bytes del documento firmado |
document.sha256 | string | Hash SHA256 del documento para verificación de integridad |
document.objectKey | string | Referencia interna (no usar) |
consumption | string | Tipo de firma aplicada (ej: 'FIRMA_SIMPLE') |
delivery.mode | string | Modo de entrega: 'binary' o 'url' |
delivery.fileBase64 | string | Documento firmado en Base64 (cuando mode es 'binary') |
delivery.url | string | URL de descarga (cuando mode es 'url') |
Descargar el documento firmado
function descargarDocumentoFirmado(payload) {
const { signedDocId, document, delivery } = payload;
if (delivery.mode === 'binary') {
// Decodificar Base64
const byteCharacters = atob(delivery.fileBase64);
const byteNumbers = new Array(byteCharacters.length);
for (let i = 0; i < byteCharacters.length; i++) {
byteNumbers[i] = byteCharacters.charCodeAt(i);
}
const byteArray = new Uint8Array(byteNumbers);
const blob = new Blob([byteArray], { type: document.mime });
// Crear link de descarga
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = document.fileName || `firmado-${signedDocId}.pdf`;
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
URL.revokeObjectURL(url);
}
}
lakaut.error
Notifica que ocurrió un error durante el proceso.
{
type: 'lakaut.error',
code: 'INSUFFICIENT_BALANCE',
message: 'No hay créditos disponibles para realizar la firma'
}
A diferencia de otros mensajes, lakaut.error tiene los campos code y message en el nivel raíz del mensaje, no dentro de un payload.
Campos del mensaje
| Campo | Tipo | Descripción |
|---|---|---|
type | string | Siempre 'lakaut.error' |
code | string | Código de error |
message | string | Mensaje descriptivo del error |
Códigos de error comunes
| Código | Descripción | Acción sugerida |
|---|---|---|
INVALID_REQUEST | Datos incorrectos o faltantes | Verificá los datos enviados |
SESSION_EXPIRED | El token JWT expiró | Recargá el iframe |
INSUFFICIENT_BALANCE | Sin créditos para firmar | Contactá al administrador |
INTERNAL_ERROR | Error del servidor | Reintentá más tarde |
ORIGIN_NOT_ALLOWED | Dominio no autorizado | Contactá a Lakaut para registrar tu dominio |
Manejo de errores
window.addEventListener('message', (event) => {
if (event.origin !== 'https://www.lakautac.com.ar') return;
if (event.data.type === 'lakaut.error') {
const { code, message } = event.data;
console.error(`Error [${code}]: ${message}`);
// Mostrar al usuario
mostrarError(message);
}
});
Validación de origen
Siempre validá el origen de los mensajes recibidos para evitar problemas de seguridad.
window.addEventListener('message', (event) => {
// SIEMPRE validar el origen
if (event.origin !== 'https://www.lakautac.com.ar') {
console.warn('Mensaje de origen no autorizado:', event.origin);
return;
}
// Procesar mensaje...
});
Ejemplo completo
const LAKAUT_ORIGIN = 'https://www.lakautac.com.ar';
const iframe = document.getElementById('lakaut-firma');
// Estado
let isReady = false;
let pendingDocument = null;
// Escuchar eventos
window.addEventListener('message', (event) => {
if (event.origin !== LAKAUT_ORIGIN) return;
const { type } = event.data;
switch (type) {
case 'lakaut.ready':
// Iframe listo, enviar init
iframe.contentWindow.postMessage({
type: 'lakaut.init',
payload: {
nonce: crypto.randomUUID(),
idemKey: crypto.randomUUID(),
integratorId: 'mi-empresa',
userData: {
dni: '12345678',
cuil: '20-12345678-9',
email: 'usuario@empresa.com',
gender: 'M',
phone: '1122334455'
}
}
}, LAKAUT_ORIGIN);
break;
case 'lakaut.handshake.ack':
isReady = true;
// Si hay documento pendiente, enviarlo
if (pendingDocument) {
enviarDocumento(pendingDocument);
pendingDocument = null;
}
break;
case 'lakaut.signature.completed':
handleFirmaCompletada(event.data.payload);
break;
case 'lakaut.error':
handleError(event.data);
break;
}
});
function enviarDocumento(doc) {
if (!isReady) {
pendingDocument = doc;
return;
}
iframe.contentWindow.postMessage({
type: 'lakaut.load.file',
payload: doc
}, LAKAUT_ORIGIN);
}
function handleFirmaCompletada(payload) {
console.log('Documento firmado:', payload.signedDocId);
console.log('Hash SHA256:', payload.document.sha256);
// Guardar, descargar, etc.
}
function handleError({ code, message }) {
console.error(`Error [${code}]: ${message}`);
alert(`Error: ${message}`);
}