feat: implementa o processamento de webhooks Wuzapi, incluindo tratamento de erros e documentação da resolução.

This commit is contained in:
Rodrigo Borba 2026-01-19 23:00:48 -03:00
parent 70e8759b5a
commit dbd66320e0
2 changed files with 49 additions and 14 deletions

View File

@ -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

View File

@ -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)