Feature - Callback Criptografado do WhatsApp Flow
Introdução ao documento
Este documento descreve a feature responsável por receber, validar e responder requisições criptografadas do WhatsApp Flow no endpoint POST /.
Evidência: src/server.ts:102
Versionamento
- Versão do documento:
2.0.0. - Última atualização:
2026-03-18. Evidência: codex-promts.md:16
Referencial teórico
- Implementação de decrypt/encrypt no módulo
encryption.ts. - Fluxo de roteamento para
personalebusiness. Evidência: src/encryption.ts:3 Evidência: src/server.ts:331
Visão geral
O endpoint recebe encrypted_aes_key, encrypted_flow_data e initial_vector, valida assinatura (quando aplicável), decripta payload, executa a lógica da tela e devolve payload criptografado.
Evidência: src/server.ts:114
Evidência: src/server.ts:128
Evidência: src/server.ts:155
Evidência: src/server.ts:159
Atores
- Cliente WhatsApp Flow (origina payload criptografado).
- Serviço
dhedalos-api-onboarding-express(processa e responde). Evidência: src/server.ts:102
Pré-condições
PRIVATE_KEYePASSPHRASEválidos no ambiente.req.bodycom os três campos criptografados obrigatórios.- Se
APP_SECRETestiver definido, headerx-hub-signature-256válido. Evidência: src/server.ts:100 Evidência: src/server.ts:103 Evidência: src/server.ts:116 Evidência: src/server.ts:341
Fluxo principal
- Receber
POST /. - Validar campos obrigatórios do corpo.
- Validar assinatura HMAC quando configurada.
- Decriptar payload com chave RSA + AES.
- Processar tela no fluxo
personaloubusiness. - Criptografar e retornar resposta. Evidência: src/server.ts:102 Evidência: src/server.ts:116 Evidência: src/server.ts:128 Evidência: src/server.ts:142 Evidência: src/server.ts:333 Evidência: src/server.ts:159
Fluxos alternativos
action === ping: respondestatus: active.data.error: respondeacknowledged: true.flow_tokeninválido: retorna telaERROR.- Assinatura inválida: retorna
432sem corpo. - Erro de decrypt: retorna
421(FlowEndpointException) ou500. Evidência: src/server.ts:292 Evidência: src/server.ts:302 Evidência: src/server.ts:314 Evidência: src/server.ts:131 Evidência: src/encryption.ts:45
Regras de negócio
- Requisição incompleta é rejeitada com
400. - Assinatura só é exigida quando
APP_SECRETexiste; sem segredo, a validação retornatrue. flow_tokenprecisa ter formato<course_slug>_<user_id>.- Contexto de fluxo é derivado de
courseDetail.flow_template_id. Evidência: src/server.ts:116 Evidência: src/server.ts:341 Evidência: src/utils/flowSession.ts:7 Evidência: src/server.ts:327
Estados possíveis (quando houver)
- Ação de protocolo:
ping,INIT,data_exchange. - Resultado de erro:
ERROR. - Resultado final de fluxo:
FINAL(definido nos fluxos internos). Evidência: src/server.ts:292 Evidência: src/flows/personal.ts:61 Evidência: src/flows/business.ts:154 Evidência: src/server.ts:317 Evidência: src/flows/personal.ts:220
Endpoints envolvidos
POST /Evidência: src/server.ts:102
Dados impactados
- Sem escrita direta local neste endpoint; impacto de dados ocorre indiretamente pelos fluxos (
wpPatchProfile,enrollToCourse, fila de link de grupo). - Referência de dados locais:
../data/model.md. Evidência: src/flows/personal.ts:134 Evidência: src/flows/business.ts:342 Evidência: src/flows/personal.ts:207
Pendências
- Confirmar contrato oficial de payload de
decryptedBodypara documentação de schema completo de telas. Evidência: src/server.ts:288 Evidência: src/flows/personal.ts:58 Evidência: src/flows/business.ts:138