Result tipado — nunca um array, null ou valor booleano. Isso garante que sua aplicação saiba exatamente o que ocorreu com cada documento fiscal, sem precisar inspecionar campos opcionais ou interpretar convenções implícitas.
Anatomia do Result
OResult possui três estados possíveis, mutuamente exclusivos:
1. Sucesso
O documento foi aceito e autorizado pela SEFAZ. OResult contém a chave de acesso, o número de protocolo e o XML autorizado assinado digitalmente. Nenhuma exceção é lançada.
2. Rejeição esperada
A SEFAZ recusou o documento por uma razão de negócio — chave duplicada, inconsistência cadastral, schema inválido, entre outros. A rejeição é retornada noResult com o código cStat e a descrição xMotivo. Ela não é uma exceção; é um resultado previsto que sua aplicação deve tratar.
3. Falha técnica
Ocorreu um problema de infraestrutura fora do domínio fiscal: timeout na requisição, HTTP 5xx do servidor SEFAZ, queda de conectividade, problema de certificado digital. Nesses casos, o SDK lança umaInfrastructureException — ela não é encapsulada em um Result. Use try/catch separado e considere uma RetryPolicy para falhas transitórias.
A separação entre rejeição esperada e falha técnica é fundamental. Misturá-las leva a lógicas incorretas — como retentar uma rejeição por CNPJ inválido indefinidamente, ou ignorar um timeout sem política de reenvio.
Inspecionando um Result
Dados disponíveis no sucesso
Quando$result->isSuccess() retorna true, os seguintes dados estão disponíveis:
| Método | Tipo | Descrição |
|---|---|---|
chave() | string | Chave de acesso de 44 dígitos do DF-e |
protocolo() | string | Número do protocolo de autorização SEFAZ |
xmlAutorizado() | string | XML completo com protNFe / protCTe embutido |
autorizadoEm() | DateTimeImmutable | Data e hora de autorização (fuso UTC-3) |
metadados() | array | Dados auxiliares: ambiente, versão do layout, CNPJ autorizador |
Persista sempre o
xmlAutorizado() imediatamente após a autorização. Esse XML é o documento fiscal com validade jurídica e deve ser armazenado conforme os prazos de guarda estabelecidos pela legislação brasileira.Dados disponíveis na rejeição
Quando$result->isRejected() retorna true, os seguintes dados estão disponíveis:
| Método | Tipo | Descrição |
|---|---|---|
status() | int | Código cStat retornado pela SEFAZ |
motivo() | string | Descrição xMotivo retornada pela SEFAZ |
xmlResposta() | string | null | XML de retorno da SEFAZ, quando disponível |
rejeitadoEm() | DateTimeImmutable | Data e hora do processamento |
metadados() | array | Ambiente, versão, identificador do lote |
Falhas de infraestrutura e RetryPolicy
InfrastructureException sinaliza que a comunicação com a SEFAZ não foi concluída — o documento pode ou não ter sido processado. Antes de qualquer nova tentativa, consulte a situação da NF-e pelo serviço de consulta de chave para evitar duplicidade.
Para automatizar retentativas com backoff configurável, use a RetryPolicy do SDK:
Próximos passos
Rejeições SEFAZ
Interprete códigos cStat, diagnostique causas e reconstrua o Command corrigido.
Retry Policy
Configure retentativas automáticas para falhas transitórias de infraestrutura.