Consegue resolver criando processos dentro de Try Catch, onde ele intercepta todos os erros que podem acontecer dentro no momento de enviar para a sefaz, ficou bem bacana
Agora ele retorna uma mensagem para o operador avisando da instabilidade.
/**
* Identifica falha de comunicação/transporte com a SEFAZ.
*/
private function isFalhaComunicacaoSefaz(\Throwable $e){
// NFePHP: SoapException = falha de transporte/SOAP (inclui Could not resolve host)
if ($e instanceof \NFePHP\Common\Exception\SoapException) {
return true;
}
$mensagens = [$e->getMessage()];
$anterior = $e->getPrevious();
while ($anterior instanceof \Throwable) {
if ($anterior instanceof \NFePHP\Common\Exception\SoapException) {
return true;
}
$mensagens[] = $anterior->getMessage();
$anterior = $anterior->getPrevious();
}
$erroNormalizado = $this->normalizarMensagemErroSefaz(implode(' ', $mensagens));
// Padrões sem acento (mensagem já normalizada). Cobre EN (cURL) e PT (httpcodes.json).
$falhasComunicacao = [
'erro de comunicacao via soap',
'could not resolve host',
'couldn\'t resolve host',
'failed to connect',
'connection refused',
'connection timed out',
'operation timed out',
'timeout was reached',
'could not connect',
'unable to connect',
'empty reply from server',
'ssl connect error',
'ssl certificate problem',
'recv failure',
'connection reset by peer',
'service unavailable',
'servico indisponivel',
'bad gateway',
'gateway timeout',
'tempo de requisicao esgotou',
'erro interno do servidor',
'retorno da sefaz vazio',
'temporary failure in name resolution',
'name or service not known'
];
foreach ($falhasComunicacao as $falha) {
if (strpos($erroNormalizado, $falha) !== false) {
return true;
}
}
return false;
}
/**
* Retorna uma mensagem amigável somente quando a exceção representa
* indisponibilidade de comunicação com a SEFAZ.
*
* Cobre falhas SOAP/cURL (DNS, timeout, HTTP 502/503/504, etc.).
* Erros que não sejam de comunicação continuam no fluxo original de cada método.
*/
private function retornoIndisponibilidadeSefaz(\Throwable $e, $campoSituacao = 'situacao', array $contexto = []){
if (!$this->isFalhaComunicacaoSefaz($e)) {
return null;
}
$erroTecnico = $e->getMessage();
error_log(json_encode([
'evento' => 'indisponibilidade_comunicacao_sefaz',
'erro' => $erroTecnico,
'codigo' => $e->getCode(),
'contexto' => $contexto,
'data' => date('Y-m-d H:i:s')
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
return [
$campoSituacao => $campoSituacao === 'retorno' ? 'error' : 'sefaz_indisponivel',
'mensagem' => $this->mensagemSefazIndisponivel()
];
}
// Função que envia para a sefaz
try {
// Código
} catch (\Throwable $e) {
$retorno = $this->retornoIndisponibilidadeSefaz($e, 'retorno', [
'operacao' => 'consulta_cadastro',
'cnpj' => $cnpj,
'uf' => $uf
]);
if ($retorno === null) {
$retorno = [
'retorno' => "error",
'mensagem' => $e->getMessage()
];
}
}