Rejeição 659 estranha

106 views
Skip to first unread message

Daniel alves

unread,
Jul 25, 2025, 2:27:58 PM7/25/25
to NFePHP

Estou tendo muitos problemas de rejeição quando uso o webservice de distribuição de nota fiscal da Sefaz. Vou anexar abaixo as informações do meu ambiente, e queria saber se alguém que tem mais conhecimento consegue me ajudar a entender os motivos que estão causando as minhas rejeições.

Informações do Ambiente:

  • Laravel 11
  • Docker swarm

Logs:

2025-07-25 01:48:03.000
{"status":false,"mensagem":"Rejeicao: Consumo Indevido (Deve ser utilizado o ultNSU nas solicitacoes subsequentes. Tente apos 1 hora)","nsu_atual":"000000000505344","ultNSU":"000000000505511","maxNSU":"000000000000000"}
2025-07-25 00:28:03.000
{"status":false,"mensagem":"Rejeicao: Consumo Indevido (Deve ser utilizado o ultNSU nas solicitacoes subsequentes. Tente apos 1 hora)","nsu_atual":"000000000505344","ultNSU":"000000000505344","maxNSU":"000000000000000"}
2025-07-24 23:08:38.000
{"status":true,"mensagem":"Nenhum documento localizado.","nsu_atual":"000000000505344","ultNSU":"000000000505344","maxNSU":"000000000505344","processar":true,"processamentoLotes":{"nfe:lote:000000000505206:clonarSefazAsa2":{"cache_key":"nfe:lote:000000000505206:clonarSefazAsa2","status":true,"mensagem":""},"nfe:lote:000000000505256:clonarSefazAsa2":{"cache_key":"nfe:lote:000000000505256:clonarSefazAsa2","status":true,"mensagem":""},"nfe:lote:000000000505306:clonarSefazAsa2":{"cache_key":"nfe:lote:000000000505306:clonarSefazAsa2","status":true,"mensagem":""},"nfe:lote:000000000505344:clonarSefazAsa2":{"cache_key":"nfe:lote:000000000505344:clonarSefazAsa2","status":true,"mensagem":""}}}

Observe que eu tenho executado de 1h 20m em 1h 20m, para evitar possíveis rejeições. O campo "NSUatual" seria o NSU enviado para consulta, e o campo "ultNSU" e o valor retornado pela Sefaz, observe que na consulta feita as 2025-07-25 00:28:03.000 tive um retorno de rejeição, sendo que o NSU que eu havia consultado e justamente o retornado como ultNsu, eu mantive o NSU 44 na próxima consulta para tentar não perder os lotes e restaurar uma sequencia. Esse problema tem acontecido com frequência comigo, e queria tentar entender, por que estou tendo ele.

Fiz varias mudanças para tentar resolver o problema mas todas sem sucesso, gostaria de saber se alguém tem alguma ideia do que pode estar gerando esse problema. Ou se já viveu algo parecido

Roberto Machado

unread,
Jul 25, 2025, 2:55:57 PM7/25/25
to nfe...@googlegroups.com
Daniel:

Estude a documentação com atenção antes de sair codando, desliga co CTRL-C e CTRL-V
Planeje com base no funcionamento das coisas, entenda primeiro as regras e depois codifique.

Quando ocorre o erro 656 ??

1 - caso você faça buscas com intervalo menor que 1 hora
2 - caso você faça mais de 20 consultas (loop) em uma busca
3 - caso hajam buscas feitas por terceiros fora do seu controle

Que fazer quando ocorre o erro 656 ??

1 - registrar o ultNSU para ser usado na próxima busca 
2 - interromper imediatamente qualquer consulta por no mínimo 1 hora

Como recuperar os NSU faltantes ??

Você deve manter o controle de todos os NSU recebidos, digamos que você tem o número 500 e o ultNSU que a SEFAZ mandou nessa última chamada que digamos é 560.
Então nesse caso estão faltando os NSU 501 até 560, com essa lista você vai buscar esses NSU individualmente, mas cada consulta conta com o 1/20 possíveis no intervalo, então o seu código deverá controlar as buscas de NSU e as buscas por ultNSU.

Divirta-se
Roberto

Daniel alves

unread,
Jul 25, 2025, 3:30:29 PM7/25/25
to NFePHP

Boa tarde, Rodrigo!

Eu já li praticamente toda a documentação da Sefaz e implementei todas as recomendações. A única que, nos meus testes, não fez tanta diferença foi trocar o NSU após uma rejeição; as demais já estão em produção. Para deixar mais claro, seguem as tratativas que adoto hoje:

  1. Limito a 20 consultas por hora.

  2. Quando ocorre rejeição, aplico uma trava: a função só pode ser executada novamente 75 minutos após a última execução.

  3. Mantenho sempre o histórico do NSU. Quando o retorno é 138, faço até 19 consultas ou até receber o código 137. Independentemente de o loop encerrar pelo limite (19) ou pelo código 137, só volto a consultar 75 minutos depois.

  4. Em caso de sucesso, na próxima consulta uso o valor de ultNSU retornado pela própria Sefaz.

Sobre a estratégia de “trocar o NSU quando ocorre rejeição”, testei pegar o ultNSU e usá‑lo na consulta seguinte, mas obtive o mesmo resultado que tenho hoje mantendo o NSU atual — com a vantagem de não perder as NF‑e. Já li todos os tópicos que você menciona sobre rejeição, inclusive as notas técnicas citadas.

Também conversei com o cliente sobre a possibilidade de o certificado estar sendo usado em outro sistema; eles garantem que isso não acontece, e a contabilidade confirmou a informação. Hoje, minha taxa de sucesso está em torno de 50 % e quero entender o motivo.

Posso refazer os testes em relação ao NSU, se você achar pertinente.

Segue um trecho do meu código:

Esse código serve para processar a resposta da Sefaz, e a partir da resposta eu realizo a decisão de continuar o loop ou não.

public function processarResposta(string $xml, string $nsuAtual): array
    {
        // 1) Carrega e valida o XML
        $sxml = simplexml_load_string($xml);
        if ($sxml === false) {
            $this->finalizarFluxo(
                $nsuAtual,
                "000000000000000", // NSU atual
                "000000000000000", // NSU máximo
                false,   // status
                false,  // continuar_loop
                "Erro ao carregar XML da SEFAZ.",
                "Resposta da SEFAZ malformada.",
            );
            throw new Exception('Resposta da SEFAZ malformada.');
        }

        // 2) Navega até <retDistDFeInt>
        $ret = $sxml
            ->children('soap', true)
            ->Body
            ->nfeDistDFeInteresseResponse
            ->nfeDistDFeInteresseResult
            ->children('http://www.portalfiscal.inf.br/nfe')
            ->retDistDFeInt;

        $cStat = (string) ($ret->cStat ?? '');
        $motivo = (string) ($ret->xMotivo ?? '');
        $ultNSU = (string) ($ret->ultNSU ?? '');
        $maxNSU = (string) ($ret->maxNSU ?? '');

        // --- Sucesso “nenhum documento localizado” → para o fluxo ---
        if ($cStat === '137') {
            return $this->finalizarFluxo(
                $nsuAtual,
                $ultNSU,
                $maxNSU,
                true,   // status
                false,  // continuar_loop
                "Nenhum documento localizado.",
                $cStat
            );
        }

        // --- Sucesso “documentos localizados” → continua o fluxo ---
        if ($cStat === '138') {
            // se não veio <loteDistDFeInt>, paramos o loop
            if (!isset($ret->loteDistDFeInt)) {
                return $this->finalizarFluxo(
                    $nsuAtual,
                    $ultNSU,
                    $maxNSU,
                    true,
                    false,
                    'Lote vazio (sem <loteDistDFeInt>).',
                    $cStat
                );
            }

            // serializa o nó de lote inteiro (compactado) e grava no Redis
            $xmlLote = $ret->loteDistDFeInt->asXML();
            if ($xmlLote === false) {
                $this->finalizarFluxo(
                    $nsuAtual,
                    $ultNSU, // NSU atual
                    $maxNSU, // NSU máximo
                    false,   // status
                    false,  // continuar_loop
                    "Falha ao serializar <loteDistDFeInt>.",
                    "Falha ao serializar <loteDistDFeInt>.",
                );
                throw new Exception('Falha ao serializar <loteDistDFeInt>.');
            }

            $redisKey = "nfe:lote:{$ultNSU}:{$this->integracao['nome_integracao']}";
            Cache::store('redis')->put($redisKey, $xmlLote, 3600);
            $this->lotesParaProcessar[] = $redisKey;

            // continua o loop com sucesso
            return $this->finalizarFluxo(
                $nsuAtual,
                $ultNSU,
                $maxNSU,
                true,
                true,
                '',
                $cStat,
                $redisKey
            );
        }

        // --- Rejeição ou qualquer outro cStat → erro definitivo, para o fluxo ---
        return $this->finalizarFluxo(
            $nsuAtual,
            $ultNSU,
            $maxNSU,
            false,  // status
            false,  // continuar_loop
            $motivo,
            $cStat
        );
    }
}

essa função serve para manipular o loop de consultas. A função buscar lote em que chama a LIB.

private function executarLoopNSU($conexao): array
    {
        $ultNsu = $this->integracao['parametros']['ultimo_nsu'] ?? '000000000000000';
        $resposta = ['continuar_loop' => true];
        $limite = 19;
        // 1) Executa até atingir limite OU até SEFAZ indicar que pare
        for ($cont = 0; $cont < $limite && $resposta['continuar_loop']; $cont++) {
            $xml = $this->buscarLote($conexao, $ultNsu);
            $resposta = $this->processarResposta($xml, $ultNsu);
            $ultNsu = $resposta['ultNSU'];
        }

        $retorno = [
            'status' => $resposta['status'] ?? false,
            'mensagem' => $resposta['mensagem'] ?? "Houve algum erro no fluxo da Sefaz",
            'nsu_atual' => $resposta['Nsu_atual'] ?? $ultNsu,
            'ultNSU' => $resposta['ultNSU'] ?? "000000000000000 => falha ao buscar NSU",
            'maxNSU' => $resposta['maxNSU'] ?? "000000000000000 => falha ao buscar NSU",
        ];

        if ($retorno['status']) {
            $retorno['processar'] = true;
        }
        // 2) Se a SEFAZ pediu pra parar antes de atingir o limite...
        return $retorno;
    }

Adenildo Torres

unread,
Jul 25, 2025, 4:19:48 PM7/25/25
to nfe...@googlegroups.com
Boa tarde, tudo bem?

Depois da alteracao que teve na consulta de xml da nfe, ctes, etc tempos atras pela SEFAZ, voce deve considerar o ultimo NSU que foi consultado e envia-lo, numa proxima consulta (COMO ESTA SENDO SOLICITADO NO ERRO) para que a partir DELE seja consultado o novo lote de nfes, xmls etc.

Ocorre que quando voce nao sabe em qual NSU parou a consulta ou esta atualmente, voce deve fazer a consulta (NAO LEMBRO BEM DISSO PQ FAZ ANOS...) com o NSU zerado ou algo assim e o retorno te aponta em qual NSU esta atualmente e vc pega esse NSU e consulta a partir dele.

Porque o erro esta BEM CLARO e fala sobre isso.

Dai vc vai dizer como vou controlar isso? NAO MAO, salvando o ultimo NSU de sua consulta em banco e pegando ele a partir da proxima consulta. NAO EXISTE milagre ou FAZ COMO A SEFAZ QUER ou esquece.

Espero ter ajudado.

Abraco

--
--
Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
Para Postar: nfe...@googlegroups.com
Para Sair do Grupo: nfephp+un...@googlegroups.com
Link: http://groups.google.com.br/group/nfephp?hl=pt-BR
-------
Repositórios: https://github.com/nfephp-org
---
You received this message because you are subscribed to the Google Groups "NFePHP" group.
To unsubscribe from this group and stop receiving emails from it, send an email to nfephp+un...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/nfephp/8b4362e6-10f8-4266-a3c6-74e580751131n%40googlegroups.com.

Adenildo Torres

unread,
Jul 25, 2025, 4:21:03 PM7/25/25
to nfe...@googlegroups.com
Desculpem nao tinha visto a resposta do ROBERTO.
Aqui ele descreve justamente o que falei e mais algumas coisas.

Abraco

--
--
Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
Para Postar: nfe...@googlegroups.com
Para Sair do Grupo: nfephp+un...@googlegroups.com
Link: http://groups.google.com.br/group/nfephp?hl=pt-BR
-------
Repositórios: https://github.com/nfephp-org
---
You received this message because you are subscribed to the Google Groups "NFePHP" group.
To unsubscribe from this group and stop receiving emails from it, send an email to nfephp+un...@googlegroups.com.
Message has been deleted

Inteligence Gestão Empresarial

unread,
Jul 25, 2025, 5:21:22 PM7/25/25
to nfe...@googlegroups.com
Isso e muito comum acontecer quando os contadores baixem o xml dos seus clientes, ou seja na baixa que eles fazem o NSU e incrementado então a sua sequencia mesmo estando correta a SEFAZ vai negar falando que voce esta fazendo consumo indevido e penaliza suas consultas durante 1h para então liberar. Nesta situação então você mantém a sua numeração, apos a penalidade de 1h a consulta com a sua NSU e liberada.

Outra situação e o cliente fazer parte de algum grupo de compras as empresas geralmente monitora o que o cliente compra pegando seus xml´s, por isso sua sequencia apresenta problema, porque tem mais "sujeitos" pegando xml do cnpj.

Solução, acordo com os envolvidos para repassar o xml, a empresa priorizar quem deve baixar o xml dela, em último caso suspender o certificado digital e fazer um novo. 

Romeu Alfa

unread,
Jul 25, 2025, 5:43:15 PM7/25/25
to nfe...@googlegroups.com

Já verificou se não tem mais nenhum lugar consultando este mesmo cnpj, tem alguns softwares contábeis que ficam fazendo a consulta.

--
--
Você recebeu esta mensagem porque está inscrito no Grupo "NFePHP".
Para Postar: nfe...@googlegroups.com
Para Sair do Grupo: nfephp+un...@googlegroups.com
Link: http://groups.google.com.br/group/nfephp?hl=pt-BR
-------
Repositórios: https://github.com/nfephp-org
---
You received this message because you are subscribed to the Google Groups "NFePHP" group.
To unsubscribe from this group and stop receiving emails from it, send an email to nfephp+un...@googlegroups.com.

Daniel alves

unread,
Jul 25, 2025, 5:43:25 PM7/25/25
to NFePHP
Como mencionei eu faço o controle do NSU, eu irei testar novamente mudar o NSU, para ver se o resultado é diferente, mas no caso eu já fiz esse teste antes. O meu problema e entender por que isso aqui acontece:


{"status":false,"mensagem":"Rejeicao: Consumo Indevido (Deve ser utilizado o ultNSU nas solicitacoes subsequentes. Tente apos 1 hora)","nsu_atual":"000000000505344","ultNSU":"000000000505344","maxNSU":"000000000000000"}
2025-07-24 23:08:38.000
{"status":true,"mensagem":"Nenhum documento localizado.","nsu_atual":"000000000505344","ultNSU":"000000000505344","maxNSU":"000000000505344","processar":true,"processamentoLotes":{"nfe:lote:000000000505206:clonarSefazAsa2":{"cache_key":"nfe:lote:000000000505206:clonarSefazAsa2","status":true,"mensagem":""},"nfe:lote:000000000505256:clonarSefazAsa2":{"cache_key":"nfe:lote:000000000505256:clonarSefazAsa2","status":true,"mensagem":""},"nfe:lote:000000000505306:clonarSefazAsa2":{"cache_key":"nfe:lote:000000000505306:clonarSefazAsa2","status":true,"mensagem":""},"nfe:lote:000000000505344:clonarSefazAsa2":{"cache_key":"nfe:lote:000000000505344:clonarSefazAsa2","status":true,"mensagem":""}}}

Vocês mencionam sobre o trocar o NSU, observe que o ultNSU retornado pela Sefaz as 23:08:38.000 é justamente o NSU que eu enviei, ai na proxima consulta eu enviei ele novamente, pois como mencionado o envio deve ser aquele retornado pela  Sefaz, ai quando fiz esse envio, o retorno foi: 

"status":false,"mensagem":"Rejeicao: Consumo Indevido (Deve ser utilizado o ultNSU nas solicitacoes subsequentes. Tente apos 1 hora)","nsu_atual":"000000000505344","ultNSU":"000000000505511","maxNSU":"000000000000000"}
2025-07-25 00:28:03.000

ou seja, o que foi falado aqui foi seguido, e mesmo assim tive o erro. Observe que todos os parâmetros mencionados foram seguidos.

Message has been deleted

Daniel alves

unread,
Aug 5, 2025, 12:50:52 PM8/5/25
to NFePHP
Consegui resolver o problema. No final das contas a regra comentada nesse segundo teste que fiz deu certo, além disso, a contabilidade também de fato parou a usar. No final das contas a somatória desses fatores fez com que desse certo.
Reply all
Reply to author
Forward
0 new messages