Ir al Panel →

🧩 Widget de Firmas

Componente JavaScript embebible que muestra el estado de firma de un documento directamente en tu aplicación web, con actualización en tiempo real.

Scriptmanyao-widget.js
AuthBearer Token
PollingCada 5s (configurable)
¿Qué hace el Widget?
  • Estado de firma de cada firmante con barra de progreso
  • Código QR para que los firmantes escaneen desde su celular
  • Gestión de firmantes (agregar / eliminar) sin salir de tu app
  • Certificados de firma con foto, prueba de vida y datos biométricos
  • Visor y descarga del PDF original o firmado
  • Firma asistida — modal con cámara en la misma máquina
📡Flujo de Integración
sequenceDiagram participant F as Tu Frontend participant B as Tu Backend participant A as API Manyao participant W as Widget B->>A: POST /v1/auth/token (client_id + client_secret) A-->>B: access_token B->>A: POST /v1/documents (PDF + firmantes) A-->>B: document_uuid F->>B: GET /api/widget-token/:docId B-->>F: { token, documentId } F->>W: script data-document="UUID" data-token="TOKEN" W->>A: GET /v1/widget/{uuid} (polling cada 5s) A-->>W: estado actualizado Note over W: Se actualiza automáticamente cuando los firmantes firman
⚠️ Nunca expongas tu client_id/client_secret en el frontend. El token del widget lo debe obtener tu backend y pasarlo al frontend.
⚙️Instalación
Opción A — Carga estática (HTML)
<!-- Contenedor del widget -->
<div id="manyao-widget"></div>

<!-- Script del widget -->
<script src="https://manyao.pe/widget/manyao-widget.js"
        data-document="UUID_DEL_DOCUMENTO"
        data-token="BEARER_TOKEN"
        data-container="manyao-widget">
</script>
Opción B — Carga dinámica (JavaScript)
async function loadManyaoWidget(docUuid) {
  // 1. Tu backend obtiene el Bearer token
  const resp = await fetch('/tu-api/manyao-token');
  const { token } = await resp.json();

  // 2. Cargar widget dinámicamente
  const script = document.createElement('script');
  script.src = 'https://manyao.pe/widget/manyao-widget.js';
  script.dataset.document = docUuid;
  script.dataset.token = token;
  script.dataset.container = 'manyao-widget';
  document.body.appendChild(script);
}

loadManyaoWidget('tu-document-uuid');
🎛️Atributos de Configuración
Requeridos
AtributoTipoDescripción
data-documentstringUUID del documento a mostrar
data-tokenstringBearer token de lectura — no crea documentos ni consume créditos
Configuración básica
AtributoTipoDescripciónDefault
data-containerstringID del elemento HTML donde renderizarmanyao-widget
data-apistringURL base de la API del widgethttps://manyao.pe/v1/widget
data-sign-urlstringURL base para enlaces de firma y QRhttps://manyao.whatsign.com
data-pollnumberIntervalo de polling en ms5000
Apariencia visual
AtributoDescripciónDefault
data-accentColor de acento CSS (hex, rgb…). Afecta botones, badges, bordes y panel QR#0F766E
data-title-sizeTamaño de fuente del título del documentoinherit
data-title-colorColor del título del documentoinherit
data-subtitle-sizeTamaño de fuente del subtítulo / metadatosinherit
data-subtitle-colorColor del subtítulo / metadatosinherit
Visibilidad de controles
AtributoDescripciónDefault
data-qr-openPanel QR abierto al cargar. false para empezar colapsadotrue
data-show-add-signerMostrar botón "Agregar firmante"true
data-show-remove-signerMostrar botón eliminar firmante en cada filatrue
data-show-reopenMostrar botón "Reabrir" en documentos expirados o parcialestrue
data-show-partialMostrar botón de firma parcial cuando hay firmantes pendientestrue
data-show-powered-byMostrar el badge "Powered by Manyao" al pie del widgettrue
data-show-metadata-valueMostrar valores de metadata del firmante como badges junto al nombrefalse
Etiquetas personalizables
AtributoDescripciónDefault
data-label-partialTexto del botón de firma parcialFirma parcial
data-label-reopenTexto del botón reabrir documentoReabrir
data-label-qr-tabTexto del tab/panel del código QRFirmar participantes
💻Backend — Endpoint del Token (Node.js)
// GET /api/widget-token/:docId
app.get('/api/widget-token/:docId', async (req, res) => {
  const auth = await fetch('https://api.manyao.pe/v1/auth/token', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      client_id: process.env.MANYAO_CLIENT_ID,
      client_secret: process.env.MANYAO_CLIENT_SECRET,
      grant_type: 'client_credentials'
    })
  });
  const { access_token } = await auth.json();
  res.json({ token: access_token, documentId: req.params.docId });
});
🐘Backend — Endpoint del Token (PHP)
// GET /api/widget-token.php?doc=UUID
$ch = curl_init('https://api.manyao.pe/v1/auth/token');
curl_setopt_array($ch, [
    CURLOPT_POST           => true,
    CURLOPT_POSTFIELDS     => json_encode([
        'client_id'     => getenv('MANYAO_CLIENT_ID'),
        'client_secret' => getenv('MANYAO_CLIENT_SECRET'),
        'grant_type'    => 'client_credentials'
    ]),
    CURLOPT_HTTPHEADER     => ['Content-Type: application/json'],
    CURLOPT_RETURNTRANSFER => true,
]);
$resp = json_decode(curl_exec($ch), true);

header('Content-Type: application/json');
echo json_encode([
    'token'      => $resp['access_token'],
    'documentId' => $_GET['doc']
]);
manyao.pe — Firma digital con validación biométrica