Webhook de conversación
El webhook procesará los datos para el chatbot. El webhook publicará diariamente los registros de la historia del log de los chats en tu CRM en formato JSON.
Configuración de un webhook
Para configurar un webhook, debes haber recibido acceso a app.neoagent.co (contacta al soporte de app.neoagent.co si aún no tienes este acceso):
- Accede a app.neoagent.co y haz clic en Área de trabajo.
- Ingresa la URL del webhook del endpoint configurado en la pestaña Webhook.
- Haz clic en Guardar.
Una vez ingresada la URL del webhook, se generará automáticamente la clave de firma del webhook.
Endpoint de recepción
Confía en la autenticidad de tus webhooks utilizando la clave de firma del webhook mencionada anteriormente, una clave secreta única compartida entre tu aplicación y app.neoagent.co, para verificar los eventos enviados a tus endpoints. La clave de firma del webhook producirá la X-Webhook-Signature, que puedes usar para compararla con una firma de webhook esperada, para verificar los eventos que provienen de app.neoagent.co.
X-Webhook-Signature
Cuando app.neoagent.co envía un webhook a tu aplicación, incluirá el encabezado X-Webhook-Signature en el siguiente formato:
X-Webhook-Signature: t=1492774577,v1=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8bd
Compara la X-Webhook-Signature, precedida por v1=, con la firma esperada. Si coinciden, puedes estar seguro de que el payload del evento fue emitido por app.neoagent.co y no ha sido alterado.
const crypto = require('crypto');
// Clave de firma del webhook de la aplicación
const webhookSigningKey = ({}).WEBHOOK_SIGNING_KEY;
// Extrae el timestamp y la firma del encabezado
const newoaksSignature = req.get('X-Webhook-Signature');
const { t, signature } = newoaksSignature.split(',').reduce((acc, currentValue) => {
const [key, value] = currentValue.split('=');
if (key === 't') {
// Timestamp UNIX
acc.t = value;
}
if (key === 'v1') {
acc.signature = value
}
return acc;
}, {
t: '',
signature: ''
});
if (!t || !signature) throw new Error('Firma no válida');
// Crea el payload firmado concatenando el timestamp (t), el carácter '.' y el payload JSON del cuerpo de la solicitud.
const data = t + '.' + JSON.stringify(req.body);
const expectedSignature = crypto.createHmac('sha256', webhookSigningKey).update(data, 'utf8').digest('hex');
// Determina la firma esperada calculando un HMAC con la función hash SHA256.
if (expectedSignature !== signature) {
// ¡La firma no es válida!
throw new Error('Firma no válida');
}
Escucha de eventos del log de los chats
Cuando se produce un evento, este se notifica a la URL del webhook configurada. Envía todos los logs de los chats de todos los chatbots propiedad de los usuarios del día anterior a las 2:00 de cada día (hora UTC).
Detalles de la notificación - Solicitud HTTP POST
Método: POST
Content-Type: application/json
Encabezados de solicitud adicionales
X-Webhook-Signature: Firma de la solicitud Cuerpo JSON
Cuerpo JSON
Ejemplo:
{
"Collection": [
{
"SerialNumber": "59001dd73709417321c58b11693183a2",
"Name": "test...",
"StartTime": "2023-11-21T00:00:00Z",
"EndTime": "2023-11-22T00:00:00Z",
"Conversations": [
{
"SessionID": 31302,
"CreateTime": "2023-11-21T16:22:42.264484Z",
"URI": "www.google.com",
"Messages": [
{
"Type": "AI",
"Content": "Hola, ¿en qué puedo ayudarte?"
},
{
"Type": "User",
"Content": "programar una cita"
},
{
"Type": "AI",
"Content": "Por favor selecciona la fecha y hora..."
}
]
}
]
}
]
}
Descripción del cuerpo JSON:
- SerialNumber cadena ID del Chatbot
- Name cadena Nombre del Chatbot
- StartTime cadena Hora de inicio (hora UTC)
- EndTime cadena Hora de fin (hora UTC)
- Conversations Objeto arreglo
-
- SessionID int ID de sesión
-
- CreateTime cadena Hora de creación (hora UTC)
-
- URI cadena URI fuente
-
- Messages Objeto arreglo
-
-
- Type cadena Existen dos tipos de mensajes, User y AI
-
-
-
- Content cadena Contenido del mensaje
-
Reintento de error
Respuesta de datos: {"status":"success"} o {"status":"Success: test request received"} (sensible a mayúsculas y minúsculas, el valor de retorno requerido para un callback exitoso); la devolución de otros valores se considera un error. En caso de error, reintenta dentro de 1 minuto y 3 minutos.