
Idioma 🇧🇷 Português (Brasil)
Visão geral
Implementação
Bastidores
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 ngrok.
Para simplificar a manutenção da segurança do sistema, o desenvolvimento local segue o mesmo processo de configuração e proteção que outros ambientes.
Etapa 1: Adicione "localhost" aos domínios na sua conta.
Adicione "localhost" como um domínio aqui.
Etapa 2: Escolha uma Chave de API
Vamos adicionar a configuração de webhook para o seu domínio, então precisaremos de uma chave de API. Você pode fazer isso aqui.
Em "Associate with domain" - selecione seu domínio "localhost".
NOTA: Alternativamente, você pode usar um API Secret para toda a atividade de teste e ambientes de staging. Basta adicionar um API Secret para "All Domains", e dar um nome como "test".
Garanta que você tenha um API Secret definido para seu(s) domínio(s) de produção. Eventos de todos os outros domínios usarão o secret curinga (de teste).
Etapa 3: Adicione seu Webhook
Enquanto estiver executando ngrok ou uma ferramenta similar, defina o valor para "localhost" aqui.
Quando clicar em Send Test Payload, enviaremos dois eventos de teste para verificar se você valida a chave de API.
Uma vez validado, clique em Save.
Etapa 4: Adicione Um Comentário
Agora você pode adicionar, editar ou excluir comentários e deve 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 os eventos chegarem à sua máquina.
Configuração 
Siga os mesmos passos para localhost que seguiria para produção. Certifique-se de ter domínios de produção e API Secrets configurados.
Primeiro, navegue até o Webhooks admin. Isso é acessível em Gerenciar Dados -> Webhooks.
A página de configuração aparece da seguinte forma:
Nesta página você pode especificar endpoints para cada tipo de evento de comentário.
Para cada tipo de evento, certifique-se de clicar em Enviar Payload de Teste para garantir que você configurou sua integração corretamente. Veja a próxima seção, "Testes", para detalhes.
Testes 
Na 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 fictício WebhookComment, enquanto o teste de Delete enviará um corpo de requisição fictício contendo apenas um ID.
Verificando Payloads
Ao testar sua integração de webhook, verifique se as requisições recebidas incluem os seguintes cabeçalhos:
token- Your API SecretX-FastComments-Timestamp- Unix timestamp (seconds)X-FastComments-Signature- HMAC-SHA256 signature
Use a verificação de assinatura HMAC para garantir que os payloads sejam 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 Evento
- Create Event: Acionado quando um novo comentário é criado. Método padrão: PUT
- Update Event: Acionado quando um comentário é editado. Método padrão: PUT
- Delete Event: Acionado quando um comentário é excluído. Método padrão: DELETE
Cada evento inclui todos os dados 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.
A Estrutura do Objeto WebhookComment
A Estrutura do Evento "Create"
O corpo da requisição do evento "create" é um objeto WebhookComment.
A Estrutura do Evento "Update"
O corpo da requisição do evento "update" é um objeto WebhookComment.
A Estrutura do Evento "Delete"
O corpo da requisição do evento "delete" é um objeto WebhookComment.
Mudança a partir de 14 de nov de 2023
Anteriormente, o corpo da requisição do evento "delete" continha apenas o id do comentário. Agora contém o comentário completo no momento da exclusão.
Run 
Quando usuários são marcados em um comentário, a informação é armazenada 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 de criação: POST ou PUT (padrão: PUT)
- Evento de atualização: POST ou PUT (padrão: PUT)
- Evento de exclusão: DELETE, POST ou PUT (padrão: DELETE)
Como todas as requisições contêm um ID, operações de 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 de webhook inclui os seguintes cabeçalhos:
| Header | Descrição |
|---|---|
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 Security & API Tokens para informações sobre verificação da 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.