Um teto, vários armários, várias gavetas
Pense no deploy como um escritório de retaguarda com uma parede de armários de arquivo. Cada armário pertence a uma instituição regulada: os arquivos dela nunca se misturam com os de outra instituição, porque um regulador audita cada instituição por conta própria. Dentro de um armário, gavetas separam linhas de negócio — uma para o produto de carteira, uma para o produto de crédito. Na parede fica pendurada uma ficha dizendo quais armários e gavetas existem. Um funcionário arquiva movimentações de dinheiro apenas em uma gaveta que a ficha nomeia; uma movimentação endereçada a uma gaveta que não está na ficha é devolvida, nunca arquivada em algum lugar “perto o bastante”. O vocabulário do trilho mapeia um a um:
Duas consequências caem direto do modelo:
- Todo lançamento carrega o seu escopo. Cada transação é escrita na organização e no ledger em que ela resolveu, então os registros de cada instituição são completos por conta própria — relatórios regulatórios e contábeis saem por instituição sem desembaraçar um livro compartilhado.
- O trilho nunca adivinha um escopo. Uma movimentação cuja organização e ledger não podem ser provados contra o catálogo é recusada antes de qualquer lançamento. Lançar dinheiro no ledger da instituição errada é o único erro que este desenho existe para tornar impossível.
O toggle: uma chave vazia significa desligado
A chave do catálogo começa vazia, e vazia é o valor sentinela de não provisionado: o tenant lança apenas na organização e no ledger que o vínculo dele nomeia, exatamente como antes de a chave existir. Escrever um catálogo liga a funcionalidade; o par que o vínculo nomeia continua sendo o padrão — o escopo em que todo fluxo lança, a menos que resolva outro.
A organização e o ledger padrão nunca ficam no catálogo. As rotas contábeis deles ficam nas chaves
routing.* e o ativo e a conta de compensação deles ficam na própria configuração, exatamente como Configurar o trilho os provisiona. O catálogo declara apenas o que o vínculo não declara: repetir o ledger padrão lá daria a um livro duas fontes da verdade, então o trilho recusa um catálogo que o redeclara.Ative, passo a passo
1
Complete a configuração comum primeiro
O catálogo estende um deploy que funciona; ele não substitui a configuração. Rode Configurar o trilho de ponta a ponta: o vínculo que você escreve lá torna a sua instituição o participante padrão e o ledger dela o livro padrão. Se o seu deploy é uma instituição com um livro, pare lá — com a chave do catálogo vazia, nada nesta página muda coisa alguma.
2
Provisione o livro adicional no Midaz e no CRM
Cada ledger adicional é provisionado com a mesma receita que a página de configuração percorre, apontada para o livro novo em vez do padrão:
- A organização e o ledger. Um ledger adicional da sua própria instituição vai sob a sua organização existente. Um participante adicional (multi-tenant) ganha uma organização própria, porque uma organização do Midaz é exatamente uma instituição regulada.
- O ativo e as contas no ledger novo, incluindo a própria conta externa de compensação — um alias como
@external/BRLé único dentro de um ledger, então cada livro precisa da sua. - As rotas de operação no ledger novo, um par de crédito e débito por perfil de dinheiro que o livro serve. Diferente do ledger padrão, esses UUIDs não vão nas chaves
routing.*— eles vão dentro do documento do catálogo no próximo passo. - Os registros de titular e os vínculos no CRM, endereçados com o
X-Organization-Idda organização dona do livro. OledgerIddo vínculo é o que diz ao trilho em qual livro uma conta é mantida, então em uma organização com mais de um ledger todo vínculo deve nomear o seu ledger.
3
Escreva o catálogo
O catálogo é escrito uma vez, em Em um deploy single-tenant a entrada carrega o seu próprio ISPB e o seu próprio id de organização, e os ledgers são os livros adicionais; os identificadores diferem por participante apenas no multi-tenant.Uma escrita bem-sucedida responde A chave tem hot reload: escreva-a com a aplicação de pé e ela passa a valer no deployment em execução, sem reinício e sem redeploy.
PUT /system/tenant_policy/organizations, com o mesmo embrulho que o vínculo usa: o corpo é {"value": ...} e value é uma string cujo conteúdo é um documento JSON — uma lista com uma entrada por organização catalogada, cada uma nomeando o ISPB do seu participante, a sua organização do Midaz e os ledgers dessa organização com as suas rotas. A sua própria organização aparece aqui quando carrega ledgers adicionais — nunca redeclarando o ledger padrão — e a organização de um participante adicional sempre aparece.Este é o documento, desembrulhado, com identificadores de exemplo:routes aceita até dez perfis — in, inQrCode, out, outReversal, intraPsp, intraPspReversal, medDebit, medCredit, pixautomaticoDebit, pixautomaticoReversal — cada um um par de UUIDs de rota de operação do Midaz. Apenas in e inQrCode são obrigatórios: todo ledger do catálogo existe para receber, então um livro que não pode servir nenhuma das duas pernas de entrada é um erro de provisionamento, não um livro mais estreito. Os outros oito são opcionais; um fluxo que precisa de um ausente recusa com 409 PIX-0105, nomeando o perfil, a organização e o ledger — o mesmo comportamento que uma chave routing.* não definida produz no livro padrão.Deixe o jq fazer o escape da string, como com o vínculo:204. Leia a chave de volta do jeito que você lê o vínculo de volta — o valor retorna como uma string entre aspas carregando o seu documento:4
Saiba o que os validadores recusam, e quando
O catálogo é validado duas vezes, e a divisão importa: o validador de escrita pega tudo o que pode ser julgado só pelo documento, então um catálogo malformado é recusado na superfície de administração em vez de descoberto em um pagamento.Recusado na escrita, com
400 validation_error:- um
valueque não é uma string, ou qualquer coisa depois do primeiro documento JSON; - um campo desconhecido em qualquer profundidade — um nome de perfil de rota digitado errado incluído, então um erro de digitação não pode passar como um perfil silenciosamente ausente;
- um
ispbque não tem exatamente 8 dígitos; umorganizationId,ledgerIdou perna de rota que não é um UUID diferente de zero; - um
externalAliasouassetvazio; um par de rotas sem uma das pernas; uma organização que não declara nenhum ledger; - um perfil
inouinQrCodeausente em qualquer ledger; - um
ispb,organizationIdouledgerIdduplicado em qualquer lugar do documento. Um403é uma permissão ausente, nunca um valor rejeitado.
5
Entenda como o dinheiro roteia depois que está ligado
- Toda transação é registrada no seu escopo. O lançamento carrega a organização e o ledger em que ele resolveu, então o livro de cada instituição fica completo e auditável por conta própria.
- Um crédito de entrada encontra o próprio livro. O ISPB do recebedor escolhe a organização; o registro da conta no CRM escolhe o ledger. Uma organização com um único ledger tolera um registro que não nomeia nenhum — não há entre o que escolher; uma com vários não tolera, e recusa com
500 PIX-0120em vez de adivinhar. - Uma ordem de saída nomeia o participante pagador quando o tenant é vários.
POST /v1/transactionsaceita umpayerIspbopcional. Um tenant que atua como um participante o omite e se comporta exatamente como antes; um tenant que atua como vários deve enviá-lo — omitido é422 PIX-0127, e um ISPB como o qual o tenant não atua é422 PIX-0128— porque escolher um pagador arbitrariamente debitaria o cliente de outra instituição. - Entre dois ledgers da mesma organização, a transferência é interna. Um alias é único dentro de um ledger, então ela não pode ser um lançamento só: o trilho reserva o valor no ledger do pagador contra a conta de compensação dele, lança o crédito final no ledger do recebedor contra a conta de compensação dele, e então confirma a reserva. As duas pernas são lançadas no par de rotas
intraPspde cada ledger, e cada livro fica internamente em partidas dobradas. - Entre duas organizações do mesmo tenant, o pagamento é Pix comum. Duas organizações são dois participantes regulados, então o dinheiro viaja o trilho de liquidação (SPI) exatamente como um pagamento para qualquer outra instituição viajaria — mesmo tenant nunca é “mesmo livro”.
- Cada participante adicional se autentica como ele mesmo. Ordens que saem de uma organização adicional são enviadas à JD sob a credencial própria daquele participante, provisionada por ISPB. Um participante cuja credencial não está provisionada recusa a primeira ordem dele com
409 PIX-0092e libera a reserva, e a probe de readiness o reporta fora do ar nomeando aquele ISPB antes de o tráfego alcançá-lo.
Desligando
Escrever uma string vazia de volta em
tenant_policy/organizations é aceito e retorna o tenant ao comportamento só-padrão — o mesmo estado de antes da ativação. Isso não desfaz nada já lançado: dinheiro lançado em um escopo adicional fica naquele ledger, e ele deixa de ser alcançável por este trilho — qualquer fluxo que resolve para um escopo que o catálogo não declara mais recusa com 500 PIX-0120 antes de tocar o ledger. Então esvazie a chave apenas quando nada mais roteia para os livros adicionais: nenhuma conta cujos registros apontam para eles, nenhum pagamento em andamento e nenhum participante hospedado montado em uma organização adicional. Para aposentar um livro mantendo a funcionalidade, remova a entrada daquele ledger e deixe o resto do catálogo no lugar — a mesma prova de leitura se aplica, escopo por escopo.
Para onde ir agora
Configurar o trilho
A cadeia de provisionamento que esta página estende: os objetos do ledger, os registros do CRM, as chaves de roteamento e o vínculo que nomeia o par padrão.
O modelo direto e indireto
Como este eixo difere de hospedar participantes indiretos: um indireto é uma posição dentro do seu livro; uma organização adicional é um participante direto com livros próprios.
Variáveis de ambiente
A configuração no momento do deploy, e quais valores vivem em chaves do systemplane em vez disso.
Lista de erros do Pix JD
Todo código
PIX-NNNN que esta página nomeia, com o status dele e o texto detail que a resposta carrega.
