Las notificaciones Webhook permiten a Sign In App enviar una alerta a aplicaciones externas cuando un visitante o miembro del personal registra entrada o salida. Los webhooks se configuran dentro de las notificaciones, por lo que se pueden establecer diferentes reglas por sitio o grupo de visitantes. Los filtros avanzados le permiten construir su propio flujo de trabajo, enviando diferentes notificaciones webhook basadas en los datos que sus visitantes proporcionan.
Advertencia
Los eventos webhook no se emiten para la funcionalidad de registro de salida automático. Por ejemplo, si el sistema está configurado para registrar salida de todos los visitantes a medianoche, no se emitirá un evento webhook para cada individuo. Si se utilizan webhooks en un escenario de sincronización de datos, la mejor opción es utilizar el endpoint de historial.
> curl -d '{...}' -X POST https://your.url/
La creación de una notificación se realiza a través del Portal en Administrar > Notificaciones . Añada una nueva notificación y seleccione webhook como canal. Los requisitos para un webhook son el endpoint URL y una clave secreta para la firma del webhook .
Puede encontrar más información sobre la configuración de Notificaciones en Notificaciones de grupo.
Eventos soportados
Los eventos actualmente soportados por webhooks son visitor.signin
, visitor.signout
.
Key | Type | Description |
---|---|---|
event | String | Nombre del evento |
event_at | String | Fecha del evento (formato ISO8601) |
pushed_at | String | Fecha en que se envió el evento (formato ISO8601) |
idempotency_key | String | Clave única del evento |
site | Object | Sitio del visitante en el que se produjo el evento |
visitor | Object | El visitante para el que se ha producido el evento |
Key | Type | Description |
---|---|---|
id | Integer | Identificador único del sitio |
type | String | El tipo de sitio, puede ser standard o remote |
name | String | El nombre del sitio |
timezone | String | La zona horaria del sitio |
Key | Type | Description |
---|---|---|
id | Integer | Identificador único del visitante |
returning_visitor_id | Integer | Identificador único del visitante que regresa, si está definido |
name | String | Nombre del visitante |
photo_url | String | URL a una imagen de la foto del visitante (opcional) |
badge_url | String | Una URL a una imagen de la insignia del visitante (opcional) |
additional | Object | Datos adicionales registrados sobre el visitante |
personal_fields | Object | Campos personales asociados al visitante (que regresa) |
is_returning | Boolean | Si el visitante es un visitante recurrente conocido |
is_pre_registered | Boolean | Si el visitante se registró previamente |
is_remote | Boolean | Si el visitante fue considerado remoto. |
Los campos adicionales y personales son Objects
de valor clave.
{
"field1": "value1",
"field2": 789,
"field3": true
}
A continuación se muestra un ejemplo de formato de los datos. Un cuerpo de solicitud típico no contendría nuevas líneas ni espacios adicionales.
{
"event": "visitor.signin",
"event_at": "2020-01-01T12:00:01Z",
"pushed_at": "2020-01-01T12:00:01Z",
"idempotency_key": "4EPAoqR4N8jZktby",
"site": {
"id": 4567,
"type": "standard",
"name": "Acme Co",
"timezone": "Europe/London"
},
"visitor": {
"id": 1234,
"name": "John Smith",
"photo_url": null,
"badge_url": null,
"additional": {
"Company": "Acme Ltd",
"Email Address": "john@smith.com"
},
"personal_fields": {
"role": "Director",
"Car Reg": "ABC 123"
},
"is_returning": false,
"is_pre_registered": false,
"is_remote": false
},
"visiting": {
"id": 8,
"name": "Adele Vance",
"role": "Retail Manager",
"email": "AdeleV@2064mx.onmicrosoft.com",
"mobile": ""
}
}
Sign In App espera un código de respuesta 2xx HTTP para confirmar que la solicitud se ha realizado correctamente.
Si el endpoint responde con un código de estado HTTP que no se considera correcto, Sign In App seguirá intentándolo un máximo de 3 veces antes de darse por vencida.
La verificación de firma proporciona un mecanismo para autenticar que la solicitud ha sido enviada por Sign In App. Esto se consigue mediante un código secreto compartido, que se rellena al configurar el webhook. Aunque esto es opcional, se recomienda.
Cuando se realiza una solicitud webhook a la url webhook, también incluirá una cabecera HTTP con el nombre x-signinapp-webhook-signature
.
La cabecera se compone de dos partes separadas por una coma. Por ejemplo, x-signinapp-webhook-signature: t=1644316744,s1=462fa402e927893dee0bfec09379718a507c883919442de3dcb1504142ceaa5d
.
El valor t
es una marca de tiempo utilizada para confirmar cuándo se envió el webhook.
El valor s1
es un sha256 hmac
del timestamp de t
concatenado con el cuerpo http.
hmac.new("MySharedSecret", "timestamp.body", hashlib.sha256).hexdigest()
Sustituya el secreto compartido, la marca de tiempo y el cuerpo http. Ten en cuenta que hay un punto entre la marca de tiempo y el cuerpo http.
Deberías comprobar que el resultado de esta llamada coincide con s1
en la cabecera de la petición del webhook.
Javascript:
const crypto = require('crypto');
crypto
.createHmac('sha256', secret)
.update(timestamp + '.' + payload, 'utf8')
.digest('hex');
PHP:
$header = $request->getHeader('X-SignInApp-Webhook-Signature');
[$timestamp, $signature] = getSignatureParts($header);
hash_equals($signature, hash_hmac("sha256", "{$timestamp}.{$jsonEncodedPayload}", $secret));
Java:
String signedPayload = String.format("%d.%s", timestamp, payload);
String expectedSignature = Util.computeHmacSha256(secret, signedPayload);
Util.secureCompare(expectedSignature, signature)