
Idioma 🇧🇷 Português (Brasil)
Visão geral
Implementação
Bastidores
Webhooks
Com o FastComments é possível invocar um endpoint de API sempre que um comentário for adicionado, atualizado ou removido do nosso sistema.
Fazemos isso com webhooks assíncronos sobre HTTP/HTTPS.
O que são Webhooks 
Um Webhook é um mecanismo, ou uma integração, entre dois sistemas em que o "produtor" (FastComments) dispara um evento que o "consumidor" (você) consome por meio de uma chamada de API.
Eventos e recursos suportados 
FastComments oferece suporte a webhooks apenas para o recurso Comment.
Suportamos webhooks para criação, remoção e atualização de comentários.
Cada um deles é considerado um evento separado em nosso sistema e, como tal, possui semânticas e estruturas diferentes para os eventos de webhook.
Configuração de desenvolvimento local 
Para desenvolvimento local, use uma ferramenta como o ngrok.
Para simplificar a manutenção da segurança do sistema, o desenvolvimento local segue o mesmo processo de configuração e proteção de outros ambientes.
Etapa 1: Adicionar "localhost" aos domínios na sua conta.
Adicione "localhost" como um domínio aqui.
Etapa 2: Escolher uma chave de API
Vamos adicionar a configuração de webhook para o seu domínio, portanto precisaremos de uma chave de API. Você pode fazer isso aqui.
Em "Associar ao domínio" - selecione o seu domínio "localhost".
NOTA: Alternativamente, você pode usar um único Segredo de API para toda a atividade de teste e ambientes de staging. Basta adicionar um Segredo de API para "Todos os Domínios" e dar a ele um nome como "test".
Certifique-se de que você tem um Segredo de API definido para seu(s) domínio(s) de produção. Eventos para todos os outros domínios usarão o segredo curinga (de teste).
Etapa 3: Adicionar seu webhook
Enquanto o ngrok ou ferramenta similar estiver em execução, defina o valor para "localhost" aqui.
Ao clicar em Send Test Payload, enviaremos dois eventos de teste para verificar se você valida a chave de API.
Depois que validar, clique em Save.
Etapa 4: Adicionar um comentário
Agora você pode adicionar, editar ou excluir comentários e deverá ver que chamamos sua máquina de desenvolvimento local com os eventos, usando sua chave de API de teste. Pode haver até 30 segundos de atraso para que os eventos cheguem à sua máquina.
Configuração 
Follow the same steps for localhost as you would production. Ensure you have production domains and API Secrets setup.
First, navigate to the Webhooks admin. This is accessible via Manage Data -> Webhooks.
The configuration page appears as follows:
In this page you can specify endpoints for each type of comment event.
For each type of event, be sure to click Send Test Payload to ensure you've set up your integration correctly. See the next section, "Testing", for details.
Testes 
No painel de administração de Webhooks existem botões Send Test Payload para cada tipo de evento (Create, Update, Delete). Os eventos Create e Update enviam um objeto dummy WebhookComment, enquanto testar Delete enviará um corpo de requisição dummy com apenas um ID.
Verificando Payloads
Ao testar sua integração de webhook, verifique se as requisições recebidas incluem os seguintes cabeçalhos:
token- Seu Segredo da APIX-FastComments-Timestamp- Marca de tempo Unix (segundos)X-FastComments-Signature- assinatura HMAC-SHA256
Use a verificação da assinatura HMAC para garantir que os payloads são autênticos.
Ferramentas de Teste
Você pode usar ferramentas como webhook.site ou ngrok para inspecionar os payloads de webhook recebidos durante o desenvolvimento.
Tipos de Eventos
- Create Event: Disparado quando um novo comentário é criado. Método padrão: PUT
- Update Event: Disparado quando um comentário é editado. Método padrão: PUT
- Delete Event: Disparado quando um comentário é excluído. Método padrão: DELETE
Cada evento inclui os dados completos do comentário no corpo da requisição (veja Estruturas de Dados para o formato do payload).
Estruturas de dados 
A única estrutura enviada via webhooks é o objeto WebhookComment, descrito em TypeScript abaixo.
Estrutura do Objeto WebhookComment
Estrutura do evento "create"
O corpo da requisição do evento "create" é um objeto WebhookComment.
Estrutura do evento "update"
O corpo da requisição do evento "update" é um objeto WebhookComment.
Estrutura do evento "delete"
O corpo da requisição do evento "delete" é um objeto WebhookComment.
Alteração a partir de 14 de novembro de 2023
Anteriormente, o corpo da requisição do evento "delete" continha apenas o id do comentário. Agora ele contém o comentário completo no momento da exclusão.
Run 
Quando usuários são marcados em um comentário, as informações são armazenadas em uma lista chamada mentions. Cada objeto nessa lista
tem a seguinte estrutura.
Run 
Métodos HTTP
Você pode configurar o método HTTP para cada tipo de evento do webhook no painel de administração:
- Evento "create": POST ou PUT (padrão: PUT)
- Evento "update": POST ou PUT (padrão: PUT)
- Evento "delete": DELETE, POST ou PUT (padrão: DELETE)
Como todas as requisições contêm um ID, as operações Create e Update são idempotentes por padrão (PUT). Repetir a mesma requisição de Create ou Update não deve criar objetos duplicados do seu lado.
Cabeçalhos da Requisição
Cada requisição do webhook inclui os seguintes cabeçalhos:
| Header | Description |
|---|---|
Content-Type | application/json |
token | Seu segredo de API |
X-FastComments-Timestamp | Timestamp Unix (segundos) quando a requisição foi assinada |
X-FastComments-Signature | Assinatura HMAC-SHA256 (sha256=<hex>) |
Veja Segurança e Tokens de API para informações sobre como verificar a assinatura HMAC.
Segurança e tokens de API 
FastComments webhook requests include multiple authentication mechanisms for security.
Headers Sent
| Header | Description |
|---|---|
token | Seu API Secret (para compatibilidade com versões anteriores) |
X-FastComments-Timestamp | Timestamp Unix (segundos) quando a requisição foi assinada |
X-FastComments-Signature | Assinatura HMAC-SHA256 do payload |
HMAC Signature Verification (Recommended)
Recomendamos fortemente verificar a assinatura HMAC para garantir que os payloads do webhook sejam autênticos e não tenham sido adulterados.
Signature Format: sha256=<hex-encoded-signature>
How the signature is computed:
- Concatenate:
timestamp + "." + JSON_payload_body - Compute HMAC-SHA256 using your API Secret as the key
- Hex-encode the result
Example Verification (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;
}
// Verifica se o timestamp é recente (dentro de 5 minutos)
const now = Math.floor(Date.now() / 1000);
if (Math.abs(now - parseInt(timestamp, 10)) > 300) {
return false; // Prevenção contra replay
}
// Verifica a assinatura
const payload = JSON.stringify(req.body);
const expectedSignature = crypto
.createHmac('sha256', apiSecret)
.update(`${timestamp}.${payload}`)
.digest('hex');
return signature === `sha256=${expectedSignature}`;
}
Example Verification (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
# Verifica se o timestamp é recente
now = int(time.time())
if abs(now - int(timestamp)) > 300:
return False
# Verifica a assinatura
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}"
Example Verification (PHP)
function verifyWebhookSignature($headers, $body, $apiSecret) {
$timestamp = $headers['X-FastComments-Timestamp'] ?? null;
$signature = $headers['X-FastComments-Signature'] ?? null;
if (!$timestamp || !$signature) {
return false;
}
// Verifica se o timestamp é recente (dentro de 5 minutos)
$now = time();
if (abs($now - intval($timestamp)) > 300) {
return false;
}
// Verifica a assinatura
$payload = json_encode($body, JSON_UNESCAPED_SLASHES);
$message = $timestamp . '.' . $payload;
$expectedSignature = 'sha256=' . hash_hmac('sha256', $message, $apiSecret);
return hash_equals($expectedSignature, $signature);
}
Legacy Authentication
O cabeçalho token contendo seu API Secret ainda é enviado para compatibilidade com versões anteriores. No entanto, recomendamos migrar para a verificação HMAC para melhorar a segurança, pois isso protege contra ataques de replay.
Como funciona e como lidar com tentativas de reenvio 
Todas as alterações no objeto Comment no sistema disparam um evento que acaba em uma fila.
O evento inicial de webhook geralmente é enviado dentro de seis segundos após a ocorrência da fonte do evento.
Você pode monitorar essa fila no painel de Webhooks no caso de sua API ficar fora do ar.
Se uma solicitação para sua API falhar, nós a colocaremos novamente na fila conforme uma programação.
Essa programação é 1 Minute * the retry count. Se a chamada falhar uma vez, ela tentará novamente em
um minuto. Se falhar duas vezes, então aguardará dois minutos, e assim por diante. Isso é para que não
sobrecarreguemos sua API caso ela esteja ficando indisponível por motivos relacionados à carga.
Os Webhooks podem ser cancelados a partir da página de logs.
Conclusão
Isto conclui nossa documentação sobre Webhooks.
Esperamos que você ache a integração de Webhooks do FastComments fácil de entender e rápida de configurar.
Se você sentir que identificou alguma lacuna em nossa documentação, informe-nos abaixo.