Skip to content
wiki-bot edited this page Mar 17, 2026 · 2 revisions

Coexistência Web + Meta (Baileys v7)

Visão geral

  • Permite operar cliente Web (Baileys) e cliente Meta (Cloud API) em paralelo.
  • Primeira mensagem 1:1 sai pelo Web; ao receber mensagem via Meta abre janela de 24h no Redis.
  • Com janela aberta, envios 1:1 passam a sair pelo Meta; grupos permanecem no Web.

Pré-requisitos

  • Redis acessível (REDIS_URL).
  • Token da Cloud API válido e phone_number_id configurado.
  • Sessão Web (QR/device) já conectada.

Variáveis de ambiente

  • Ativar: COEXISTENCE_ENABLED=true
  • TTL opcional: COEXISTENCE_WINDOW_SECONDS=86400 (padrão 24h)
  • Cloud API (já usadas no forwarder):
    • WEBHOOK_FORWARD_URL=https://graph.facebook.com
    • WEBHOOK_FORWARD_VERSION=v17.0 (ajuste se necessário)
    • WEBHOOK_FORWARD_PHONE_NUMBER_ID=<seu_phone_number_id>
    • WEBHOOK_FORWARD_TOKEN=<Bearer da Cloud API>
    • WEBHOOK_FORWARD_BUSINESS_ACCOUNT_ID=<opcional>
  • Verificação de webhook: UNOAPI_AUTH_TOKEN (ou authToken na config Redis).

Configuração por sessão no Manager (/public/index)

  • Ao editar/adicionar sessão, preencha:
    • Coexistência: habilitar toggle e (opcional) janela em segundos.
    • Cloud API: base URL, versão, phone_number_id, token e Business Account ID (opcional).
    • Demais campos do Web permanecem iguais.
  • Todas as configs são persistidas na sessão específica (Redis), não é global.

Embedded Signup (opcional, para preencher Cloud automaticamente)

  • No app Meta: cadastre um redirect_uri HTTPS e obtenha o appId (produto WhatsApp).
  • Exponha o appId e o redirect_uri no front (ex.: via env -> EMBEDDED_SIGNUP_APP_ID, EMBEDDED_SIGNUP_REDIRECT_URI e renderize em window.EMBEDDED_SIGNUP_APP_ID/window.EMBEDDED_SIGNUP_REDIRECT_URI no HTML do manager). Mesmo sem env, o /embedded/config.js retorna JS válido (valores vazios) para não quebrar o front.
  • Após concluir o Embedded Signup, a página é carregada com wa_phone_id, wa_waba_id, wa_token (e opcional wa_version). O manager:
    • Armazena o payload e, ao abrir a sessão, preenche webhookForward.*, habilita coexistência e sugere janela 24h.
    • Mantém a modal aberta e exibe um alerta de “Dados de Cloud atualizados. Revise e salve.”
  • Se clicar em “Importar retorno do Embedded” e não houver payload armazenado na aba, é exibido um alerta avisando para concluir o fluxo ou abrir o link de retorno.
  • Clique em “Importar retorno do Embedded” (ou apenas abra a sessão) para aplicar os valores e depois salve a sessão para persistir.
  • Endpoint backend /embedded/exchange: troca codeaccess_token (usa env EMBEDDED_SIGNUP_APP_ID, EMBEDDED_SIGNUP_APP_SECRET, EMBEDDED_SIGNUP_REDIRECT_URI, versão padrão EMBEDDED_SIGNUP_GRAPH_VERSION=v24.0) e tenta preencher phone_number_id/waba_id automaticamente.
  • Página de callback public/embedded-callback.html chama /embedded/exchange, guarda o payload em localStorage e redireciona para o manager.

Webhook Meta (entrada)

  • Configure no BM/WA Cloud: https://<host>/webhooks/whatsapp (único endpoint; roteamos pelo phone_number_id).
  • Use o verify token de UNOAPI_AUTH_TOKEN.
  • Assine eventos de messages/statuses.
  • O webhook aciona a abertura da janela de 24h para os contatos que enviarem mensagens via Meta.

Fluxo de mensagens

  1. Envio 1:1 inicial → Web (Baileys) sem template.
  2. Resposta via Meta (webhook) → abre janela 24h no Redis para o contato.
  3. Com janela aberta → envios 1:1 seguem pelo Meta; cada envio renova a janela.
  4. Expirou a janela → volta a enviar pelo Web até nova mensagem Meta abrir outra janela.
  5. Grupos e status continuam sempre pelo Web.
  6. Endereçamento Meta: apenas PN (dígitos, ex.: 55...). Se o destino vier em @lid, ele é normalizado para número antes de enviar; grupos nunca vão para o Meta.

Como usar

  • Suba a aplicação com as envs acima.
  • Faça login QR normalmente.
  • Verifique logs (nível debug) por COEX window opened.
  • Teste: envie mensagem 1:1 (sai Web), responda pelo contato (via Meta), depois envie novamente (deve sair Meta).

Observações

  • Se COEXISTENCE_ENABLED=false ou Cloud não estiver configurado, tudo funciona como antes (apenas Web).
  • Nenhuma rota AMQP mudou; somente o roteamento 1:1 e o webhook Meta passam a controlar a janela de 24h.

Clone this wiki locally