WhatsApp (Web) - Em construção
Visão Geral
Este documento descreve as funcionalidades disponíveis para as integrações WhatsApp Web no sistema Omnichannel, incluindo exemplos de chamadas nos métodos disponíveis na lib.
1. Contatos
1.1 Criação de Contatos
- Atualmente, existem dois tipos de contatos: individuais e grupos. Ao cadastrar, o parâmetro
typedeve ser definido como 'individual' ou 'group', respectivamente. Visto que a implementação atual suporta apenas o WhatsApp, o parâmetrochannelTypedeve ser obrigatoriamente 'whatsapp'.
Exemplo:
import { ContactApi, CreateContactDto } from '@cirrus/omnichannel_api'
constructor(private readonly contactApi: ContactApi) {}
/**
* @param {string} clientIdentifier - Identificador único da conta.
* @param {string} channelId - Identificador do canal.
* @param {string} contactIdentifier - Contato do usuário (número de telefone, token (Telegram, etc).
* @param {string} name - Ordem em que os itens serão buscados (crescente ou decrescente).
* @param {string} type - Tipo do contato.
* @param {string} channelType - Tipo do canal.
* @param {string} customName - Nome customizado para o contato.
* @param {string} photo - Url da foto de perfil do contato no S3.
* @param {string[]} tagIds - Caso queira vincular tags ao um contato.
* @param {string} platform - Caso queira que o contato possua uma plataforma exclusiva.
* @param {boolean} isIgnored - Se 'true' o OMC não interceptará mensagens desse contato.
*/
const payload: CreateContactDto = {
clientIdentifier: '9a92ea44-244c-4cda-86be-6a9e32ba8f34',
channelId: '689a05215b711247e8f54022',
contactIdentifier: '5521999999999',
name: 'João Silva',
type: 'individual',
channelType: 'whatsapp',
customName: 'João (Mercearia)',
}
await this.contactApi.create(payload)
1.2 Edição de Contatos
- Edita um contato previamente cadastrado.
Exemplo:
import { ContactApi, UpdateContactDto } from '@cirrus/omnichannel_api'
constructor(private readonly contactApi: ContactApi) {}
/**
* @param {string} clientIdentifier - Identificador único da conta.
* @param {string} contactId - Identificador do contato.
* @param {string} customName - Nome customizado para o contato.
* @param {string} platform - Caso queira que o contato possua uma plataforma exclusiva.
* @param {string[]} tagIds - Caso queira vincular tags ao um contato.
* @param {string} contactIdentifier - Contato do usuário (número de telefone, token (Telegram, etc).
* @param {boolean} isIgnored - Se 'true' o OMC não interceptará mensagens desse contato.
*/
const payload: UpdateContactDto = {
clientIdentifier: '9a92ea44-244c-4cda-86be-6a9e32ba8f34',
contactId: '68e54649a3744412be5cc107',
customName: 'Nome Modificado',
platform: 'karoochatnew',
}
await this.contactApi.update(payload)
1.3
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- Listagem de contatos
import { ContactApi } from '@cirrus/omnichannel_api'
/**
* @param {string} clientIdentifier - Identificador único da conta.
* @param {number} page - Página em que a busca se iniciará.
* @param {number} limit - Limite de itens por página.
* @param {'asc' | 'desc'} order - Ordem em que os itens serão buscados (crescente ou decrescente).
* @param {'individual' | 'group'} type - Tipo de contato.
* @param {'whatsapp' | 'facebook' | 'instagram' | 'telegram'} channelType - Tipo de canal.
* @param {string} name - Nome do contato a ser buscado.
* @param {string} contactIdentifier - Contato que identifica um usuário (Número de telefone, token (Telegram), etc).
* @param {string[]} tagIds - Tags vinculadas ao contato.
*/
export interface GetContactsDto {
clientIdentifier: string;
page: number;
limit: number;
order?: 'asc' | 'desc';
type?: 'individual' | 'group';
channelType?: 'whatsapp' | 'facebook' | 'instagram' | 'telegram';
name?: string;
contactIdentifier?: string;
tagIds?: string[];
}
constructor(private readonly contactApi: ContactApi) {}
const payload: GetContactsDto
await this.contactApi.get(payload)
Endpoint: POST /api/accounts/{clientIdentifier}/contacts
Exemplo de Payload:
{
"contactIdentifier": "5521988887777",
"name": "João Silva",
"channelId": "64cbbd9596429dbccd7841e2",
"channelType": "whatsapp",
"type": "individual",
"platform": "whatsappweb"
}
Resposta:
{
"_id": "64cbbd9596429dbccd7841e4",
"contactIdentifier": "5521988887777",
"name": "João Silva",
"channelId": "64cbbd9596429dbccd7841e2",
"channelType": "whatsapp",
"type": "individual",
"platform": "whatsappweb",
"createdAt": "2023-08-03T10:30:00.000Z"
}
1.2 Importação de Grupos
Quando ocorre:
- Quando uma mensagem é recebida em um grupo do WhatsApp
- Durante sincronização de grupos ativos
Webhook WhatsApp Web: POST /api/webhook/whatsappweb/{platformConfigId}/{channelId}
Exemplo de Payload (Grupo):
{
"type": "GROUP_MESSAGE",
"from": "5521988887777",
"fromUserName": "João Silva",
"to": "5521977776666-group",
"body": {
"content": "Olá pessoal!",
"type": "text"
},
"groupInfo": {
"id": "5521977776666-group",
"name": "Grupo de Vendas",
"participants": ["5521988887777", "5521955554444"]
}
}
2. Mensagens Individuais
2.1 Envio de Mensagem de Texto
Endpoint: POST /api/message/send
WhatsApp Web:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"text": "Olá! Como posso ajudá-lo?",
"agentName": "Atendente Maria"
}
D360:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"text": "Olá! Como posso ajudá-lo?",
"agentName": "Atendente Maria"
}
Resposta:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"messageId": "wamid.HBgNNTUyMTk4ODg4Nzc3NxUCABIYFjNBMDJCMEE2RkY4QzRBOUNCNzAyRjAA"
}
2.2 Envio de Mensagem de Áudio
Endpoint: POST /api/message/send
WhatsApp Web:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"mediaUri": "https://s3.amazonaws.com/bucket/audio.mp3",
"agentName": "Atendente Maria"
}
D360:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"mediaUri": "https://s3.amazonaws.com/bucket/audio.ogg",
"agentName": "Atendente Maria"
}
2.3 Envio de Mensagem de Imagem
Endpoint: POST /api/message/send
WhatsApp Web:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"mediaUri": "https://s3.amazonaws.com/bucket/imagem.jpg",
"text": "Confira esta imagem!",
"agentName": "Atendente Maria"
}
D360:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"mediaUri": "https://s3.amazonaws.com/bucket/imagem.png",
"text": "Confira esta imagem!",
"agentName": "Atendente Maria"
}
2.4 Envio de Mensagem de Vídeo
Endpoint: POST /api/message/send
WhatsApp Web:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"mediaUri": "https://s3.amazonaws.com/bucket/video.mp4",
"text": "Vídeo explicativo",
"agentName": "Atendente Maria"
}
D360:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"mediaUri": "https://s3.amazonaws.com/bucket/video.mp4",
"text": "Vídeo explicativo",
"agentName": "Atendente Maria"
}
2.5 Envio de Mensagem de Documento
Endpoint: POST /api/message/send
WhatsApp Web:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"mediaUri": "https://s3.amazonaws.com/bucket/documento.pdf",
"agentName": "Atendente Maria"
}
D360:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"mediaUri": "https://s3.amazonaws.com/bucket/documento.pdf",
"agentName": "Atendente Maria"
}
2.6 Envio de Mensagem com Sticker
Endpoint: POST /api/message/send
WhatsApp Web:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"mediaUri": "https://s3.amazonaws.com/bucket/sticker.webp",
"agentName": "Atendente Maria"
}
D360:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"mediaUri": "https://s3.amazonaws.com/bucket/sticker.webp",
"agentName": "Atendente Maria"
}
2.7 Envio de Mensagem de Contatos
Endpoint: POST /api/message/send
D360 (Suporte nativo):
{
"sessionId": "64cbbd9596429dbccd7841e5",
"interactive": {
"type": "contacts",
"contacts": [
{
"name": {
"first_name": "João",
"last_name": "Silva",
"formatted_name": "João Silva"
},
"phones": [
{
"phone": "5521988887777",
"type": "WORK",
"wa_id": "5521988887777"
}
]
}
]
},
"agentName": "Atendente Maria"
}
WhatsApp Web (Texto formatado):
{
"sessionId": "64cbbd9596429dbccd7841e5",
"text": "Contato:\n👤 João Silva\n📱 (21) 98888-7777",
"agentName": "Atendente Maria"
}
3. Mensagens de Grupo
3.1 Envio de Mensagem de Texto em Grupo
Endpoint: POST /api/message
WhatsApp Web:
{
"recipientNumber": "5521977776666-group",
"text": "Olá pessoal do grupo!",
"isGroupMesssage": true
}
3.2 Envio de Mensagem de Áudio em Grupo
Endpoint: POST /api/message
WhatsApp Web:
{
"recipientNumber": "5521977776666-group",
"mediaUri": "https://s3.amazonaws.com/bucket/audio.mp3",
"isGroupMesssage": true
}
3.3 Envio de Mensagem de Imagem em Grupo
Endpoint: POST /api/message
WhatsApp Web:
{
"recipientNumber": "5521977776666-group",
"mediaUri": "https://s3.amazonaws.com/bucket/imagem.jpg",
"text": "Imagem para o grupo",
"isGroupMesssage": true
}
3.4 Envio de Mensagem de Vídeo em Grupo
Endpoint: POST /api/message
WhatsApp Web:
{
"recipientNumber": "5521977776666-group",
"mediaUri": "https://s3.amazonaws.com/bucket/video.mp4",
"text": "Vídeo para o grupo",
"isGroupMesssage": true
}
3.5 Envio de Mensagem de Documento em Grupo
Endpoint: POST /api/message
WhatsApp Web:
{
"recipientNumber": "5521977776666-group",
"mediaUri": "https://s3.amazonaws.com/bucket/documento.pdf",
"isGroupMesssage": true
}
3.6 Envio de Mensagem com Sticker em Grupo
Endpoint: POST /api/message
WhatsApp Web:
{
"recipientNumber": "5521977776666-group",
"mediaUri": "https://s3.amazonaws.com/bucket/sticker.webp",
"isGroupMesssage": true
}
3.7 Envio de Mensagem de Contatos em Grupo
Endpoint: POST /api/message
WhatsApp Web:
{
"recipientNumber": "5521977776666-group",
"text": "Contato do suporte:\n👤 Maria Atendente\n📱 (21) 99999-8888",
"isGroupMesssage": true
}
4. Recursos Adicionais de Mensagem
4.1 Indicador de "Digitando"
WhatsApp Web:
- Funcionalidade automática do WhatsApp Web
- Não requer chamada específica da API
D360:
- Não suportado nativamente
- Pode ser simulado com delay entre mensagens
4.2 Marcar Mensagem como Lida
Funcionalidade automática:
- WhatsApp Web: Marca automaticamente como lida quando a mensagem é processada
- D360: Status de leitura é enviado via webhook
Webhook de Status (D360):
{
"statuses": [
{
"id": "wamid.HBgNNTUyMTk4ODg4Nzc3NxUCABIYFjNBMDJCMEE2RkY4QzRBOUNCNzAyRjAA",
"status": "read",
"timestamp": "1659518400",
"recipient_id": "5521988887777"
}
]
}
4.3 Responder Mensagem (Quote)
Endpoint: POST /api/message/send
WhatsApp Web:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"text": "Respondendo à sua pergunta...",
"quotedMessage": {
"id": "message_id_original",
"message": "Qual o horário de funcionamento?"
},
"agentName": "Atendente Maria"
}
D360:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"text": "Respondendo à sua pergunta...",
"quotedMessage": {
"id": "wamid.HBgNNTUyMTk4ODg4Nzc3NxUCABIYFjNBMDJCMEE2RkY4QzRBOUNCNzAyRjAA"
},
"agentName": "Atendente Maria"
}
4.4 Mensagens Interativas (D360)
Botões:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"interactive": {
"type": "button",
"body": {
"text": "Escolha uma opção:"
},
"action": {
"buttons": [
{
"type": "reply",
"reply": {
"id": "opcao_1",
"title": "Opção 1"
}
},
{
"type": "reply",
"reply": {
"id": "opcao_2",
"title": "Opção 2"
}
}
]
}
},
"agentName": "Atendente Maria"
}
Lista:
{
"sessionId": "64cbbd9596429dbccd7841e5",
"interactive": {
"type": "list",
"body": {
"text": "Selecione um departamento:"
},
"action": {
"button": "Ver opções",
"sections": [
{
"title": "Departamentos",
"rows": [
{
"id": "vendas",
"title": "Vendas",
"description": "Equipe de vendas"
},
{
"id": "suporte",
"title": "Suporte",
"description": "Suporte técnico"
}
]
}
]
}
},
"agentName": "Atendente Maria"
}
4.5 Templates (D360)
Iniciar Conversa com Template:
Endpoint: POST /api/message/start/d360
{
"to": "5521988887777",
"userName": "João Silva",
"companyName": "Alterdata",
"template": "contato_cliente",
"templateVariables": ["João Silva", "Alterdata"]
}
4.6 Deletar Mensagem
Endpoint: DELETE /api/message/{messageId}?senderId={senderId}&channelSlug={channelSlug}
WhatsApp Web:
DELETE /api/message/message_id_123?senderId=5521977776666&channelSlug=whatsappweb
D360:
DELETE /api/message/wamid.HBgNNTUyMTk4ODg4Nzc3NxUCABIYFjNBMDJCMEE2RkY4QzRBOUNCNzAyRjAA?senderId=5521977776666&channelSlug=d360
5. Webhooks de Recebimento
5.1 Webhook WhatsApp Web
URL: POST /api/webhook/whatsappweb/{platformConfigId}/{channelId}
Exemplo de Mensagem Recebida:
{
"type": "MESSAGE",
"from": "5521988887777",
"fromUserName": "João Silva",
"to": "web5521977776666",
"body": {
"content": "Olá, preciso de ajuda",
"type": "text"
},
"timestamp": 1659518400
}
5.2 Webhook D360
URL: POST /api/webhook/360dialog/{platformConfigId}/{channelId}
Exemplo de Mensagem Recebida:
{
"messages": [
{
"id": "wamid.HBgNNTUyMTk4ODg4Nzc3NxUCABIYFjNBMDJCMEE2RkY4QzRBOUNCNzAyRjAA",
"from": "5521988887777",
"type": "text",
"timestamp": "1659518400",
"text": {
"body": "Olá, preciso de ajuda"
}
}
],
"contacts": [
{
"profile": {
"name": "João Silva"
},
"wa_id": "5521988887777"
}
]
}
6. Gestão de Sessões
6.1 Obter Sessão
Endpoint: GET /api/session/{sessionId}
Resposta:
{
"_id": "64cbbd9596429dbccd7841e5",
"client": {
"name": "João Silva",
"providerId": "5521988887777"
},
"type": "whatsappweb",
"status": "active",
"createdAt": "2023-08-03T10:30:00.000Z"
}
6.2 Transferir Sessão
Endpoint: POST /api/session/transfer/{sessionId}
{
"params": {
"platformSlug": "crm",
"agentId": "agent_123"
},
"transferMessage": "Transferindo para o especialista..."
}
6.3 Finalizar Sessão
Endpoint: DELETE /api/session/finish/{sessionId}
Resposta:
{
"message": "Session finished successfully",
"sessionId": "64cbbd9596429dbccd7841e5"
}
7. Diferenças entre WhatsApp Web e D360
| Funcionalidade | WhatsApp Web | D360 |
|---|---|---|
| Mensagens de Texto | ✅ | ✅ |
| Mídia (Imagem/Vídeo/Áudio) | ✅ | ✅ |
| Documentos | ✅ | ✅ |
| Stickers | ✅ | ✅ |
| Mensagens de Grupo | ✅ | ❌ |
| Templates | ❌ | ✅ |
| Botões Interativos | ❌ | ✅ |
| Listas Interativas | ❌ | ✅ |
| Contatos Estruturados | ❌ | ✅ |
| Indicador de Digitando | ✅ | ❌ |
| Deletar Mensagens | ✅ | ❌ |
| Validação de Números | ✅ | ❌ |
| Foto de Perfil | ✅ | ❌ |
8. Códigos de Erro Comuns
8.1 WhatsApp Web
404: Número não encontrado no WhatsApp Web400: Conexão com WhatsApp Web fechada400: Número inválido
8.2 D360
401: Token de API inválido400: Formato de mensagem inválido429: Limite de taxa excedido500: Erro interno do D360
9. Configuração de Webhooks
9.1 WhatsApp Web
GET /{clientNumber}/setWebhook?url={webhookUrl}
9.2 D360
POST /configs/webhook
{
"url": "https://seu-dominio.com/api/webhook/360dialog/{platformConfigId}/{channelId}"
}
10. Monitoramento e Logs
10.1 Status de Conexão
WhatsApp Web:
GET /{clientNumber}/status
Resposta:
{
"status": "open",
"qr": null,
"battery": 85,
"plugged": true
}
10.2 Validação de Número
WhatsApp Web:
GET /{providerId}/validate/{contact}
Resposta:
{
"input": "5521988887777",
"isValid": true,
"jid": "5521988887777@c.us",
"lid": "5521988887777@lid",
"phone": "5521988887777"
}
Esta documentação cobre todas as funcionalidades principais das integrações WhatsApp Web e D360 disponíveis no sistema Omnichannel. Para implementações específicas ou dúvidas técnicas, consulte o código-fonte ou entre em contato com a equipe de desenvolvimento.