A PSD2 prometia uma API para todos os bancos da Europa. O que obtivemos foi uma família de especificações e umas quantas centenas de interpretações dela. Após cinco anos a construir e operar conectores de informação de contas e de iniciação de pagamentos para clientes em todo o Báltico, o padrão é claro: o primeiro banco demora uma semana, o quinto demora um dia, e depois o seguinte, inesperadamente, demora um mês.
É no fluxo de consentimento que os projetos encalham
As chamadas à API são a parte fácil. A parte difícil é o ciclo de vida do consentimento - como é que um cliente autoriza o seu acesso, quanto tempo essa autorização dura, e o que acontece quando expira às 03:00 de um domingo.
- Alguns bancos emitem consentimentos de 90 dias e renovam-nos silenciosamente; outros forçam uma reautenticação completa.
- Os fluxos de consentimento em sandbox diferem rotineiramente dos de produção. Reserve tempo para uma segunda passagem de integração após o arranque em produção.
- As taxonomias de erro são inconsistentes: o mesmo consentimento expirado pode manifestar-se como
401,403, ou - num caso memorável - um200com uma lista de transações vazia.
Este último merece destaque: uma resposta vazia não é o mesmo que uma resposta bem-sucedida. Se a sua reconciliação depende de um feed de transações, trate «nenhuma transação» como uma condição a verificar, não como um facto a registar.
Aquilo em que padronizamos
Cada conector que entregamos funciona agora atrás da mesma interface interna, com adaptadores por banco mantidos deliberadamente finos. A mesma disciplina aplica-se do lado da iniciação de pagamentos - um objeto de pagamento canónico, mapeado explicitamente para o dialeto de cada banco:
O adaptador trata das particularidades de autenticação e das diferentes formas de obter os dados página a página; tudo o resto - novas tentativas, idempotência, alertas, avisos de expiração de consentimento - vive na camada partilhada, escrita uma vez e testada uma vez.
Se uma integração bancária precisar de lógica de nova tentativa personalizada, essa lógica pertence à camada partilhada, protegida por uma feature flag - nunca ao adaptador. Um adaptador deixado ao abandono degrada-se e fica desatualizado; a camada partilhada continua a ser mantida.
O resultado torna-se rotineiro - e é exatamente esse o objetivo. Um novo banco é um novo adaptador, um ficheiro de exemplo gravado a partir da sua sandbox para os testes, e uma checklist - não um novo projeto.