Aparência
PayFlow — cobrança e conciliação
O PayFlow (painel/payflow, porta local 3007) cobra propinas e serviços. O SIGA continua a ser a fonte de verdade académica e da obrigação financeira. O ADMIN/WEB trata do billing SaaS (assinatura da escola) — não confundir com propina.
Referência técnica no repositório: docs/agents/PAYFLOW_INTEGRATION.md.
O que fazer na escola
- IBAN — Definições → Financeiro → preencher titular, banco e IBAN AO.
- Sync IBAN → PayFlow — no mesmo painel (também corre após «Guardar banco»).
- Aluno — na ficha ou no modal extensivo → Sync PayFlow (matrícula activa + faturas).
- Conciliação — em
/financeiroou/faturas→ Conciliação PayFlow (SSO assinado). - Extrato CSV — no
/admindo PayFlow (aba Transferências): modelo CSV → importar → pré-visualizar → «Conciliar correspondências». - API bancária — ingest, Puxar movimentos no admin, ou
npm run siga:payflow-bank-pull -- --school-id=…. Em sandbox:PAYFLOW_BANK_CONNECTOR_URL=http://localhost:3007/api/v1/bank-movements/sandbox-feed?transfer_reference=…&amount=…. Simulação ingest:npm run siga:payflow-bank-ingest -- --school-id=… --transfer-reference=PF-TF-… --amount-minor=1500000. - Alertas — opcional:
PAYFLOW_ALERT_WEBHOOK_URL(Sentry/pager). Sem URL, só logs JSON. - Acerto SIGA — liquidação/estorno no PayFlow notifica
POST /api/finance/payflow/settlement(mesma chave de integração).
Opcional: PAYFLOW_AUTO_SYNC=1 no .env do SIGA sincroniza o aluno no PayFlow após cada emissão de fatura (background, não bloqueia).
Modelo CSV (; ou ,):
csv
data;referencia;valor;moeda;movimento;descricao
05/09/2026;PF-TF-20260905-ABC123DEAD;15.000,00;AOA;MOV-001;Propinavalor é em AOA (vírgula decimal). Use valor_centimos se o banco exportar cêntimos. Linhas com valor ou referência diferentes não são liquidadas.
Segredos no servidor (nunca no browser)
| Variável | Uso |
|---|---|
VITE_PAYFLOW_URL | URL pública do PayFlow |
PAYFLOW_INTEGRATION_API_KEY | Sync servidor→servidor (≥24 chars) |
PAYFLOW_SSO_SECRET | JWT SSO admin (≥32 chars), igual no SIGA e no PayFlow |
PAYFLOW_SIGA_URL | Origem do SIGA para acerto de caixa |
PAYFLOW_RUNTIME_MODE | production por omissão; sandbox só em local |
PAYFLOW_AUTO_SYNC | 1 = após emitir fatura, sync aluno no PayFlow em background (opt-in) |
PAYFLOW_ALERT_WEBHOOK_URL | Webhook HTTPS para rejeições/estornos/falhas de acerto SIGA |
PAYFLOW_BANK_CONNECTOR_URL | Endpoint do banco para o pull (HTTPS; nunca no pedido) |
PAYFLOW_BANK_CONNECTOR_KEY | Bearer do conector (≥16 chars) |
PAYFLOW_EMIS_HOMOLOGATED | 1 só após contrato EMIS — não activa o adaptador de produção sozinho |
Propagação: npm run siga:sync-env.
Segurança operacional
- Confirmação de pagamento nunca por redirect do browser.
- Comprovativo do pagador não liquida a fatura sozinho.
- Revisão manual no painel exige papel
finance_admin(Administrador SIGA via SSO) + comprovativo já submetido. - Login por chave no
/admindo PayFlow fica reservado a sandbox (UI esconde o formulário em produção; API também fail-closed). - Isolamento: a conciliação e o extrato só vêem a escola da sessão; o sync recusa IDs que já pertençam a outra escola.
- Estorno: no painel admin, Estornar (só Administrador via SSO). O recibo PayFlow original fica; o SIGA anula o recibo de caixa via webhook de acerto.
- Logs JSON
app=payflow(sem IBAN nem nomes). Falha de acerto SIGA dispara alerta se o webhook estiver configurado. - Estado operacional: aba Canais & Infraestrutura ou
GET /api/v1/health.
Checklist EMIS (antes de Multicaixa real)
- Contrato + credenciais (
EMIS_BASE_URL,EMIS_API_KEY,EMIS_WEBHOOK_SECRET, merchant/terminal). - Homologação no portal EMIS com referências de teste.
- Só então
PAYFLOW_EMIS_HOMOLOGATED=1— o adaptador de produção continua fechado até existir implementação dedicada; o flag só marca prontidão no health. - Ingress
POST /api/v1/webhooks/emisvalida HMAC (X-Emis-Signature: sha256=<hex>) e responde501 emis_adapter_not_ready— não liquida. - Manter transferências IBAN como canal principal até o adaptador EMIS estar ligado.
Checklist antes de produção
- [ ] IBAN real sincronizado por escola
- [ ]
PAYFLOW_SSO_SECRET,PAYFLOW_INTEGRATION_API_KEYePAYFLOW_SIGA_URLconfigurados - [x] Fonte de movimentos (CSV, ingest e pull fail-closed; falta o URL real do banco)
- [x] Acerto caixa SIGA (
/api/finance/payflow/settlement) - [ ] Homologação EMIS/Unitel no portal externo (se aplicável)
- [x] Teste de isolamento entre duas escolas (unitário no PayFlow; validar com dois tenants reais antes de tráfego)
- [ ]
PAYFLOW_ALERT_WEBHOOK_URLem staging/produção