Ir para conteúdo
  • Cadastre-se

[ACBR-9649] [Pix Automático] Campo loc da recorrência trunca id de location grande (Integer → deveria ser Int64)


Ver Solução Respondido por Daniel Simoes,

Recommended Posts

Postado

Resumo

Na criação de recorrência do Pix Automático (POST /rec), o campo loc é serializado a partir de TACBrPIXRecSolicitadaBase.loc, que está declarado como Integer.

Quando o PSP retorna um id de location maior que 2.147.483.647 (Int32), o valor é truncado para 32 bits e enviado negativo, fazendo o PSP recusar a requisição.

O id de location do Itaú tem 19 dígitos (ex.: 7587166705779689739), então o problema é 100% reproduzível nesse PSP.

Evidência

Resposta do POST /locrec (id da location gerada pelo PSP):

{"id":7587166705779689739,"location":"api.itau/rec/694b07eb-...","criacao":"2026-07-15T19:09:32.992Z","idRec":null}

Corpo do POST /rec montado pelo ACBr logo em seguida:

{"politicaRetentativa":"PERMITE_3R_7D","vinculo":{...},"calendario":{...},"loc":-1649719029}

O loc foi de 7587166705779689739 para -1649719029, que é exatamente o truncamento para inteiro de 32 bits com sinal (os 32 bits baixos de 7587166705779689739 = -1649719029).

O PSP então responde:

HTTP/1.1 401 Unauthorized
{"title":"Acesso Negado","status":401,"detail":"Não autorizado. Verifique se os parâmetros de acesso estão válidos..."}

Como replicar

  1. Usar um PSP cujo /locrec retorne um id de location maior que Int32 (o Itaú sempre retorna, 19 dígitos).
  2. Chamar CriarLocation (epLocRec) e em seguida CriarRecorrencia (epRec) com RecorrenciaSolicitada.loc := LocationGerada.id.
  3. Observar no log (NivelLog alto) o Req.Body do /rec: o loc sai negativo.

Causa

Em ACBrPIXSchemasRec.pas, classe TACBrPIXRecSolicitadaBase:

private
    fLoc: Integer;                                   // <-- trunca
...
    property loc: Integer read fLoc write fLoc;      // <-- trunca

Há uma inconsistência interna:

no ACBrPIXSchemasLocation.pas o campo id da location já é Int64 (leitura correta), mas o loc da recorrência (escrita) é Integer.

Ou seja, o valor chega inteiro na leitura e é cortado ao ser atribuído/serializado na escrita.

Correção sugerida

Em ACBrPIXSchemasRec.pas, TACBrPIXRecSolicitadaBase:

private
    fLoc: Int64;                                     // era Integer
...
    property loc: Int64 read fLoc write fLoc;        // era Integer

 

Resultado após a correção

Mesmo cenário, com o campo já como Int64loc vai íntegro (batendo com o id retornado no /locrec😞

{"id":1570237648687511524,"location":"api.itau/rec/ea35652d-...","idRec":null}
...
Req.Body: {"politicaRetentativa":"PERMITE_3R_7D","valor":{...},"vinculo":{...},"calendario":{...},"loc":1570237648687511524}

A mudança é retrocompatível (Int64 comporta todo Integer) e alinha o tipo da escrita com o da leitura (TACBrPIXLocation.id).

  • Consultores
Postado

Movido o tópico para uma seção mais adequada ao assunto.

Foi criada a tarefa ACBR-9649 para análise do caso e parecer por parte da equipe de consultores.

Qualquer novidade será divulgada aqui no tópico.

Valter Patrick
Gerente de Projetos e Consultor ACBr
(33)98400-0936
GitHub: https://github.com/valterpatrick

Ajude o Projeto ACBr crescer - Assine o Clube PRO                    

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  ícone Discórdia Discord   

  • valter.patrick changed the title to [ACBR-9649] [Pix Automático] Campo loc da recorrência trunca id de location grande (Integer → deveria ser Int64)
  • Fundadores
Postado

Realmente a documentação do BACEN, recomenda uso de Int64

https://app.swaggerhub.com/apis/Projeto-ACBr/api-pix/2.6.0#/schemas/CobSolicitada

image.png

 

Vou aplicar a correção... Muito obrigado pela analise e sugestão...

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.

The popup will be closed in 10 segundos...