
Idioma 🇪🇸 Español
Descripción general
Implementación
Detrás de escena
Con FastComments es posible invocar un endpoint de la API cada vez que se añade, actualiza o elimina un comentario de nuestro sistema.
Lo logramos con webhooks asíncronos a través de HTTP/HTTPS.
Qué son los webhooks 
Un Webhook es un mecanismo, o una integración, entre dos sistemas donde el "productor" (FastComments) desencadena un evento que el "consumidor" (Usted) consume mediante una llamada a la API.
Eventos y recursos compatibles 
FastComments admite webhooks solo para el recurso Comment.
Admitimos webhooks para la creación, eliminación y actualización de comentarios.
Cada uno de ellos se considera un evento separado en nuestro sistema y, por lo tanto, tiene distintas semánticas y estructuras para los eventos de webhook.
Configuración de desarrollo local 
Para el desarrollo local, use una herramienta como ngrok.
Para simplificar el mantenimiento de la seguridad del sistema, el desarrollo local sigue el mismo proceso que la configuración y aseguramiento de otros entornos.
Paso 1: Añadir "localhost" a los dominios en su cuenta.
Añada "localhost" como dominio aquí.
Paso 2: Seleccione una API Key
Vamos a añadir la configuración del webhook para su dominio, así que necesitaremos una API key. Puede hacerlo aquí.
Bajo "Associate with domain" - seleccione su dominio "localhost".
NOTE: Alternatively, you can use one API Secret for all testing activity and staging environments. Simply add an API Secret for "All Domains", and give it a name like "test".
Asegúrese de tener definido un API Secret para su(s) dominio(s) de producción. Los eventos de todos los demás dominios usarán el secreto comodín (testing).
Paso 3: Añada su Webhook
Mientras ejecuta ngrok u otra herramienta similar, establezca el valor para "localhost" aquí.
Al hacer clic en Send Test Payload, enviaremos dos eventos de prueba para verificar que valida la API key.
Una vez que lo valide, pulse Save.
Paso 4: Añada un comentario
Ahora puede añadir, editar o eliminar comentarios y debería ver que llamamos a su máquina de desarrollo local con los eventos, usando su testing API key. Puede haber un retraso de hasta 30 segundos para que los eventos lleguen a su máquina.
Configuración 
Siga los mismos pasos para localhost que seguiría para producción. Asegúrese de tener configurados los dominios de producción y los API Secrets.
Primero, diríjase a la Administración de Webhooks. Esto es accesible a través de Administrar datos -> Webhooks.
La página de configuración aparece como sigue:
En esta página puede especificar endpoints para cada tipo de evento de comentario.
Para cada tipo de evento, asegúrese de hacer clic en Send Test Payload para garantizar que ha configurado su integración correctamente. Consulte la siguiente sección, "Pruebas", para más detalles.
Pruebas 
En la administración de Webhooks hay botones Send Test Payload para cada tipo de evento (Create, Update, Delete). Los eventos Create y Update envían un objeto WebhookComment de prueba, mientras que al probar Delete se enviará un cuerpo de solicitud de prueba con solo un ID.
Verificación de Payloads
Al probar la integración de tu webhook, verifica que las solicitudes entrantes incluyan los siguientes encabezados:
token- Tu secreto de la APIX-FastComments-Timestamp- Marca de tiempo Unix (segundos)X-FastComments-Signature- Firma HMAC-SHA256
Usa la verificación de la firma HMAC para asegurarte de que los payloads sean auténticos.
Herramientas de prueba
Puedes usar herramientas como webhook.site o ngrok para inspeccionar los payloads entrantes del webhook durante el desarrollo.
Tipos de eventos
- Create Event: Se desencadena cuando se crea un nuevo comentario. Método predeterminado: PUT
- Update Event: Se desencadena cuando se edita un comentario. Método predeterminado: PUT
- Delete Event: Se desencadena cuando se elimina un comentario. Método predeterminado: DELETE
Cada evento incluye los datos completos del comentario en el cuerpo de la solicitud (consulta Estructuras de datos para el formato del payload).
Estructuras de datos 
La única estructura enviada vía webhooks es el objeto WebhookComment, descrito en TypeScript a continuación.
Estructura del objeto WebhookComment
Estructura del evento "Create"
El cuerpo de la petición del evento "create" es un objeto WebhookComment.
Estructura del evento "Update"
El cuerpo de la petición del evento "update" es un objeto WebhookComment.
Estructura del evento "Delete"
El cuerpo de la petición del evento "delete" es un objeto WebhookComment.
Cambio a partir del 14 de noviembre de 2023
Anteriormente el cuerpo de la petición del evento "delete" solo contenía el id del comentario. Ahora contiene el comentario completo en el momento de la eliminación.
Run 
Cuando los usuarios son etiquetados en un comentario, la información se almacena en una lista llamada mentions. Cada objeto en esa lista
tiene la siguiente estructura.
Run 
Métodos HTTP
Puedes configurar el método HTTP para cada tipo de evento de webhook en el panel de administración:
- Evento Create: POST o PUT (predeterminado: PUT)
- Evento Update: POST o PUT (predeterminado: PUT)
- Evento Delete: DELETE, POST o PUT (predeterminado: DELETE)
Dado que todas las solicitudes contienen un ID, las operaciones Create y Update son idempotentes por defecto (PUT). Repetir la misma petición Create o Update no debería crear objetos duplicados en tu lado.
Encabezados de la petición
Cada petición de webhook incluye los siguientes encabezados:
| Encabezado | Descripción |
|---|---|
Content-Type |
application/json |
token |
Tu secreto de API |
X-FastComments-Timestamp |
Marca de tiempo Unix (segundos) cuando la petición fue firmada |
X-FastComments-Signature |
Firma HMAC-SHA256 (sha256=<hex>) |
Consulta Seguridad y tokens de API para obtener información sobre cómo verificar la firma HMAC.
Seguridad y tokens de API 
Las solicitudes webhook de FastComments incluyen múltiples mecanismos de autenticación por motivos de seguridad.
Encabezados enviados
| Header | Description |
|---|---|
token |
Tu API Secret (para compatibilidad con versiones anteriores) |
X-FastComments-Timestamp |
Marca de tiempo Unix (segundos) cuando se firmó la solicitud |
X-FastComments-Signature |
Firma HMAC-SHA256 de la carga útil |
Verificación de firma HMAC (Recomendado)
Recomendamos encarecidamente verificar la firma HMAC para garantizar que las cargas útiles de los webhooks sean auténticas y no hayan sido manipuladas.
Formato de la firma: sha256=<hex-encoded-signature>
Cómo se calcula la firma:
- Concatenar:
timestamp + "." + JSON_payload_body - Calcular HMAC-SHA256 usando tu API Secret como clave
- Codificar el resultado en hexadecimal
Ejemplo de verificación (Node.js)
const crypto = require('crypto');
function verifyWebhookSignature(req, apiSecret) {
const timestamp = req.headers['x-fastcomments-timestamp'];
const signature = req.headers['x-fastcomments-signature'];
if (!timestamp || !signature) {
return false;
}
// Verificar que la marca de tiempo sea reciente (dentro de 5 minutos)
const now = Math.floor(Date.now() / 1000);
if (Math.abs(now - parseInt(timestamp, 10)) > 300) {
return false; // Prevención de ataques de repetición
}
// Verificar firma
const payload = JSON.stringify(req.body);
const expectedSignature = crypto
.createHmac('sha256', apiSecret)
.update(`${timestamp}.${payload}`)
.digest('hex');
return signature === `sha256=${expectedSignature}`;
}
Ejemplo de verificación (Python)
import hmac
import hashlib
import time
import json
def verify_webhook_signature(headers, body, api_secret):
timestamp = headers.get('X-FastComments-Timestamp')
signature = headers.get('X-FastComments-Signature')
if not timestamp or not signature:
return False
# Verificar que la marca de tiempo sea reciente
now = int(time.time())
if abs(now - int(timestamp)) > 300:
return False
# Verificar firma
payload = json.dumps(body, separators=(',', ':'))
message = f"{timestamp}.{payload}"
expected = hmac.new(
api_secret.encode(),
message.encode(),
hashlib.sha256
).hexdigest()
return signature == f"sha256={expected}"
Ejemplo de verificación (PHP)
function verifyWebhookSignature($headers, $body, $apiSecret) {
$timestamp = $headers['X-FastComments-Timestamp'] ?? null;
$signature = $headers['X-FastComments-Signature'] ?? null;
if (!$timestamp || !$signature) {
return false;
}
// Verificar que la marca de tiempo sea reciente (dentro de 5 minutos)
$now = time();
if (abs($now - intval($timestamp)) > 300) {
return false;
}
// Verificar firma
$payload = json_encode($body, JSON_UNESCAPED_SLASHES);
$message = $timestamp . '.' . $payload;
$expectedSignature = 'sha256=' . hash_hmac('sha256', $message, $apiSecret);
return hash_equals($expectedSignature, $signature);
}
Autenticación heredada
El encabezado token que contiene tu API Secret todavía se envía por compatibilidad con versiones anteriores. Sin embargo, recomendamos migrar a la verificación HMAC para mejorar la seguridad, ya que protege contra ataques de repetición.
Funcionamiento y gestión de reintentos 
Todos los cambios en el objeto Comment en el sistema disparan un evento que termina en una cola.
El evento webhook inicial suele enviarse dentro de seis segundos desde que ocurre la fuente del evento.
Puedes supervisar esta cola en el panel de administración de Webhooks en caso de que tu API se caiga.
Si una solicitud a tu API falla, la volveremos a encolar según un programa.
Ese programa es 1 Minute * the retry count. Si la llamada falla una vez, intentará de nuevo en
un minuto. Si falla dos veces, esperará entonces dos minutos, y así sucesivamente. Esto es para que no
sobrecarguemos tu API si estáis cayendo por razones relacionadas con la carga.
Los webhooks pueden cancelarse desde la página de registros.
En conclusión
Esto concluye nuestra documentación de Webhooks.
Esperamos que la integración de Webhooks de FastComments le resulte fácil de entender y rápida de configurar.
Si considera que ha identificado alguna laguna en nuestra documentación, háganoslo saber a continuación.