Mensagens WhatsApp
Integração com Evolution API para envio de texto via REST autenticado.
Visão geral
O módulo whatsapp envia mensagens de texto pela Evolution API (/message/sendText/{instance}). É um wrapper fino: um endpoint REST e um service com fetch.
Pontos principais
- • Config via EVOLUTION_API_URL / INSTANCE / KEY
- • POST /whatsapp/send com JWT
- • Número enviado como informado
- • Falhas de rede/API propagam como HTTP 502
- • WhatsappService exportado
Estrutura
src/modules/whatsapp/
├── whatsapp.module.ts
├── whatsapp.controller.ts
├── whatsapp.service.ts
└── dtos/
└── send-whatsapp.dto.ts
src/config/whatsapp.config.ts
Configuração Evolution API
Namespace whatsapp em src/config/whatsapp.config.ts:
EVOLUTION_API_URL=http://localhost:8080 EVOLUTION_API_INSTANCE=default EVOLUTION_API_KEY=your-api-key
Instância
A instance deve existir na Evolution API. A key vai no header apiKey da requisição. Sem URL/instance configurados, a API responde 503.
WhatsappService
Método principal:
- • sendMessage(to, message) — POST ${url}/message/sendText/${instance}
- • Body: { number: to, text: message }
- • Headers: Content-Type application/json, apiKey
Comportamento de erro
Rede ou HTTP não-OK da Evolution → BadGatewayException (502). Config ausente → ServiceUnavailableException (503). O controller não responde 200 nesses casos.
// WhatsappService.sendMessage(to, message)
// número enviado como informado
POST ${EVOLUTION_API_URL}/message/sendText/${EVOLUTION_API_INSTANCE}
Headers: { "Content-Type": "application/json", "apiKey": "..." }
Body: { "number": to, "text": message }
API REST
JWT obrigatório. Sem @Roles — qualquer usuário autenticado.
DTO
- • to — string só com dígitos (@Matches /^\d+$/); enviada como está
- • message — string não vazia
Enviar mensagem
to: só dígitos, no formato esperado pela Evolution (inclua o DDI se necessário, ex. 5511999999999). message: texto.
POST /api/v1/whatsapp/send
Content-Type: application/json
Authorization: Bearer <access_token>
{
"to": "5511999999999",
"message": "Hello, this is a test message"
}Resposta de sucesso
{
"message": "WhatsApp message sent successfully"
}Respostas de erro
- • 401 — JWT ausente ou inválido
- • 502 — Evolution inacessível ou respondeu com erro
- • 503 — EVOLUTION_API_URL / INSTANCE não configurados
Usar em outro módulo
Importe WhatsappModule e injete WhatsappService.
@Module({
imports: [WhatsappModule],
providers: [MyService],
})
export class MyModule {}
@Injectable()
export class MyService {
constructor(private readonly whatsappService: WhatsappService) {}
async notify(phone: string, text: string) {
await this.whatsappService.sendMessage(phone, text);
}
}
Atenção
Formato do número
O service não adiciona DDI. Envie to já no formato que a Evolution API espera (ex.: 5511999999999 para Brasil).
Erros da API
Falhas de rede/HTTP da Evolution sobem como 502. Sucesso só após response.ok.