Ajuda › Integrar o NexaChat ao seu sistema
Integrar o NexaChat ao seu sistema
Este guia é para quem vai embutir o chat no portal da própria empresa ou de um cliente e usar a API e os webhooks. Nos exemplos, SEU-DOMINIO é o endereço da sua instalação do NexaChat (o mesmo que você usa para entrar no painel).
1. Instalar o widget#
Em Canais › Chat do site copie o código e cole antes do </body> do seu portal:
<script src="https://SEU-DOMINIO/embed/v1.js" data-key="CHAVE_DO_CANAL" async></script>
/embed/v1.jsé a versão estável. O antigo/embed.jsé a mesma v1 e continua funcionando.- A chave do canal é pública (identifica o canal). Segredos nunca vão para o navegador.
- Opções por atributo:
data-position="left"ouright,data-color="#0a7a4a",data-name,data-phoneedata-email(preenchimento sugerido, veja a seção 3).
2. Endereços permitidos#
Em Canais › Chat do site › Domínios autorizados cadastre cada site que vai exibir o chat: produção, homologação, etc.
- Vários endereços valem ao mesmo tempo, por exemplo
https://portal.suaempresa.com.brehttps://homolog.suaempresa.com.br. - Para todos os subdomínios use o curinga explícito:
https://*.suaempresa.com.br(ele não inclui o domínio purosuaempresa.com.br, cadastre-o à parte se precisar). - Esquema e porta contam:
httpehttpssão endereços diferentes.
O servidor confere o endereço em todas as chamadas do widget e a página do chat só aceita ser embutida nesses endereços. Em um site que não está na lista o botão do chat nem aparece (o console do navegador explica o motivo). Se a chave estiver errada, o chat não pode ser embutido em lugar nenhum.
3. Quem é o cliente? Identidade assinada#
Por padrão, quem abre o chat digita nome, e-mail e telefone. Isso é “não verificado”: serve só para a equipe se localizar e nunca dá acesso a dados do ERP nem ao histórico de outra pessoa.
Para dizer ao chat quem é o cliente logado, o servidor do seu sistema assina um token curto e o passa ao widget.
- Em Canais › Chat do site › Identidade do cliente, clique em Gerar segredo. O valor (
nxis_…) aparece uma única vez: guarde só no servidor. - A cada página que mostra o chat para um cliente logado, gere um token JWT HS256 com estes campos:
| Campo | Para quê |
|---|---|
sub | O id do cliente no seu sistema (obrigatório). |
name, phone, email | Dados do cliente, já verificados por você. |
document | CPF/CNPJ (opcional). Se vier, vincula o cliente ao ERP da empresa. |
iat, exp | Emissão e validade em segundos. Máximo de 10 minutos entre os dois. |
jti | Um identificador único por token: cada token vale uma vez. |
- Passe o token ao widget:
<script src="https://SEU-DOMINIO/embed/v1.js" data-key="CHAVE" data-user-token="TOKEN_GERADO_NO_SERVIDOR" async></script>
ou, em páginas dinâmicas, NexaChat.identify(token).
O que acontece: o NexaChat confere a assinatura, o prazo e o reuso, liga a conversa ao contato pelo sub (cria ou atualiza) e marca como “identificado pelo parceiro”. Token inválido, vencido ou reaproveitado: o chat segue anônimo e o motivo aparece em Identidade do cliente › Últimas tentativas.
Exemplos para gerar o token#
Node.js (sem bibliotecas):
const crypto = require('crypto');
function tokenNexaChat(cliente, segredo) {
const b = (o) => Buffer.from(JSON.stringify(o)).toString('base64url');
const agora = Math.floor(Date.now() / 1000);
const head = b({ alg: 'HS256', typ: 'JWT' });
const body = b({ sub: String(cliente.id), name: cliente.nome, email: cliente.email, phone: cliente.telefone,
iat: agora, exp: agora + 300, jti: crypto.randomUUID() });
const sig = crypto.createHmac('sha256', segredo).update(head + '.' + body).digest('base64url');
return head + '.' + body + '.' + sig;
}
PHP:
function tokenNexaChat($cliente, $segredo) {
$b = fn($o) => rtrim(strtr(base64_encode(json_encode($o)), '+/', '-_'), '=');
$agora = time();
$head = $b(['alg' => 'HS256', 'typ' => 'JWT']);
$body = $b(['sub' => (string)$cliente['id'], 'name' => $cliente['nome'], 'email' => $cliente['email'],
'phone' => $cliente['telefone'], 'iat' => $agora, 'exp' => $agora + 300, 'jti' => bin2hex(random_bytes(16))]);
$sig = rtrim(strtr(base64_encode(hash_hmac('sha256', "$head.$body", $segredo, true)), '+/', '-_'), '=');
return "$head.$body.$sig";
}
Python:
import base64, hashlib, hmac, json, time, uuid
def token_nexachat(cliente, segredo):
b = lambda o: base64.urlsafe_b64encode(json.dumps(o, separators=(',', ':')).encode()).rstrip(b'=').decode()
agora = int(time.time())
head = b({'alg': 'HS256', 'typ': 'JWT'})
body = b({'sub': str(cliente['id']), 'name': cliente['nome'], 'email': cliente['email'],
'phone': cliente['telefone'], 'iat': agora, 'exp': agora + 300, 'jti': str(uuid.uuid4())})
sig = base64.urlsafe_b64encode(hmac.new(segredo.encode(), f'{head}.{body}'.encode(), hashlib.sha256).digest()).rstrip(b'=').decode()
return f'{head}.{body}.{sig}'
Trocar ou revogar o segredo#
- Trocar o segredo: o novo aparece uma vez e o antigo continua valendo pelo tempo que você escolher (até 72 h), para atualizar o seu sistema sem derrubar a identificação.
- Revogar: nenhum token passa a valer e todos entram como anônimos.
4. A API do widget em JavaScript#
NexaChat.open(); NexaChat.close(); NexaChat.toggle();
NexaChat.identify(token); // identifica (ou troca) o cliente
NexaChat.logout(); // limpa a sessão do chat
NexaChat.on('ready' | 'open' | 'close' | 'message' | 'unread', function (dados) { ... });
messageavisa que a equipe respondeu eunreadtraz a quantidade de mensagens não lidas (o botão mostra a bolinha).- Ao trocar de usuário no portal, chame
NexaChat.logout(): o chat limpa a sessão e o próximo cliente não vê a conversa do anterior.identify()com umsubdiferente também troca a sessão. - A comunicação com o chat usa
postMessagee valida a origem dos dois lados: o site só aceita mensagens do nosso iframe e o chat só aceita mensagens do site que o embute (um dos endereços permitidos).
5. API REST, tokens e escopos#
- Em Integrações › Entrada (API) crie um token por sistema, com o escopo read (consultar), write (criar/alterar) ou telephony (identificação da URA).
- Envie
Authorization: Bearer nxk_…parahttps://SEU-DOMINIO/api/v1. Documentação interativa: /docs/api/. - Limite de 300 requisições por minuto por token (cabeçalhos
X-RateLimit-*). UseIdempotency-Keynos POST para repetir sem duplicar. - Histórico de um cliente: use o
contact_iddo atendimento (ou do webhook) emGET /api/v1/conversations?contact_id=…eGET /api/v1/conversations/{id}/messages.
6. Webhooks e a validação da assinatura#
Cadastre em Integrações › Enviar avisos (Webhooks). Cada aviso é um POST com o cabeçalho X-NexaChat-Event e X-NexaChat-Signature (sha256= + HMAC-SHA256 do corpo bruto com o segredo do webhook). Valide antes de interpretar o JSON:
// Node.js
const esperado = 'sha256=' + crypto.createHmac('sha256', segredo).update(corpoBruto).digest('hex');
const ok = crypto.timingSafeEqual(Buffer.from(esperado), Buffer.from(req.headers['x-nexachat-signature']));
- Reenvio automático com espera crescente (1 min, 5 min, 30 min, 2 h) e histórico de entregas com resposta e tempo. Responda 2xx rápido e processe depois.
- Enviar teste: escolha qualquer evento e o NexaChat manda um exemplo real dele (marcado com
"test": truee o cabeçalhoX-NexaChat-Test). - Trocar o segredo sem parar: durante o período de convivência cada aviso leva também
X-NexaChat-Signature-Previous(assinatura com o segredo antigo): aceite qualquer um dos dois. - O evento
platform.noticetraz as mudanças programadas e manutenções (veja a seção 8).
7. Ambiente de teste (sandbox)#
Em Integrações › Entrada (API) o dono da empresa cria a empresa de teste: a mesma API e o mesmo widget, mas ERP de demonstração, nada enviado a clientes reais, dados que você apaga com um clique e que não entram em relatórios nem em cobrança. As chaves de API de lá começam com nxk_test_ e o login é o seu e-mail com +teste (ex.: voce+teste@empresa.com). Trocar entre teste e produção é só trocar a chave e o endereço permitido.
8. Versões, avisos e disponibilidade#
- Dentro da v1 só há acréscimos (campos, rotas e eventos novos). Seu código deve ignorar o que não conhece. Qualquer quebra vai para a v2, com aviso de no mínimo 90 dias e as duas versões no ar juntas por pelo menos 90 dias. O mesmo vale para
/embed/v1.jse/embed/v2.js. - Toda resposta da API traz
X-NexaChat-API-Version. O histórico fica em /docs/api/changelog. - Avisos: cadastre e-mails técnicos em Integrações › Enviar avisos (Webhooks) › Contatos técnicos e assine o evento
platform.notice. - Status: a página /status mostra a situação do painel, da API, do widget, do WhatsApp e dos webhooks, a disponibilidade dos últimos 90 dias e os incidentes.
9. Privacidade#
Se o chat fica no portal da sua empresa, o aviso de privacidade do seu site precisa citá-lo. Há um texto pronto em Aviso de privacidade para o chat do seu site.