Cinco anos de conectores PSD2: o que a especificação não lhe diz

Um bloco de banco ligado ao símbolo da Trex Pi por linhas de dados tracejadas

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 - um 200 com 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:

Mapeamento dos campos de pagamento do ERP para os elementos XML SEPA pain.001

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.