WhatsApp (D360)
Visão Geral
Este documento descreve as funcionalidades disponíveis para a integração com o WhatsApp (D360) no sistema Omnichannel, incluindo exemplos de chamadas nos métodos disponíveis na lib.
Nota: Esta documentação apresenta exemplos utilizando NestJS com injeção de dependência, mas a biblioteca pode ser utilizada em qualquer projeto JavaScript/TypeScript. Para uso fora do NestJS, utilize o método getInstance() das classes (ex: SetupApi.getInstance(), MessageApi.getInstance()).
1. Configuração e Setup
1.1 Setup do Provedor D360
- Configura um novo canal D360 com as credenciais e parâmetros necessários. O D360 suporta modo sandbox para testes e modo produção.
Exemplo:
import { SetupApi, SetupD360Dto, MessageServiceEnum } from '@cirrus/omnichannel_api'
constructor(private readonly setupApi: SetupApi) {}
/**
* @param {string} clientIdentifier - Identificador único do cliente.
* @param {object} provider - Configurações do provedor D360.
* @param {string} provider.token - Token de API do D360.
* @param {string} provider.clientNumber - Número do cliente (opcional).
* @param {string} provider.namespace - Namespace do D360 (opcional).
* @param {string} provider.template - Template padrão (opcional).
* @param {boolean} provider.isSandbox - Se está em modo sandbox.
* @param {string} provider.accountName - Nome da conta (opcional).
* @param {string} startingPlatform - Plataforma inicial.
* @param {array} platforms - Configurações das plataformas.
* @param {string} description - Descrição do canal (opcional).
*/
const setupDto: SetupD360Dto = {
clientIdentifier: '9a92ea44-244c-4cda-86be-6a9e32ba8f34',
provider: {
token: 'your_d360_api_token',
clientNumber: '5521999999999',
namespace: 'your_namespace',
template: 'hello_world',
isSandbox: false,
accountName: 'My Company'
},
startingPlatform: 'karoochat',
platforms: [
{
callbackUrl: 'https://myapp.com/webhook',
slug: 'karoochat'
}
],
description: 'Canal D360 para atendimento'
}
const platformConfig = await this.setupApi.setup(setupDto, MessageServiceEnum.d360)
1.2 Onboarding D360
- Realiza o processo de onboarding automatizado para múltiplos canais D360. Este processo configura automaticamente os webhooks e credenciais necessárias.
Exemplo:
import { SetupApi, OnboardingParamsDto, OnboardingResponseDto } from '@cirrus/omnichannel_api'
constructor(private readonly setupApi: SetupApi) {}
/**
* @param {string} client - Identificador do cliente.
* @param {string[]} channels - Lista de canais para onboarding.
* @param {string[]} revoked - Lista de canais revogados (opcional).
* @param {string} template - Template padrão (opcional).
* @param {string} redirect - URL de redirecionamento (opcional).
* @param {string} clientIdentifier - Identificador único do cliente.
* @param {string} startingPlatform - Plataforma inicial.
*/
const onboardingParams: OnboardingParamsDto = {
client: 'my_company',
channels: ['5521999999999', '5521888888888'],
revoked: ['5521777777777'],
template: 'hello_world',
redirect: 'https://myapp.com/onboarding-success',
clientIdentifier: '9a92ea44-244c-4cda-86be-6a9e32ba8f34',
startingPlatform: 'karoochat'
}
const response: OnboardingResponseDto[] = await this.setupApi.onboarding(onboardingParams)
// Resposta quando redirect não é fornecido:
// [
// {
// "channel": "5521999999999",
// "clientNumber": "5521999999999",
// "platformConfigId": "64ec8226e35a9b6ce663bf07",
// "channelId": "64ec9650a1ebf28cb9fa37f0",
// "namespace": "your_namespace",
// "token": "your_api_key"
// }
// ]
2. Contatos
- No momento a regra de negócio só está permitindo cadastrar contatos de Whatsapp Web.
3. Tags
- No momento a regra de negócio só está permitindo cadastrar tags para contatos de Whatsapp Web.
4. Conversa
4.1 Iniciar Conversa
- Inicia uma nova conversa com um contato via D360. O campo companyName não é obrigatório para D360.
Exemplo:
import { MessageApi, StartConversationDto, MessageServiceEnum } from '@cirrus/omnichannel_api'
constructor(private readonly messageApi: MessageApi) {}
/**
* @param {string} platformConfigId - Identificador da configuração da plataforma.
* @param {string} channelId - Identificador do canal.
* @param {string} clientProviderId - Identificador do cliente no provedor.
* @param {string} userName - Nome do usuário.
* @param {string} platform - Plataforma específica.
* @param {boolean} sessionWithPriority - Se a sessão deve ter prioridade.
*/
const payload: StartConversationDto = {
platformConfigId: '64ef5c84f9deb1326965919f',
channelId: '64ef5c84f9deb1326965919e',
clientProviderId: '5521999999999',
userName: 'João Silva',
platform: 'karoochat',
sessionWithPriority: false
}
const response = await this.messageApi.startConversation(payload, MessageServiceEnum.d360)
5. Mensagens individuais
5.1 Enviar Mensagem de Texto
- Envia uma mensagem de texto para um contato individual.
Exemplo:
import { MessageApi, SendMessageDto } from '@cirrus/omnichannel_api'
constructor(private readonly messageApi: MessageApi) {}
/**
* @param {string} agentName - Nome do agente.
* @param {string} sessionId - Identificador da sessão.
* @param {string} text - Texto da mensagem.
*/
const payload: SendMessageDto = {
agentName: 'Atendente João',
sessionId: '64ef5c85f9deb132696591a0',
text: 'Olá! Como posso ajudá-lo hoje?'
}
const response = await this.messageApi.sendMessage(payload)
5.2 Enviar Mensagem de Mídia
- Envia mensagens com anexos de mídia (imagens, vídeos, documentos, áudios).
Exemplo:
import { MessageApi, SendMessageDto } from '@cirrus/omnichannel_api'
constructor(private readonly messageApi: MessageApi) {}
/**
* @param {string} agentName - Nome do agente que está enviando a mensagem.
* @param {string} sessionId - Identificador da sessão.
* @param {string} mediaUri - URL da mídia a ser enviada.
*/
const payload: SendMessageDto = {
agentName: 'Atendente Maria',
sessionId: '64ef5c85f9deb132696591a0',
mediaUri: 'https://exemplo.com/documento.pdf'
}
const response = await this.messageApi.sendMessage(payload)
5.3 Envio de Mídias com Legenda
- Não implementado.
5.4 Enviar Sticker
- Não implementado.
5.5 Enviar Contatos
- Não implementado.
5.6 Enviar Reação em Mensagens Individuais
- Não implementado.
5.7 Enviar Mensagem Interativa
- O D360 suporta mensagens interativas avançadas, incluindo botões e listas. Esta é uma funcionalidade exclusiva do D360 (API Oficial) não disponível no WhatsApp Web.
Exemplo - Lista Interativa:
import { MessageApi, SendMessageDto } from '@cirrus/omnichannel_api'
constructor(private readonly messageApi: MessageApi) {}
/**
* @param {string} sessionId - Identificador da sessão.
* @param {string} agentName - Nome do agente que está enviando a mensagem.
* @param {object} interactive - Objeto da mensagem interativa.
* @param {string} interactive.type - Tipo da mensagem interativa (list).
* @param {object} interactive.body - Corpo da mensagem.
* @param {string} interactive.body.text - Texto principal da mensagem.
* @param {object} interactive.action - Ações disponíveis.
* @param {string} interactive.action.button - Texto do botão principal.
* @param {array} interactive.action.sections - Seções com opções.
*/
const payload: SendMessageDto = {
sessionId: '651f0e422ed69abd580b3761',
agentName: 'Atendente Maria',
interactive: {
type: 'list',
body: {
text: 'Escolha uma das opções abaixo:'
},
action: {
button: 'Ver Opções',
sections: [
{
rows: [
{
id: 'opcao_1',
title: 'Suporte Técnico',
description: 'Problemas com produtos ou serviços'
},
{
id: 'opcao_2',
title: 'Vendas',
description: 'Informações sobre produtos'
},
{
id: 'opcao_3',
title: 'Financeiro',
description: 'Dúvidas sobre pagamentos'
}
]
}
]
}
}
}
const response = await this.messageApi.sendMessage(payload)
Exemplo - Botões Interativos:
import { MessageApi, SendMessageDto } from '@cirrus/omnichannel_api'
constructor(private readonly messageApi: MessageApi) {}
/**
* @param {string} sessionId - Identificador da sessão.
* @param {string} agentName - Nome do agente que está enviando a mensagem.
* @param {object} interactive - Objeto da mensagem interativa.
* @param {string} interactive.type - Tipo da mensagem interativa (button).
* @param {object} interactive.body - Corpo da mensagem.
* @param {string} interactive.body.text - Texto principal da mensagem.
* @param {object} interactive.action - Ações disponíveis.
* @param {array} interactive.action.buttons - Array de botões.
*/
const payload: SendMessageDto = {
sessionId: '651f0e422ed69abd580b3761',
agentName: 'Atendente Maria',
interactive: {
type: 'button',
body: {
text: 'Deseja continuar com o atendimento?'
},
action: {
buttons: [
{
type: 'reply',
reply: {
id: 'sim',
title: 'Sim'
}
},
{
type: 'reply',
reply: {
id: 'nao',
title: 'Não'
}
}
]
}
}
}
const response = await this.messageApi.sendMessage(payload)
5.8 Enviar Localização
- Não implementado.
5.9 Enviar Endereço
- Não implementado.
5.10 Solicitação de Localização
- Não implementado.
5.11 Encaminhar mensagem
- Não implementado.
5.12 Deletar Mensagem Individual
- Método não suportado pela plataforma.
6. Mensagens de Grupo
6.1 Enviar Mensagem de Texto para Grupo
- Envia uma mensagem de texto para um grupo.
Exemplo:
import { MessageApi, SendMessageDto } from '@cirrus/omnichannel_api'
constructor(private readonly messageApi: MessageApi) {}
/**
* @param {string} agentName - Nome do agente.
* @param {string} sessionId - Identificador da sessão.
* @param {string} text - Texto da mensagem.
*/
const payload: SendMessageDto = {
agentName: 'Atendente João',
sessionId: '64ef5c85f9deb132696591a0',
text: 'Olá! Como posso ajudá-lo hoje?'
}
const response = await this.messageApi.sendMessage(payload)
6.2 Enviar Mensagem de Mídia para Grupo
- Envia mensagens com anexos de mídia para um grupo (imagens, vídeos, documentos, áudios).
Exemplo:
import { MessageApi, SendMessageDto } from '@cirrus/omnichannel_api'
constructor(private readonly messageApi: MessageApi) {}
/**
* @param {string} agentName - Nome do agente que está enviando a mensagem.
* @param {string} sessionId - Identificador da sessão.
* @param {string} mediaUri - URL da mídia a ser enviada.
*/
const payload: SendMessageDto = {
agentName: 'Atendente Maria',
sessionId: '64ef5c85f9deb132696591a0',
mediaUri: 'https://exemplo.com/documento.pdf'
}
const response = await this.messageApi.sendMessage(payload)
6.3 Envio de Mídias com Legenda para Grupos
- Não implementado.
6.4 Enviar Sticker para Grupos
- Não implementado.
6.5 Enviar Contatos para Grupos
- Não implementado.
6.6 Enviar Reação em Mensagens de Grupos
- Não implementado.
6.7 Enviar Mensagem Interativa em Grupos
- O D360 suporta mensagens interativas avançadas, incluindo botões e listas. Esta é uma funcionalidade exclusiva do D360 (API Oficial) não disponível no WhatsApp Web.
Exemplo - Lista Interativa:
import { MessageApi, SendMessageDto } from '@cirrus/omnichannel_api'
constructor(private readonly messageApi: MessageApi) {}
/**
* @param {string} sessionId - Identificador da sessão.
* @param {string} agentName - Nome do agente que está enviando a mensagem.
* @param {object} interactive - Objeto da mensagem interativa.
* @param {string} interactive.type - Tipo da mensagem interativa (list).
* @param {object} interactive.body - Corpo da mensagem.
* @param {string} interactive.body.text - Texto principal da mensagem.
* @param {object} interactive.action - Ações disponíveis.
* @param {string} interactive.action.button - Texto do botão principal.
* @param {array} interactive.action.sections - Seções com opções.
*/
const payload: SendMessageDto = {
sessionId: '651f0e422ed69abd580b3761',
agentName: 'Atendente Maria',
interactive: {
type: 'list',
body: {
text: 'Escolha uma das opções abaixo:'
},
action: {
button: 'Ver Opções',
sections: [
{
rows: [
{
id: 'opcao_1',
title: 'Suporte Técnico',
description: 'Problemas com produtos ou serviços'
},
{
id: 'opcao_2',
title: 'Vendas',
description: 'Informações sobre produtos'
},
{
id: 'opcao_3',
title: 'Financeiro',
description: 'Dúvidas sobre pagamentos'
}
]
}
]
}
}
}
const response = await this.messageApi.sendMessage(payload)
Exemplo - Botões Interativos:
import { MessageApi, SendMessageDto } from '@cirrus/omnichannel_api'
constructor(private readonly messageApi: MessageApi) {}
/**
* @param {string} sessionId - Identificador da sessão.
* @param {string} agentName - Nome do agente que está enviando a mensagem.
* @param {object} interactive - Objeto da mensagem interativa.
* @param {string} interactive.type - Tipo da mensagem interativa (button).
* @param {object} interactive.body - Corpo da mensagem.
* @param {string} interactive.body.text - Texto principal da mensagem.
* @param {object} interactive.action - Ações disponíveis.
* @param {array} interactive.action.buttons - Array de botões.
*/
const payload: SendMessageDto = {
sessionId: '651f0e422ed69abd580b3761',
agentName: 'Atendente Maria',
interactive: {
type: 'button',
body: {
text: 'Deseja continuar com o atendimento?'
},
action: {
buttons: [
{
type: 'reply',
reply: {
id: 'sim',
title: 'Sim'
}
},
{
type: 'reply',
reply: {
id: 'nao',
title: 'Não'
}
}
]
}
}
}
const response = await this.messageApi.sendMessage(payload)
6.8 Enviar Localização em Grupos
- Não implementado.
6.9 Enviar Endereço
- Não implementado.
6.10 Solicitação de Localização
- Não implementado.
6.11 Encaminhar Mensagem
- Não implementado.
6.12 Deletar Mensagem de Grupo
- Método não suportado pela plataforma.
7. Templates
7.1 Criar Template
- Cria um novo template de mensagem para o canal D360.
Exemplo:
import { SetupApi, CreateTemplateDto, TemplateCategoriesEnum } from '@cirrus/omnichannel_api'
constructor(private readonly setupApi: SetupApi) {}
/**
* @param {string} name - Nome do template.
* @param {TemplateCategoriesEnum} category - Categoria do template (UTILITY ou MARKETING).
* @param {string} language - Código do idioma (ex: 'pt_BR').
* @param {array} components - Componentes do template.
*/
const templateDto: CreateTemplateDto = {
name: 'welcome_message',
category: TemplateCategoriesEnum.UTILITY,
language: 'pt_BR',
components: [
{
type: 'BODY',
text: 'Olá {{1}}, bem-vindo à nossa empresa! Seu código de verificação é {{2}}.',
example: {
body_text: [['João', '123456']]
}
}
]
}
const template = await this.setupApi.createTemplate('64ef5c84f9deb1326965919e', templateDto)
7.2 Listar Templates
- Obtém a lista de templates disponíveis para um canal D360. Esta funcionalidade é específica do D360.
Exemplo:
import { SetupApi, TemplatesInterface } from '@cirrus/omnichannel_api'
constructor(private readonly setupApi: SetupApi) {}
/**
* @param {string} channelId - Identificador do canal D360.
*/
const templates: TemplatesInterface[] = await this.setupApi.getTemplates('64ef5c84f9deb1326965919e')
// Resposta:
// [
// {
// "name": "hello_world",
// "category": "UTILITY",
// "status": "APPROVED",
// "full": { /* objeto completo do template */ }
// }
// ]