Notificaciones de Mensajes Entrantes
Webhooks
Los webhooks son devoluciones de llamadas HTTP definidas por el usuario que se generan a partir de eventos específicos. Cada vez que ocurre uno de estos eventos, el cliente de la API de WhatsApp Business lo detecta, recopila los datos y envía inmediatamente una notificación (solicitud HTTP) a la URL del webhook especificada en la configuración de la aplicación para actualizar el estado de los mensajes enviados o indicar la recepción de un mensaje.
Este documento abarca lo siguiente:
- Requisitos
- Formato del webhook de notificaciones
- Errores de las notificaciones
Cuando un cliente te envíe un mensaje, el cliente de la API de WhatsApp Business enviará una notificación de solicitud POST de HTTP a la URL del webhook con los detalles que se describen en los siguientes documentos:
- Notificaciones de mensajes entrantes
- Notificaciones de mensajes multimedia entrantes
- Respuestas entrantes a mensajes enviados
- Mensajes entrantes del sistema
- Notificaciones de estado de mensajes salientes
TIP
Es importante que el webhook devuelva una respuesta HTTPS 200 OK a las notificaciones. De lo contrario, el cliente de la API de WhatsApp Business considerará que ocurrió un error con la notificación y volverá a intentarlo posteriormente.
Requisitos
Para implementar un webhook activo que pueda recibir eventos de webhook desde la API de WhatsApp Business, el código debe tener lo siguiente:
- Compatibilidad con HTTPS
- Un certificado SSL válido
Configuracion de las Notificaciones
Siguiendo las instrucciones de la documentación sobre la configuración de la aplicación, realiza la siguiente configuración para las notificaciones de los webhooks:
Webhooks Proporciona la URL para tu webhook. Esto es OBLIGATORIO cuando usas webhooks. Si no se configura la URL del webhook, las devoluciones de llamadas se interrumpen. Consulta la aplicación de ejemplo para pruebas a fin de conocer una manera sencilla de ver y probar los webhooks.
sent_status Especifica si quieres recibir notificaciones cuando el servidor recibe un mensaje. De manera predeterminada, las notificaciones están desactivadas.
callback_persist Selecciona si quieres almacenar las devoluciones de llamada en el disco hasta que el webhook las reconozca correctamente. Las notificaciones que no se reconocen correctamente (es decir, que no reciben la respuesta HTTPS 200) se reintentan por tiempo indefinido. Usa esta configuración para definir los reintentos.
Formato general de un webhook
El webhook debe tener un campo de matriz de nivel superior que indique lo que se comunica. Los miembros de la matriz son objetos JSON con campos detallados pertinentes para el webhook.
| Nombre | Tipo |
|---|---|
| messages | Notificaciones de mensajes entrantes |
| statuses | Actualizaciones de estados de mensajes |
| errors | Errores fuera de banda serios |
TIP
Siempre que sea posible, los nombres de names se mantienen constantes a lo largo de las funciones. Por ejemplo, todas las marcas de tiempo se denominan timestamp.
Formato del webhook de notificaciones
A continuación se muestran todos los campos posibles del webhook de notificaciones.
{
"contacts":[
{
"profile":{
"name":"sender-profile-name"
},
"wa_id":"wa-id-of-contact"
}
],
"messages":[
"context":{
"from":"sender-wa-id-of-context-message",
"group_id":"group-id-of-context-message",
"id":"message-id-of-context-message",
"mentions":[
"wa-id1",
"wa-id2"
]
},
"from":"sender-wa-id",
"group_id":"group-id",
"id":"message-id",
"timestamp":"message-timestamp",
"type":"audio | document | image | location | system | text | video | voice",
"errors":[
{
"..."
}
],
"audio":{
"file":"absolute-filepath-on-coreapp",
"id":"media-id",
"link":"link-to-audio-file",
"mime_type":"media-mime-type",
"sha256":"checksum"
}"document":{
"file":"absolute-filepath-on-coreapp",
"id":"media-id",
"link":"link-to-document-file",
"mime_type":"media-mime-type",
"sha256":"checksum",
"caption":"document-caption"
}"image":{
"file":"absolute-filepath-on-coreapp",
"id":"media-id",
"link":"link-to-image-file",
"mime_type":"media-mime-type",
"sha256":"checksum",
"caption":"image-caption"
}"location":{
"address":"1 Hacker Way, Menlo Park, CA, 94025",
"latitude":"latitude",
"longitude":"longitude",
"name":"location-name"
}"system":{
"body":"system-message-content"
}"text":{
"body":"text-message-content"
}"video":{
"file":"absolute-filepath-on-coreapp",
"id":"media-id",
"link":"link-to-video-file",
"mime_type":"media-mime-type",
"sha256":"checksum"
}"voice":{
"file":"absolute-filepath-on-coreapp",
"id":"media-id",
"link":"link-to-audio-file",
"mime_type":"media-mime-type",
"sha256":"checksum"
}
]
}
Errores de las notificaciones
Cuando ocurran errores fuera de banda durante el funcionamiento normal de la aplicación, la matriz errors incluirá una descripción del error. Este tipo de errores se deben a problemas temporales de conectividad de la red, credenciales no válidas, controladores de administración no disponibles, etc. En caso de que ocurra un error, consulta los mensajes de error y de estado para obtener más información.
Ejemplo
"POST /"{
"errors":[
{
"code":"error-code",
"title":"error-title",
"details":"error-description",
"href":"location for error detail"
},
{
"..."
}
]
}
Objeto errors
El objeto errors contiene los siguientes parámetros:
| Nombre del campo | Descripción | Tipo |
|---|---|---|
| code | Código de error | Numerico |
| title | Título del error | Cadena |
| details | Opcional. Se detalla el error si hay información disponible o si corresponde. | Cadena |
| href | Opcional. Se detalla el error si hay información disponible o si corresponde. | Cadena |
Notificaciones entrantes
Hay varios tipos de notificaciones entrantes que se pueden entregar a tu webhook único.
Este documento abarca lo siguiente:
- Notificación de mensajes entrantes
- Notificación de mensajes multimedia entrantes
- Respuestas entrantes a mensajes enviados
- Mensajes entrantes del sistema
- Descripciones de parámetros/campos para mensajes entrantes
- Mención de usuarios en mensajes
- Marcar mensajes como leídos
Para obtener más información general sobre los webhooks, consulta:
- Formato del webhook de notificaciones
- Configuración de las notificaciones
- App de ejemplo para pruebas
Notificaciones de mensajes entrantes
Recibirás una notificación cuando tu empresa reciba un mensaje. En la sección sobre el objeto messages, se proporciona toda la información que recibes sobre un mensaje entrante.
En esta sección, se muestran ejemplos de mensajes de texto y mensajes de ubicación.
Ejemplo: Mensaje de texto recibido
El siguiente es un ejemplo de un mensaje de texto que puedes recibir de un cliente. Consulta la sección sobre el objeto text a continuación para obtener más información.
{
"contacts": [ {
"profile": {
"name": "Kerry Fisher"
},
"wa_id": "16315551234"
} ],
"messages":[{
"from": "16315551234",
"id": "ABGGFlA5FpafAgo6tHcNmNjXmuSf",
"timestamp": "1518694235",
"text": {
"body": "Hello this is an answer"
},
"type": "text"
}]
}
Ejemplo: Mensaje de ubicación estática recibido
El siguiente es un ejemplo de un mensaje de texto que puedes recibir de un cliente para especificar su ubicación estática. Consulta la sección sobre el objeto location a continuación para obtener más información.
{
"contacts": [ {
"profile": {
"name": "Kerry Fisher"
},
"wa_id": "16315551234"
} ],
"messages":[{
"from":"16315551234",
"id":"ABGGFlA5FpafAgo6tHcNmNjXmuSf",
"location":{
"address":"Main Street Beach, Santa Cruz, CA",
"latitude":38.9806263495,
"longitude":-131.9428612257,
"name":"Main Street Beach",
"url":"https://foursquare.com/v/4d7031d35b5df7744"},
"timestamp":"1521497875",
"type":"location"
}]
}
Ejemplo: Mensaje de un contacto recibido
El siguiente es un ejemplo de un mensaje de texto que puedes recibir de un cliente para especificar su información de contacto. Consulta la sección sobre el objeto contacts a continuación para obtener más información.
{
"contacts": [ {
"profile": {
"name": "Kerry Fisher"
},
"wa_id": "16315551234"
} ],
"messages": [
{
"contacts": [
{
"addresses": [
{
"city": "Menlo Park",
"country": "United States",
"country_code": "us",
"state": "CA",
"street": "1 Hacker Way",
"type": "WORK",
"zip": "94025"
}
],
"birthday": "2012-08-18",
"contact_image": "/9j/4AAQSkZJRgABAQEAZABkAAD/....",
"emails": [
{
"email": "[email protected]",
"type": "WORK"
}
],
"ims": [
{
"service": "AIM",
"user_id": "kfish"
}
],
"name": {
"first_name": "Kerry",
"formatted_name": "Kerry Fisher",
"last_name": "Fisher"
},
"org": {
"company": "Facebook"
},
"phones": [
{
"phone": "+1 (940) 555-1234",
"type": "CELL"
},
{
"phone": "+1 (650) 555-1234",
"type": "WORK",
"wa_id": "16505551234"
}
],
"urls": [
{
"url": "https://www.facebook.com",
"type": "WORK"
}
]
}
],
"from": "16505551234",
"id": "ABGGFlA4dSRvAgo6C4Z53hMh1ugR",
"timestamp": "1537248012",
"type": "contacts"
}
]
}
Ejemplo: Mensaje desconocido recibido
A partir de la versión v2.21.3, es posible recibir una notificación de devolución de llamada unknown. El siguiente es un ejemplo de un mensaje que puedes recibir de un cliente que no se admite.
{
"messages": [{
"errors": [
{
"code": 501,
"details": "Message type is not currently supported",
"title": "Unknown message type"
}
],
"from": "16315551234",
"id": "ABGGFRBzFymPAgo6N9KKs7HsN6eB",
"timestamp": "1531933468",
"type": "unknown"
}]
}
Notificaciones de mensajes multimedia entrantes
Cuando se recibe un mensaje multimedia, el cliente de la API de WhatsApp Business descarga el contenido multimedia. Una vez que este se descarga, se envía una notificación a tu webhook. Este mensaje contiene información que identifica el objeto multimedia y te permite buscarlo y recuperarlo. Usa el extremo de contenido multimedia con el id del contenido para recuperarlo.
En esta sección, se muestran ejemplos de mensajes que se reciben con contenido multimedia.
Ejemplo: Mensaje recibido con imagen
El siguiente es un ejemplo de un mensaje entrante que contiene una imagen. Consulta la sección sobre el objeto media a continuación para obtener más información sobre los diferentes tipos de contenido multimedia
{
"messages": [
{
"from": "16315551234",
"id": "ABGGFlA5FpafAgo6tHcNmNjXmuSf",
"image": {
"file": "/usr/local/wamedia/shared/b1cf38-8734-4ad3-b4a1-ef0c10d0d683",
"id": "b1c68f38-8734-4ad3-b4a1-ef0c10d683",
"mime_type": "image/jpeg",
"sha256": "29ed500fa64eb55fc19dc4124acb300e5dcc54a0f822a301ae99944db",
"caption": "Check out my new phone!"
},
"timestamp": "1521497954",
"type": "image"
}
]
}
TIP
El campo caption es opcional para los mensajes multimedia. Se incluye solamente si el usuario configuró texto.
Ejemplo: Mensaje recibido con documento
El siguiente es un ejemplo de un mensaje entrante que contiene un documento. Consulta la sección sobre el objeto media a continuación para obtener más información sobre los diferentes tipos de contenido multimedia.
{
"messages": [
{
"from": "16315551234",
"id": "ABGGFlA5FpafAgo6tHcNmNjXmuSf",
"timestamp": "1522189546",
"type": "document",
"document": {
"caption": "80skaraokesonglistartist",
"file": "/usr/local/wamedia/shared/fc233119-733f-49c-bcbd-b2f68f798e33",
"id": "fc233119-733f-49c-bcbd-b2f68f798e33",
"mime_type": "application/pdf",
"sha256": "3b11fa6ef2bde1dd14726e09d3edaf782120919d06f6484f32d5d5caa4b8e"
}
}
]
}
Ejemplo: Mensaje recibido con mensaje de voz
El siguiente es un ejemplo de un mensaje entrante que contiene un mensaje de voz. Consulta la sección sobre el objeto media a continuación para obtener más información sobre los diferentes tipos de contenido multimedia.
{
"messages": [
{
"from": "16315551234",
"id": "ABGGFlA5FpafAgo6tHcNmNjXmuSf",
"timestamp": "1521827831",
"type": "voice",
"voice": {
"file": "/usr/local/wamedia/shared/463e/b7ec/ff4e4d9bb1101879cbd411b2",
"id": "463eb7ec-ff4e-4d9b-b110-1879cbd411b2",
"mime_type": "audio/ogg; codecs=opus",
"sha256": "fa9e1807d936b7cebe63654ea3a7912b1fa9479220258d823590521ef53b0710"
}
}
]
}
Ejemplo: Mensaje recibido con sticker
El siguiente es un ejemplo de un mensaje entrante que contiene un sticker. Consulta la sección sobre el objeto media a continuación para obtener más información sobre los diferentes tipos de contenido multimedia.
{
"messages": [
{
"from": "16315551234",
"id": "ABGGFlA5FpafAgo6tHcNmNjXmuSf",
"timestamp": "1521827831",
"type": "sticker",
"sticker": {
"id": "b1c68f38-8734-4ad3-b4a1-ef0c10d683",
"metadata": {
"sticker-pack-id": "463eb7ec-ff4e-4d9b-b110-1879cbd411b2",
"sticker-pack-name": "Happy New Year",
"sticker-pack-publisher": "Kerry Fisher",
"emojis": [
"🐥",
"😃"
],
"ios-app-store-link": "https://apps.apple.com/app/id3133333",
"android-app-store-link": "https://play.google.com/store/apps/details?id=com.example",
"is-first-party-sticker": 1
// 0 | 1
},
"mime_type": "image/webp",
"sha256": "fa9e1807d936b7cebe63654ea3a7912b1fa9479220258d823590521ef53b0710"
}
}
]
}
Respuestas entrantes a mensajes enviados
Los usuarios pueden responder a un mensaje específico en WhatsApp. Para permitir que la empresa comprenda el contexto de la respuesta a un mensaje, incluimos el objeto context. Este objeto context proporciona el id del mensaje que contestó el cliente y el identificador de WhatsApp del remitente del mensaje original.
En Responder mensajes, se proporciona más información.
Ejemplo: Mensaje respondido por el cliente
El siguiente es un ejemplo de un mensaje entrante que es la respuesta a un mensaje que enviaste. Consulta la sección sobre el objeto context a continuación para obtener más información.
{
"contacts": [
{
"profile": {
"name": "Kerry Fisher"
},
"wa_id": "16315551234"
}
],
"messages": [
{
"context": {
"from": "16315558011",
"id": "ABGGFlA5FpafAgo6tHcNmNjXmuSf"
},
"from": "16315551234",
"id": "gBGGFlA5FpafAgkOuJbRq54qwbM",
"text": {
"body": "Yes, count me in!"
},
"timestamp": "1521499915",
"type": "text"
}
]
}
TIP
El campo text es opcional para los mensajes multimedia. Si existe, el valor text es el texto del contenido multimedia enviado o el cuerpo de la respuesta, en caso de que la respuesta sea un mensaje de texto.
Mensajes entrantes del sistema
El sistema genera mensajes cuando ocurre un evento, por ejemplo, si un usuario agrega o elimina a otro usuario, si abandona el grupo, etc. Consulta la sección sobre el objeto system a continuación para obtener más información.
{
"messages": [
{
"from": "16506448470",
"group_id": "16315558032-1530825318",
"id": "ACELFjFVWAMqFTCCUxgDM3...",
"system": {
"body": "+1 (650) 387-5246 added +1 (650) 644-8470",
"group_id": "16315558032-1530825318",
"operator": "16503875246",
"type": "group_user_joined",
"users": [
"16506448470"
]
},
"timestamp": "1530825587",
"type": "system"
}
]
}
Por ejemplo, los siguientes mensajes del sistema se recibieron cuando (1) un usuario se unió a un grupo y (2) el administrador de un grupo agregó un icono de grupo.
{
"messages": [
{
"from": "12345678901",
"group_id": "16315558011-1521728362",
"id": "gBEGkYiEB1VXAglK1ZEqA1YKPrU",
"system": {
"body": "+1 (234) 567-8901 was added"
},
"timestamp": "1521739514",
"type": "system"
}
]
}
{
"messages": [
{
"from": "16315558011",
"group_id": "16315558011-1521728362",
"id": "ABGGFlA5FpafAgo6tHcNmNjXmuSf",
"system": {
"body": "+1 (631) 555-8011 changed this group's icon"
},
"timestamp": "1521745780",
"type": "system"
}
]
}
Tipos de mensajes del sistema
| Tipo de mensaje del sistema | Descripción |
|---|---|
| group_created | Se creó el grupo |
| group_user_promoted | Un usuario del grupo se designó como administrador |
| group_user_demoted | Un usuario del grupo se eliminó como administrador |
| group_user_joined | Un usuario se unió al grupo |
| group_user_left | Un usuario abandonó el grupo |
| group_subject_changed | Se cambió el asunto del grupo |
| group_description_changed | Se cambió la descripción del grupo |
| group_icon_changed | Se cambió el icono del grupo |
| group_icon_deleted | Se eliminó el icono del grupo |
| group_invite_link_revoked | Se desactivó el enlace de invitación al grupo |
| group_user_changed_number | Cambió el número de teléfono de un usuario |
| group_error_fetching_photo | Error al recuperar la foto del grupo |
| group_error_adding_users | Error al agregar usuarios al grupo |
| group_error_adding_user | Error al agregar a un usuario al grupo |
| group_error_full_adding_users | El grupo alcanzó su capacidad máxima y no es posible agregar más usuarios |
| group_error_removing_user | Error al eliminar a un usuario del grupo |
| broadcast_list_created | Se creó una lista de difusióno |
| group_ended | Finalizó el grupo |
| group_error_blocked_adding_user | Error al intentar agregar a un usuario que bloqueó a quien desea agregarlo |
Descripciones de parámetros/campos para mensajes entrantes
Como se muestra en los ejemplos proporcionados en este documento, las notificaciones de los mensajes recibidos se incluyen en un objeto messages. En las tablas de esta sección, se describen los campos de las notificaciones entrantes.
| Nombre | Descripción | Tipo |
|---|---|---|
| contacts | Objeto de contactos | Matriz de información de perfil del contacto |
| messages | Objeto de mensajes | Matriz de cualquier tipo de objetos de mensajes |
Objeto contacts
El objeto contacts proporciona toda la información sobre el contacto.
TIP
Este objeto se aplica únicamente a texto, contactos y mensajes de ubicación. Actualmente, no se admite para mensajes multimedia y no es aplicable a los mensajes del sistema.
| Nombre | Descripción | Tipo |
|---|---|---|
| profile | A partir de la versión v2.21.4, contiene la información del perfil del remitente. | Objeto de perfil |
| wa_id | Identificador de WhatsApp del contacto | Cadena |
Objeto profile
| Nombre | Descripción | Tipo |
|---|---|---|
| name | Opcional. A partir de v2.21.4, contiene el nombre del perfil del remitente. | Cadena |
Objeto messages
El objeto messages proporciona toda la información sobre el mensaje
| Nombre | Descripción | Tipo |
|---|---|---|
| context | Opcional. Este objeto solamente se incluirá si alguien responde uno de tus mensajes. Contiene información sobre el contenido del mensaje original, como el identificador del remitente y el del mensaje. | Cadena |
| from | Identificador de WhatsApp del remitente. | Cadena |
| group_id | Opcional. Identificador de WhatsApp del grupo. | Cadena |
| id | Identificador del mensaje. | Cadena |
| timestamp | Marca de tiempo de recepción del mensaje. | Cadena |
| type | Tipo de mensaje. Los valores son: audio, contacts, document, image, location, text, unknown, video, voice. | Cadena |
| Objetos audio, contacts, document, image, location, system, text, video, voice | Contenido del mensaje. | Objetos de mensaje que proporcionan más información acerca del mensaje recibido. Consulta los campos del objeto media para obtener más información. |
| system | Notificaciones sobre cambios en el sistema | Objetos de sistema |