Pular para o conteúdo principal

Webhooks

Conceituacao

Webhooks permitem que voce receba notificacoes em tempo real quando eventos ocorrem na plataforma Ogmma. Em vez de fazer requisicoes periodicas (polling) para verificar se algo mudou, a Ogmma envia uma requisicao HTTP POST diretamente para a URL que voce configurar sempre que um evento relevante acontecer.

Isso permite que sua aplicacao reaja imediatamente a eventos como:

  • Mensagem recebida de um contato
  • Mensagem enviada confirmada pelo WhatsApp
  • Mensagem entregue ou lida
  • Conversa criada ou encerrada
  • Canal conectado ou desconectado

Como Funciona

  1. Voce registra um webhook com uma URL de destino e seleciona os eventos que deseja receber.
  2. Quando um evento ocorre, a Ogmma envia um POST com o payload do evento para sua URL.
  3. Sua aplicacao processa o payload e retorna um status HTTP 2xx para confirmar o recebimento.
  4. Caso a entrega falhe, a Ogmma realiza tentativas automaticas de acordo com a politica de retry configurada.

Componentes de um Webhook

ComponenteDescricao
URLEndereco HTTPS para onde os eventos serao enviados. Apenas HTTPS e aceito.
EventosLista de eventos que o webhook deve receber (ex: message.received, conversation.created).
SecretChave secreta usada para gerar a assinatura HMAC-SHA256 de cada payload.
Politica de RetryConfiguracao de tentativas automaticas em caso de falha (maxRetries, retryDelay).
StatusAtivo ou inativo. Webhooks inativos nao recebem eventos.

Eventos Disponiveis

EventoDescricao
message.receivedMensagem recebida de um contato.
message.sentMensagem enviada via API confirmada pelo WhatsApp.
message.deliveredMensagem entregue no dispositivo do destinatario (duplo check).
message.readMensagem lida pelo destinatario (checks azuis).
conversation.createdNova conversa criada (primeira mensagem de um novo contato).
conversation.closedConversa encerrada (por atendente ou via API).
channel.connectedCanal WhatsApp conectado com sucesso.
channel.disconnectedCanal perdeu a conexao.
contact.createdNovo contato criado na instituicao.
contact.updatedDados de um contato atualizados.
bulk.completedLote de envio em massa concluido com sucesso.
bulk.failedLote de envio em massa falhou ou foi cancelado.

Seguranca - Assinatura HMAC-SHA256

Todos os payloads enviados pela Ogmma sao assinados usando HMAC-SHA256 com o secret que voce definiu ao criar o webhook. A assinatura e enviada no header X-Ogmma-Signature.

Voce deve sempre verificar a assinatura antes de processar o payload para garantir que a requisicao realmente veio da Ogmma e nao foi adulterada.

Como a Assinatura e Gerada

  1. A Ogmma serializa o payload do evento em JSON.
  2. Gera o HMAC-SHA256 do JSON usando o secret do webhook.
  3. Envia o resultado como hex no header X-Ogmma-Signature.

Exemplo de Verificacao em Node.js

const crypto = require('crypto');

function verificarAssinatura(payload, assinatura, secret) {
const hmac = crypto.createHmac('sha256', secret);
const digest = hmac.update(JSON.stringify(payload)).digest('hex');
return crypto.timingSafeEqual(
Buffer.from(digest, 'hex'),
Buffer.from(assinatura, 'hex')
);
}

// Uso em um endpoint Express
app.post('/webhook', (req, res) => {
const assinatura = req.headers['x-ogmma-signature'];
const secret = 'seu_secret_aqui';

if (!verificarAssinatura(req.body, assinatura, secret)) {
return res.status(401).json({ error: 'Assinatura invalida' });
}

// Processar o evento
console.log('Evento recebido:', req.body.event);
res.status(200).json({ ok: true });
});

Exemplo de Verificacao em Python

import hmac
import hashlib
import json

def verificar_assinatura(payload, assinatura, secret):
digest = hmac.new(
secret.encode('utf-8'),
json.dumps(payload, separators=(',', ':')).encode('utf-8'),
hashlib.sha256
).hexdigest()
return hmac.compare_digest(digest, assinatura)

# Uso em um endpoint Flask
from flask import Flask, request, jsonify

app = Flask(__name__)

@app.route('/webhook', methods=['POST'])
def webhook():
assinatura = request.headers.get('X-Ogmma-Signature')
secret = 'seu_secret_aqui'

if not verificar_assinatura(request.json, assinatura, secret):
return jsonify({'error': 'Assinatura invalida'}), 401

# Processar o evento
print('Evento recebido:', request.json['event'])
return jsonify({'ok': True}), 200

Politica de Retry

Quando a entrega de um evento falha (sua URL retorna um status diferente de 2xx ou nao responde dentro do timeout), a Ogmma realiza tentativas automaticas:

ConfiguracaoPadraoDescricao
maxRetries5Numero maximo de tentativas apos a primeira falha.
retryDelay30000Intervalo em milissegundos entre tentativas (30 segundos).

Desativacao Automatica

Para proteger a performance do sistema, webhooks sao desativados automaticamente apos 5 falhas consecutivas de entrega. Quando isso ocorre:

  1. O webhook e marcado como active: false.
  2. O campo consecutiveFailures atinge o limite.
  3. Nenhum novo evento e enviado para esse webhook ate que seja reativado manualmente.

Para reativar, utilize o endpoint de atualizacao de webhook definindo active: true. O contador de falhas consecutivas sera resetado.

Dica

Monitore os logs de entrega do webhook via endpoint GET /api/webhooks/:id/logs para identificar problemas de conectividade antes que a desativacao automatica ocorra.

Importante

A URL do webhook deve utilizar HTTPS obrigatoriamente. URLs com HTTP serao rejeitadas na criacao e atualizacao do webhook.