diff --git a/app/controllers/webhooks/wuzapi_controller.rb b/app/controllers/webhooks/wuzapi_controller.rb index f10ab84..8f25be8 100644 --- a/app/controllers/webhooks/wuzapi_controller.rb +++ b/app/controllers/webhooks/wuzapi_controller.rb @@ -4,20 +4,15 @@ class Webhooks::WuzapiController < ActionController::Base before_action :verify_secret def process_payload - # Normalize payload keys if necessary based on Wuzapi behavior - # Assuming Wuzapi sends standard WA format or we adapt it here - # For now, just logging to verify reception Rails.logger.info "Wuzapi Webhook Received for Inbox #{@inbox.id}: #{params.inspect}" - # TODO: Implement actual message processing logic: - # 1. Parse payload to extract Phone, Body, Type (Text/Image) - # 2. Find or create Contact - # 3. Create Message in Conversation - - # Example adapter call (to be implemented): - # Whatsapp::Providers::WuzapiAdapter.new(@inbox).process(params) + Whatsapp::IncomingMessageWuzapiService.new(inbox: @inbox, params: params.to_unsafe_hash).perform head :ok + rescue StandardError => e + Rails.logger.error "Error processing Wuzapi webhook: #{e.message}" + Rails.logger.error e.backtrace.join("\n") + head :internal_server_error end private @@ -32,9 +27,9 @@ class Webhooks::WuzapiController < ActionController::Base secret = params[:secret] stored_secret = @inbox.channel.provider_config['webhook_secret'] - if secret.blank? || secret != stored_secret - Rails.logger.warn "Wuzapi Webhook: Invalid secret for Inbox #{@inbox.id}. Received: #{secret}" - head :unauthorized - end + return unless secret.blank? || secret != stored_secret + + Rails.logger.warn "Wuzapi Webhook: Invalid secret for Inbox #{@inbox.id}. Received: #{secret}" + head :unauthorized end end diff --git a/progresso/resolucao-webhook-wuzapi.md b/progresso/resolucao-webhook-wuzapi.md new file mode 100644 index 0000000..b190dad --- /dev/null +++ b/progresso/resolucao-webhook-wuzapi.md @@ -0,0 +1,40 @@ +# Resolução: Falha no Recebimento de Webhooks Wuzapi + +## Contexto + +Mensagens enviadas para o número WhatsApp não estavam chegando na caixa de entrada do Chatwoot no ambiente local, apesar de mensagens de saída funcionarem. + +## Diagnóstico + +1. **Backend (Controller)**: O `Webhooks::WuzapiController` existia mas o método `process_payload` estava vazio. Ele recebia o webhook, retornava 200 OK, mas não fazia nada. +2. **Ambiente (Túnel)**: O comando `make run` inicia apenas o servidor Rails/Sidekiq, sem o túnel Ngrok necessário para expor o localhost para a internet (Wuzapi). +3. **Segurança**: O ID da Inbox usado nos testes iniciais (3) era diferente do ID do canal para o qual o webhook estava sendo enviado, causando confusão inicial. + +## Solução Técnica + +1. **Implementação do Controller**: + Conectamos o controller ao serviço existente: + + ```ruby + # app/controllers/webhooks/wuzapi_controller.rb + def process_payload + Whatsapp::IncomingMessageWuzapiService.new(inbox: @inbox, params: params.to_unsafe_hash).perform + head :ok + rescue StandardError => e + Rails.logger.error e + head :internal_server_error + end + ``` + +2. **Fluxo de Execução**: + Padronizado o uso de `make force_run_tunnel` para garantir que o Ngrok suba junto com a aplicação. + +## Validação + +- Teste simulado via `curl` confirmou criação de mensagem no banco. +- Teste real ("Teste 123") confirmado pelo usuário e validado nos logs com resposta automática do Agente ("Olá! Como posso ajudar..."). + +## Arquivos Alterados + +- `app/controllers/webhooks/wuzapi_controller.rb` +- `task.md`, `walkthrough.md` (Documentação)