Webhooks
Los webhooks son una extensión de una API, pero en lugar de que tu código solicite datos de nuestra plataforma API, Vonage te envía los datos a ti. Los datos llegan en una solicitud web a tu aplicación. Un webhook puede ser el resultado de una llamada API anterior (este tipo de webhook también se denomina "devolución de llamada"), como una solicitud asincrónica a Number Insight API. Los webhooks también se utilizan para notificar a su aplicación de eventos como una llamada entrante o un mensaje.
Como los servidores de Vonage deben poder enviar datos a tu aplicación a través de webhooks, debes configurar un servidor web para recibir las solicitudes HTTP entrantes. También debes especificar la URL de cada webhook en tu servidor web para que se puedan enviar datos a cada uno.
Flujo de trabajo de webhooks
Con los webhooks, es importante que la URL a la que se envían los webhooks esté configurada. Cuando hay datos disponibles, Vonage envía el webhook a tu aplicación como una solicitud HTTP. Tu aplicación debería responder con un código de éxito HTTP para indicar que recibió correctamente los datos.
El proceso es más o menos así:
Los webhooks brindan un mecanismo conveniente para que Vonage envíe información a tu aplicación para eventos como una llamada o mensaje entrante, o un cambio en el estado de la llamada. También pueden usarse para enviar información de seguimiento, como un recibo de entrega que puede estar disponible un tiempo después de la solicitud con la que se relaciona.
¿Qué API admiten webhooks?
La información resultante de las solicitudes a las API compatibles de Vonage se envía en una solicitud HTTP a tu punto final de webhook en un servidor HTTP. Para configurar tu punto final de webhook, visita la página Panel de Vonage.
Vonage envía y recupera la siguiente información mediante webhooks:
| Nombre API | Uso de webhooks |
|---|---|
| SMS API | Envía el estado de entrega de su mensaje y recibe los SMS entrantes. |
| Voice API | Recupera el Objetos de control de llamada que utilizas para controlar la llamada desde un punto final webhook, y envía información sobre el estado de la llamada a otro. Ver el Referencia de Webhook para más detalles. |
| API asíncrona avanzada de Number Insight | Recibe información completa sobre un número de teléfono. |
| SDK de cliente / Conversation API | Los eventos de comunicación en tiempo real (RTC) se envían al webhook de eventos RTC. |
| Mensajes y Dispatch API | Admite webhooks de mensajes entrantes y de estado de mensajes. |
| Verificar API | Recibe información actualizada sobre sus solicitudes de verificación. |
Establecer puntos finales de webhook
Los webhooks se utilizan para entregar mensajes entrantes y recibos de entrega.
Mensajes entrantes
Para configurar el webhook utilizado para los mensajes entrantes, vaya a la sección Tus Numbers del panel de Vonage. Haz clic en 'editar' para el número virtual y configura el URL de devolución de llamada.
También puede utilizar la función CLI de Vonage para establecer el punto final de los mensajes entrantes para un número individual.
Recibos de entrega
Véase el Recibos de entrega en la documentación de SMS.
La API avanzada de Number Insight permite enviar los resultados de una búsqueda de números de forma sincrónica o asincrónica.
Fije el callback a una URL de webhook para recibir la búsqueda de forma asíncrona.
Véase Async avanzado de Number Insight para más detalles.
Para las solicitudes de Voice API, los webhooks pueden configurarse a nivel de aplicación, al crear una llamada o en las acciones de una NCCO.
Webhooks a nivel de aplicación
Los Numbers de Vonage que estén vinculados a las Applications de Vonage utilizarán el answer_url para recuperar una OCN, y el event_url para enviarle información sobre el estado de la llamada. La dirección fallback_answer_url puede configurarse opcionalmente. Se utiliza cuando answer_url está fuera de línea o devuelve un código de error HTTP. También se utiliza cuando se espera que un evento entregue una NCCO en event_urlpero event_url está fuera de línea o devuelve un código de estado HTTP.
Puede configurarlos mediante la función API de aplicacionesen el salpicadero o utilizando el CLI de Vonage herramienta.
Webhooks a nivel de Numbers
Puede establecer un webhook de estado para cada número que adquiera. Esto se utilizará para enviarle eventos relacionados con cada número.
Pueden configurarse en la sección Numbers de la sección Cuadro de mandosa través del CLI de Vonage o a través del Actualizar un Numbers (en concreto, la llamada a la API voiceStatusCallback propiedad).
Al crear una llamada saliente
En realizar una nueva llamada salientees necesario configurar el answer_url en la llamada a una URL que contenga una NCCO. Los servidores de Vonage recuperarán la NCCO de este punto final y seguirán sus instrucciones para manejar la llamada saliente.
Respuesta Carga útil URL
La carga útil del answer_url es:
| Parámetro | Descripción |
|---|---|
to | El número al que se llama |
from | El número que realiza la llamada |
conversation_uuid | El UUID del conversación |
uuid | El UUID del pierna |
Ejemplo de URL:
/webhooks/answer?to=447700900000&from=447700900001&conversation_uuid=CON-aaaaaaaa-bbbb-cccc-dddd-0123456789ab&uuid=aaaaaaaa-bbbb-cccc-dddd-0123456789cd
Dentro de una OCN
Dentro de una OCNC, los siguientes tipos de acción toman una URL de webhook para su uso cuando se ejecuta esa acción:
- record.eventUrl - establecer el punto final de webhook que recibe información sobre la grabación de una Llamada o Conversación
- conversación.eventUrl - establece la URL del punto final del webhook que Vonage llama de forma asíncrona cuando una conversación cambia de estado para esta acción de conversación
- connect.eventUrl - establece la URL del punto final del webhook que Vonage llama de forma asíncrona cuando una conversación cambia de estado para esta acción de conexión
- input.eventUrl - establece la URL del punto final de webhook Vonage envía los dígitos pulsados por el receptor de la llamada
- stream.streamUrl - establecer una matriz de URL que apunte a los puntos finales de webhook que alojan el archivo de audio que se transmitirá a la llamada o conversación
Tiempos de espera de los webhooks
Si no se puede acceder a la URL de respuesta, evento o alternativa durante cierto tiempo, o si el tiempo de respuesta supera cierto límite, Vonage volverá a intentar la solicitud una vez. Los tiempos de espera de conexión y lectura predeterminados de la plataforma son los siguientes:
| Tipo de webhook | Tiempo de espera de conexión | Tiempo de espera del socket |
|---|---|---|
| Respuesta | 1 segundo | 5 segundos |
| Evento | 1 segundo | 10 segundos |
| Respuesta | 1 segundo | 5 segundos |
Estos valores predeterminados pueden anularse mediante una directiva API de aplicaciones llamada o en el Cuadro de mandos seleccionando la aplicación y haciendo clic en el botón Editar y desplácese hasta la sección Capacidades / Voz:

Encontrará más información sobre estos tiempos de espera en la sección tiempos de espera de webhook de la API de aplicaciones visión general documentación.
En Aplicaciones puede recibir eventos RTC a través del Gancho web RTC.
La URL del webhook del evento RTC se establece al crear la aplicación utilizando la lengua de su elección.
También puede encontrar más información sobre la creación de una aplicación con funciones RTC en la sección Documentación de la API de Applications.
Verify envía devoluciones de llamada de eventos y resúmenes para obtener información actualizada sobre sus solicitudes de verificación. Si eliges Autenticación silenciosa o WhatsApp Codeless como uno de tus canales de autenticación, necesitarás recibir callbacks para completar correctamente la solicitud.
La URL a la que se enviarán las retrollamadas puede configurarse en su archivo configuración de la aplicación en el panel del desarrollador. Consulte el Referencia API por ejemplo callbacks.
Hay dos webhooks soportados por las APIs de Messages y Dispatch, el webhook de Estado de Mensaje y el webhook de Mensaje Entrante. El estado del mensaje se recibe en el webhook Estado del Mensaje y el Mensaje en sí se recibe en el webhook Mensaje Entrante. La configuración de estos webhooks se describe en detalle en el tema Configuración de webhooks para las APIs Messages y Dispatch.
Recepción de webhooks
Para interactuar con los webhooks de Vonage:
- Crea una Account de Vonage.
- Escribe scripts para manejar la información enviada o solicitada por Vonage. Tu servidor debe responder con un código de estado correcto (cualquier código de estado entre 200 OK y 205 Restablecer contenido) a los mensajes entrantes de Vonage. Cualquier otro código que no sea
2xxhará que los servidores de Vonage vuelvan a intentar la devolución de llamada. - Publique sus scripts desplegándolos en un servidor (para desarrollo local, pruebe con Ngrok).
- Configurar un punto final de webhook en la API que desea utilizar.
- Realiza una acción (como enviar un SMS) que active ese webhook.
A continuación, la información sobre su solicitud se envía a su punto final webhook.
Descodificación de webhooks firmados
La firma de webhooks se activa mediante por defecto para las API Messages, Dispatch, Verify y Voice. Proporcionan un método para que tu aplicación verifique que una solicitud proviene de Vonage y que su carga útil no ha sido alterada durante el tránsito. Al recibir una solicitud, el webhook entrante incluirá un token JWT en el encabezado de autorización que está firmado con tu secreto de firma.
NOTA: En las aplicaciones de voz creadas anteriormente, la opción Webhooks firmados está desactivada por defecto. Para activarlo manualmente, vaya a la configuración de la aplicación en el Panel de control, haga clic en el enlace "Mostrar funciones avanzadas" en la sección Capacidad de voz y, a continuación, active la opción Utilizar webhooks firmados Compruébalo:

También puede desactivarlo para las nuevas aplicaciones mediante esta casilla (no se recomienda, utilícelo sólo en casos excepcionales).
La validación de webhooks firmados proporciona una serie de ventajas de seguridad, entre ellas:
- La capacidad de verificar que una solicitud proviene de Vonage
- Garantizar que el mensaje no ha sido manipulado durante el tránsito.
- Defensa contra la interceptación y la repetición posterior
Validación de webhooks firmados
La validación de webhooks firmados consta de dos partes:
- Verificación de la solicitud
- Verificación de la carga útil (opcional)
Verificación de la solicitud
Los webhooks incluirán un JWT en el archivo Authorization header. Utilice la clave API incluida en las reivindicaciones JWT para identificar cuál de sus secretos de firma se ha utilizado para firmar la solicitud. El secreto utilizado para firmar la solicitud se corresponde con el secreto de firma asociado a la cabecera api_key incluido en las reivindicaciones JWT. Puede identificar su secreto de firma en el Cuadro de mandos. Se recomienda que los secretos de firma no sean inferiores a 32 bits para garantizar su seguridad.
NOTA: La signature method no afecta al método utilizado para firmar los webhooks de la Messages API, siempre se utiliza SHA-256.
Verify the payload has not been tampered with in transit
Una vez que haya verificado la autenticidad de la solicitud, puede verificar opcionalmente que la carga útil de la solicitud no ha sido manipulada comparando un hash SHA-256 de la carga útil con el archivo payload_hash encontrado en las reclamaciones JWT. Si no coinciden, la carga útil ha sido manipulada durante el tránsito. Sólo es necesario verificar la carga útil si se utiliza HTTP en lugar de HTTPS, ya que la seguridad de la capa de transporte (TLS) evita que Ataques MITM.
NOTA: En el raro caso de un error interno, es posible que el servicio de retrollamada envíe una retrollamada sin firmar. Al devolver una respuesta HTTP 5xx, se activará un reintento que dará tiempo al sistema para resolver el error y firmar las futuras devoluciones de llamada.
El siguiente ejemplo de código muestra cómo verificar la firma de un webhook. Se recomienda utilizar el protocolo HTTPS, ya que garantiza que la solicitud y la respuesta estén cifradas tanto en el cliente como en el servidor.
| Clave | Descripción |
|---|---|
VONAGE_API_KEY | Your Vonage API key (see it on your dashboard). |
VONAGE_SIGNATURE_SECRET | The secret used to sign the request corresponds to the signature secret associated with the |
Requisitos previos
npm install @vonage/jwt expressEscriba el código
Añada lo siguiente a verify-signed-webhook.js:
const app = require('express')();
const bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true,
}));
app
.route('/webhooks/inbound-message')
.post(handleInboundMessage);
const handleInboundMessage = (request, response) => {
const token = request.headers.authorization.split(' ')[1];
if (verifySignature(token, VONAGE_API_SIGNATURE_SECRET)) {
console.log('Valid signature');
} else {
console.log('Invalid signature');
}
response.send(200);
};
app.listen(process.env.PORT || 3000);
Ejecute su código
Guarde este archivo en su máquina y ejecútelo:
Requisitos previos
composer require vonage/clientCrea un archivo llamado verify-signed-webhooks.php y añade el siguiente código:
require_once __DIR__ . '../../config.php';
require_once __DIR__ . '../../vendor/autoload.php';Escriba el código
Añada lo siguiente a verify-signed-webhooks.php:
$signature = new Vonage\Client\Credentials\SignatureSecret(VONAGE_API_KEY, VONAGE_SIGNATURE_SECRET, 'sha256');
$client = new Vonage\Client($signature);
$message = new Vonage\SMS\Message\SMS(
TO_NUMBER,
FROM_NUMBER,
'This is a signed text'
);
$client->sms()->send($message);
// Incoming Request
$signature = new Vonage\Client\Signature($_GET, VONAGE_SIGNATURE_SECRET, 'sha256');
$isValid = $signature->check($_GET['sig']);Ejecute su código
Guarde este archivo en su máquina y ejecútelo:
Requisitos previos
pip install vonage python-dotenv fastapi[standard]Escriba el código
Añada lo siguiente a verify-signed-webhooks.py:
import os
from os.path import dirname, join
from dotenv import load_dotenv
# Load the environment
envpath = join(dirname(__file__), '../.env')
load_dotenv(envpath)
VONAGE_SIGNATURE_SECRET = os.getenv('VONAGE_SIGNATURE_SECRET')
from fastapi import FastAPI, Request
from vonage_jwt.verify_jwt import verify_signature
app = FastAPI()
@app.get('/inbound')
async def verify_signed_webhook(request: Request):
# Need to get the JWT after "Bearer " in the authorization header
auth_header = request.headers["authorization"].split()
token = auth_header[1].strip()
if verify_signature(token, VONAGE_SIGNATURE_SECRET):
print('Valid signature')
else:
print('Invalid signature')Ejecute su código
Guarde este archivo en su máquina y ejecútelo:
Ejemplo de JWT firmado
// header
{
"alg": "HS256",
"typ": "JWT",
}
// payload
{
"iat": 1587494962,
"jti": "c5ba8f24-1a14-4c10-bfdf-3fbe8ce511b5",
"iss": "Vonage",
"payload_hash" : "d6c0e74b5857df20e3b7e51b30c0c2a40ec73a77879b6f074ddc7a2317dd031b",
"api_key": "a1b2c3d",
"application_id": "aaaaaaaa-bbbb-cccc-dddd-0123456789ab"
}
Cabecera JWT firmada
El contenido de la cabecera JWT firmada se describe en la siguiente tabla:
| Cabecera | Valor |
|---|---|
alg | HS256 |
typ | JWT |
Carga JWT firmada
El contenido de la carga útil JWT firmada se describe en la siguiente tabla, utilizando los valores incluidos en el JWT firmado de ejemplo mostrado anteriormente:
| Campo | Valor de ejemplo | Descripción |
|---|---|---|
iat | 1587494962 | Hora a la que se emitió el JWT. Marca de tiempo Unix en SEGUNDOS. |
jti | c5ba8f24-1a14-4c10-bfdf-3fbe8ce511b5 | Un ID único para el JWT. |
iss | Vonage | El emisor del JWT. Siempre será "Vonage". |
payload_hash | d6c0e74b5857df20e3b7e51b30c0c2a40ec73a77879b6f074ddc7a2317dd031b | Un hash SHA-256 de la carga útil de la solicitud. Puede compararse con la carga útil de la solicitud para garantizar que no ha sido manipulada durante el tránsito. |
api_key | a1b2c3d | La clave API asociada a la Account que realizó la solicitud original. |
application_id | aaaaaaaa-bbbb-cccc-dddd-0123456789ab | (Opcional) Id de la aplicación que realizó la solicitud original si se utilizó una aplicación. |
Probar los webhooks localmente
Para probar el correcto funcionamiento de los webhooks en tu aplicación que se ejecuta localmente, necesitarás crear un túnel seguro entre Vonage y tu aplicación. Puedes hacerlo con una aplicación de túnel seguro como Ngrok. Ver el Pruebas con Ngrok para más información.
Configurar el cortafuegos
Si restringes el tráfico entrante (incluidos los recibos de entrega), debes agregar las direcciones IP de Vonage a la lista de direcciones IP aprobadas de tu firewall. Puedes encontrar más información sobre cómo hacerlo en nuestra base de conocimientos:
- Rangos de voz IP
- Rangos IP SMS
- Mensajes y rangos IP de envío
- Number Insight Avanzado Async IP Rangos
Consejos para depurar webhooks
Empezar poco a poco - Publica el script más pequeño posible que se te ocurra para responder cuando se reciba el webhook y quizás imprimir alguna información de depuración. Así te aseguras de que la URL es la que crees que es y de que puedes ver la salida o los registros de la aplicación.
Código defensivo - Comprueba que los datos existen y contienen lo que esperabas antes de utilizarlos. Dependiendo de tu configuración, podrías recibir datos inesperados, así que tenlo siempre en cuenta.
Ver ejemplos - Vonage proporciona ejemplos implementados con varias pilas de tecnología en un intento por brindar soporte a tantos desarrolladores como sea posible. Para ver ejemplos de código con webhooks, consulta lo siguiente:
También puede consultar la sección de fragmentos de código de la documentación de la API que esté utilizando.
Ver también
- Encontrará más información sobre los tipos de webhooks y las funciones de las aplicaciones en la sección Documentación de las aplicaciones.