Skip to main content
Rejeições SEFAZ são resultados de negócio esperados, não exceções de sistema. Quando a SEFAZ recusa um documento fiscal por inconsistência cadastral, schema inválido, chave duplicada ou qualquer outra regra de validação, o SUOT Fiscal SDK retorna essa resposta encapsulada em um objeto Result — com cStat, xMotivo e o XML de retorno disponíveis para inspeção imediata. Sua aplicação deve tratar cada rejeição de forma deliberada, corrigir os dados e reenviar o documento quando apropriado.

O que é uma rejeição (vs. falha técnica)

É essencial distinguir os dois tipos de resultado negativo no SDK:
CaracterísticaRejeição esperadaFalha técnica
OrigemRegra de negócio / validação SEFAZInfraestrutura: timeout, HTTP 5xx, rede
Retorno no SDKResult com isRejected() === trueInfrastructureException lançada
cStat disponívelSimNão
Deve retortar?Somente após corrigir os dadosPode retentar com RetryPolicy
ExemploCNPJ inválido, schema com campo faltandoTimeout de 30s, servidor SEFAZ indisponível
Uma rejeição SEFAZ significa que o webservice foi alcançado e processou a requisição — a resposta é definitiva para aqueles dados. Já uma InfrastructureException indica que não foi possível sequer obter uma resposta.

Códigos cStat comuns

A tabela abaixo lista códigos cStat frequentes no ciclo de autorização de NF-e e CT-e. Consulte o Manual de Orientação do Contribuinte (MOC) da SEFAZ para a relação completa e atualizada.
cStatDescriçãoAção recomendada
100Autorizado o uso do DF-e— (sucesso, não é rejeição)
101Cancelamento homologado— (sucesso de cancelamento)
104Lote recebido com sucessoConsultar processamento do lote
110Uso DenegadoVerificar situação fiscal do emitente junto à SEFAZ
204Duplicidade de NF-eVerificar se a chave já foi emitida; recuperar XML autorizado
217NF já existe no sistema SEFAZVerificar chave e recuperar o XML autorizado já registrado
225Rejeição: Falha no Schema XMLVerificar campos obrigatórios e estrutura do XML
252Rejeição: Layout inválidoCorrigir versão ou estrutura do layout conforme MOC vigente
431Rejeição: Emissão em contingênciaVerificar modo de emissão e regras de contingência aplicáveis
539Rejeição: CNPJ do emitente inválidoVerificar e corrigir CNPJ do emitente
999Rejeição: Erro não catalogadoAnalisar xMotivo detalhadamente; acionar suporte se persistir
Os códigos 100, 101 e 104 indicam sucesso ou processamento intermediário — não são rejeições. O SUOT Fiscal SDK os mapeia corretamente para isSuccess() ou para o estado de lote pendente, conforme o contexto.

Tratando rejeições

Nunca ignore uma rejeição silenciosamente. Registrar cStat e xMotivo em todos os casos é obrigatório — esses valores são o ponto de partida para diagnóstico, auditoria e correção dos dados fiscais.
Use isRejected() para interceptar rejeições e registre sempre cStat e xMotivo antes de tomar qualquer ação:
use SUOT\Fiscal\Handler\AutorizacaoHandler;
use SUOT\Fiscal\Command\AutorizarNFeCommand;
use SUOT\Fiscal\Exception\InfrastructureException;

$command = new AutorizarNFeCommand(/* ... */);

try {
    $result = $handler->handle($command);

    if ($result->isSuccess()) {
        // Documento autorizado — persista chave, protocolo e XML
        $chave     = $result->chave();
        $protocolo = $result->protocolo();
        $xml       = $result->xmlAutorizado();

        logger()->info('NF-e autorizada', compact('chave', 'protocolo'));

    } elseif ($result->isRejected()) {
        $cStat  = $result->status();
        $motivo = $result->motivo();

        // Sempre registre cStat e xMotivo
        logger()->warning('NF-e rejeitada pela SEFAZ', [
            'cStat'   => $cStat,
            'xMotivo' => $motivo,
            'chave'   => $command->chave(),
        ]);

        // Roteie pelo código de rejeição
        match ($cStat) {
            204 => $this->handleDuplicidade($result),
            539 => $this->notificarCnpjInvalido($command),
            225 => $this->notificarSchemaInvalido($result),
            default => $this->encaminharParaRevisaoManual($cStat, $motivo),
        };
    }

} catch (InfrastructureException $e) {
    // Falha de infraestrutura — tratar separadamente
    logger()->error('Falha técnica ao autorizar NF-e', ['error' => $e->getMessage()]);
}

Reconstruindo o Command corrigido

O SUOT Fiscal SDK adota Commands imutáveis: uma vez construído, um Command não pode ser alterado. Isso garante rastreabilidade e evita mutações acidentais entre tentativas. Para corrigir e reenviar, construa um novo Command com os dados corretos:
// Command original com CNPJ incorreto (cStat 539)
$commandOriginal = new AutorizarNFeCommand(
    emitenteCnpj: '00.000.000/0000-00',  // inválido
    destinatarioCpf: '123.456.789-09',
    valorTotal: 1500.00,
    itens: $itens,
    // ...
);

$result = $handler->handle($commandOriginal);

if ($result->isRejected() && $result->status() === 539) {
    // Reconstrua o Command com o CNPJ corrigido
    $commandCorrigido = new AutorizarNFeCommand(
        emitenteCnpj: '12.345.678/0001-95',  // corrigido
        destinatarioCpf: '123.456.789-09',
        valorTotal: 1500.00,
        itens: $itens,
        // ...
    );

    $resultCorrigido = $handler->handle($commandCorrigido);
}
Nunca reenvie o mesmo Command sem corrigir os dados que causaram a rejeição. A SEFAZ retornará o mesmo cStat repetidamente — o que gera consumo desnecessário de cota de requisições e pode indicar um problema de loop na sua lógica de negócio.
Para rejeições do tipo 204 (duplicidade), não reconstrua o Command. Em vez disso, consulte a chave já existente com o serviço de consulta de NF-e e recupere o XML autorizado que já está na base da SEFAZ.

Rejeições vs. falhas técnicas — resumo

Rejeição esperadaFalha técnica (InfrastructureException)
cStat disponível✅ Sim❌ Não
xMotivo disponível✅ Sim❌ Não (mensagem de infraestrutura)
Ação imediataCorrigir dados, reconstruir CommandRetente com RetryPolicy ou investigue conectividade
Deve fazer retry automático?❌ Nunca (mesmo resultado)✅ Sim, para falhas transitórias
Exemplo de código$result->isRejected()catch (InfrastructureException $e)

Próximos passos

Resultados de operações

Entenda a anatomia do Result e como inspecionar sucesso, rejeição e falha técnica.

Retry Policy

Configure retentativas automáticas para falhas transitórias de infraestrutura.