Ir para conteúdo
  • Cadastre-se

dev botao

Exemplo de captura de resposta PHP + socket


Ver Solução Respondido por sergiobarros,
  • Este tópico foi criado há 195 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Bom dia pessoal.
Estou postando um pequeno exemplo de captura de resposta em PHP utilizando o ACBrMonitorPlus com socket.
Vi alguns exemplos onde o pessoal tem dado um explode na resposta, mas há um método de leitura de arquivos INI que facilita bastante o tratamento da resposta.

Espero ajudar.
Abraços.
Luiz Fernando Rodrigues
Infomaster Sistemas
Penápolis/SP

 

/* FUNÇÃO PARA CONSULTAR O STATUS DO SERVIÇO DA NFE */
    function statusServicoNfeBO($hostAcbrMonitor, $portaAcbrMonitor) {
        try {
            /* ANALISANDO CAMPOS OBRIGATÓRIOS */
            if (empty($hostAcbrMonitor)) { throw new Exception("Falha ao identificar o host do ACBr Monitor."); }
            else if (empty($portaAcbrMonitor)) { throw new Exception("Falha ao identificar a porta do ACBr Monitor."); }

            /* ESTABELECENDO UM NOVO SOCKET */
            $socket = socketBO($hostAcbrMonitor, $portaAcbrMonitor);
            
            /* ANALISANDO O RETORNO DA CONEXÃO AO SOCKET */
            if ($socket["statusRetorno"] == "ERRO") { throw new Exception("Não é possível estabelecer um socket com o ACBrMonitorPlus.<br />Reinicie o computador e tente novamente. Se o problema persistir, contate o suporte técnico."); }
            else {
                /* CHAMANDO RESPOSTA DA CONEXÃO DO SOCKET */
                $socket["socket"]->recv();
                $socket["socket"]->send("NFE.StatusServico()"."\r\n.\r\n");
                $respostaFuncao = $socket["socket"]->recv();
                /* O MÉTODO PARSE_INI_STRING CONSEGUE CONVERTER A RESPOSTA DO ACBr PARA UM ARRAY.
                 * DESSA FORMA FICA MUITO FÁCIL LER A RESPOSTA. */
                $respostaFuncaoArray = parse_ini_string($respostaFuncao,true);
                if (!isset($respostaFuncaoArray["STATUS"]["CStat"])) { throw new Exception(nl2br($respostaFuncao)); }
                else {
                    /* LIMPANDO OS DADOS DE CONEXÃO COM O SOCKET */
                    $retorno["statusRetorno"] = "SUCESSO";
                    $retorno["msgRetorno"] = $respostaFuncaoArray["STATUS"]["CStat"]." - ".$respostaFuncaoArray["STATUS"]["XMotivo"];
                    return $retorno;
                }
            }
        }
        catch (Exception $e) {
            $retorno["statusRetorno"] = "ERRO";
            $retorno["msgRetorno"] = "Falha ao consultar o status do serviço da NFe.";
            $retorno["msgErro"] = $e->getMessage();
            return $retorno;
        }
    }

  • 8 anos depois...
  • Solution
Postado

Prezados,

Mesmo sendo um tópico antigo, coloco aqui uma breve observação quanto ao código do exemplo disponibilizado aqui e encontrado no trunk2 (https://svn.code.sf.net/p/acbr/code/trunk2/Projetos/ACBrMonitorPLUS/Lazarus/Exemplos/nfeBO.php).

Analisando o código, observei que a linha:

if (!isset($respostaFuncaoArray["STATUS"]["CStat"])) { throw new Exception(nl2br($respostaFuncao)); }

Estava forçando uma exception, o que acarretava na execução do bloco catch, mesmo a resposta para o ACBrmonitorPlus ter retornado um resultado correto.

Observei que isso ocorreu por causa do índice "STATUS" em maiúsculo. Fiz a correção e funcionou perfeitamente:

Meu código ficou assim então:

(...)

if (!isset($respostaFuncaoArray["Status"]["CStat"])) {throw new Exception(nl2br($respostaFuncao)); }
else {
                    /* LIMPANDO OS DADOS DE CONEXÃO COM O SOCKET */
                    $retorno["statusRetorno"] = "SUCESSO";
                    $retorno["msgRetorno"] = $respostaFuncaoArray["Status"]["CStat"]." - ".$respostaFuncaoArray["Status"]["XMotivo"];
                    return $retorno;
}

(...)

Aproveito para agrader pelas contribuições dos códigos, pois era o que eu estava procurando.

Meu arquivo corrigido é este:

nfeBO.php

  • Este tópico foi criado há 195 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • 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.