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...
The popup will be closed in 10 segundos...