Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Problema na comunicação #32

Closed
lgthomazelli opened this issue May 15, 2019 · 17 comments
Closed

Problema na comunicação #32

lgthomazelli opened this issue May 15, 2019 · 17 comments

Comments

@lgthomazelli
Copy link

Aparentemente começou a dar erro na comunicação com o serviço do correios. Alguém tem ideia do que possa ser?

@cagartner
Copy link
Owner

Qual serviço?

Ultimamente os serviços dos Correios estão caindo bastante...

Testei aqui a consulta de CEP e está online.

Abraços!

@juniorrosul
Copy link

Estamos enfrentando alguns problemas semelhantes aqui, principalmente na consulta de valores. O sistema não chega a estar fora, porém está muito lento pra retornar as informações. Estamos preparando algumas contingências aqui para prevenir este atraso no retorno.
O tempo para os correios retornar a informação está em aproximadamente 2 minutos.

@lgthomazelli
Copy link
Author

Aqui no meu ele dá timeout quando vai calcular o frete

@lffruhling
Copy link

Olá, percebi que no dia de ontem 15/05/2019, realmente o WS dos correios estava com os métodos [ListaServicos e CalcPrecoPrazoData] fora, ou seja, não respondiam nem na página de testes do WS, porém o método CalcPrecoPrazo ainda respondia. Hoje, 16/05/2019, todos os métodos respondem nos testes do WS do correio, no entanto, por este pacote, ainda retorna timeOut. Seria interessante adicionar um novo método dentro deste pacote apontando para CalcPrecoPrazo, já que este, me parece ser mais instável no WS dos correios que CalcPrecoPrazoData. E sobre o timeOut do pacote, existe alguma possível solução, nem que seja emergencial?

@lgthomazelli
Copy link
Author

Se alguém conseguir uma solução mesmo que provisória compartilha aqui.

@rodrigopeixotobr
Copy link

Olá Pessoal.
A consulta de prazos e valor de PAC e SEDEX segue com problemas aqui.
Tem alguma outra solução?

Encontrei plugin pra Wordpress e módulo pra Magento que dizem funcionar sem os Correios, ou seja, um frete offline.
Teria como darmos uma olhada em como funciona e ver se podemos fazer igual ou semelhante.

Magento: https://loja.av5.com.br/modulo-magento-correios-offline-free-gratis.html
Wordpress: https://fernandoacosta.net/produto/frete-tabela-offline/

Talvez não tenha como implementar neste mesmo pacote mas já podemos ir definindo com resolver.

@cagartner
Copy link
Owner

@rodrigopeixotobr

Obrigado por postar, mas nesse caso esse pacoto é apenas de comunicação com os correios e deve permanecer assim, o correios offline nesses módulos que vc passou salvam em uma tabela todas as consultas com sucesso, quando o correios fica offline eles buscam em um raio nesses registros um valor aproximado que já tinha sido cotado anteriormente...

Não é 100% offline porque depende de algo que foi pesquisado antes, e os valores podem ficar defasados, porem garante uma venda...

Eu aconselho que essa solução seja aplicada aos projetos que esse pacote está sendo utilizado como forma de backup quando os correios está fora, ou retornar um valor médio fixo já cobrado.

Agradeço o uso desse pacote mas no momento não estou com tempo hábil para aplicar uma correção, se alguem puder fazer um PR com certeza irei aprovar o mais rápido possível.

Abraços!

@rodrigopeixotobr
Copy link

rodrigopeixotobr commented May 16, 2019

Beleza @cagartner , entendi.
Achei um outro tópico comentando sobre o erro e acho que pode nos ajudar.

O problema está em algumas portas dos servidores do Correios utilizados no wsdl: http://ws.correios.com.br/calculador/CalcPrecoPrazo.asmx?WSDL
No final desse arquivo possui um: <wsdl:service name="CalcPrecoPrazoWS"> que informa a URL da endpoint (ela varia entre as portas: 80, 8080, 8081 e 8082 randomicamente, atualize a página para ver) e somente a porta 80 está funcionando. Porém o Soap do PHP faz cache do wsdl e se ele pegou a porta incorreta, vai ficar dando erro.

É este o tópico: stavarengo/php-sigep#344
Faz sentido para resolvermos? Poderia resolver?

@rodrigopeixotobr
Copy link

Pessoal, eu limpei esse cache do SOAP (wsdl) e voltou a funcionar!
Fica na pasta /tmp/wsdl-*
Segui esse link aqui: https://stackoverflow.com/questions/303488/in-php-how-can-you-clear-a-wsdl-cache

@tiagobatistaa
Copy link

tiagobatistaa commented May 16, 2019

@rodrigopeixotobr

Obrigado por postar, mas nesse caso esse pacoto é apenas de comunicação com os correios e deve permanecer assim, o correios offline nesses módulos que vc passou salvam em uma tabela todas as consultas com sucesso, quando o correios fica offline eles buscam em um raio nesses registros um valor aproximado que já tinha sido cotado anteriormente...

Não é 100% offline porque depende de algo que foi pesquisado antes, e os valores podem ficar defasados, porem garante uma venda...

Eu aconselho que essa solução seja aplicada aos projetos que esse pacote está sendo utilizado como forma de backup quando os correios está fora, ou retornar um valor médio fixo já cobrado.

Agradeço o uso desse pacote mas no momento não estou com tempo hábil para aplicar uma correção, se alguem puder fazer um PR com certeza irei aprovar o mais rápido possível.

Abraços!

resolvi alterando as portas no arquivo xml, stavarengo/php-sigep#344 limpando o cache como o @rodrigopeixotobr falou resolve temporariamente!

@kneipp
Copy link

kneipp commented May 16, 2019

@tiagobatistaa @rodrigopeixotobr em qual arquivo estão definidas as portas?

@rodrigopeixotobr
Copy link

@kneipp pelo que entendi Correios que retorna qual porta vai ser utilizada.

@kneipp
Copy link

kneipp commented May 16, 2019

Exclui o arquivo /tmp/wsdl-* e voltou aqui tb.

@lffruhling
Copy link

Acabei reescrevendo o método e não utilizando o SOAP do php... se alguem precisar segue:

DETALHE, tive que mudar os códigos do frete do correio pq com os antigos retornava erro 888

'sedex' => '40010',
'pac' => '41106',

e estou fazendo a requisição para este endereço:

private $URI = 'http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx' ;

agora sim meu código

`public function frete($dados)
{
$tipos = self::getTipoInline($dados['tipo']);

    $formatos = array(
        'caixa'    => 1,
        'rolo'     => 2,
        'envelope' => 3,
    );

    $dados['formato'] = $formatos[$dados['formato']];
    /*
      1 eh Formato caixa/pacote
      2 eh Formato rolo/prisma
      3 - Envelope
     */
    $dados['cep_destino'] = preg_replace("/[^0-9]/", '', $dados['cep_destino']);
    $dados['cep_origem']  = preg_replace("/[^0-9]/", '', $dados['cep_origem']);

    $consultas = [];
    foreach (explode(',',$tipos) as $tipo){
        $params = array(
            'nCdEmpresa'          => (isset($dados['empresa']) ? $dados['empresa'] : ''),
            'sDsSenha'            => (isset($dados['senha']) ? $dados['senha'] : ''),
            'sCepOrigem'          => $dados['cep_origem'],
            'sCepDestino'         => $dados['cep_destino'],
            'nVlPeso'             => $dados['peso'],
            'nCdFormato'          => $dados['formato'],
            'nVlComprimento'      => $dados['comprimento'],
            'nVlAltura'           => $dados['altura'],
            'nVlLargura'          => $dados['largura'],
            'sCdMaoPropria'       => (isset($dados['mao_propria']) && $dados['mao_propria'] ? 'S' : 'N'),
            'nVlValorDeclarado'   => (isset($dados['valor_declarado']) ? $dados['valor_declarado'] : 0),
            'sCdAvisoRecebimento' => (isset($dados['aviso_recebimento']) && $dados['aviso_recebimento'] ? 'S' : 'N'),
            'nCdServico'          => $tipo,
            'nVlDiametro'         => $dados['diametro'],
            'StrRetorno'          => 'xml' ,
        );

        $__url = $this->URI.'?';
        foreach ($params as $key => $value){
            $__url .= "$key=$value&" ;
        }

        $__url = rtrim($__url, '&');
        $xml = simplexml_load_file( $__url );
        $consultas[] = $xml->cServico;
    }

    $dados_retorno = array();
    foreach ($consultas as $consulta){
        $consulta = (array) $consulta;
        $dados_retorno[] = array(
            'codigo'             => $consulta['Codigo'],
            'valor'              => (float) str_replace(',', '.', $consulta['Valor']),
            'prazo'              => (int) str_replace(',', '.', $consulta['PrazoEntrega']),
            'mao_propria'        => (float) str_replace(',', '.', $consulta['ValorMaoPropria']),
            'aviso_recebimento'  => (float) str_replace(',', '.', $consulta['ValorAvisoRecebimento']),
            'valor_declarado'    => (float) str_replace(',', '.', $consulta['ValorValorDeclarado']),
            'entrega_domiciliar' => ($consulta['EntregaDomiciliar'] === 'S' ? true : false),
            'entrega_sabado'     => ($consulta['EntregaSabado'] === 'S' ? true : false),
            'erro'               => array('codigo' => (real) $consulta['Erro'], 'mensagem' => $consulta['MsgErro']),
        );
    }

    return $dados_retorno;

}`

@alecshoppe
Copy link

Existe também a opção de ser 100% Offline.
Os correios possuem uma tabela atualizada a cada x meses que todos que tem contrato recebem.
Ela possui todas as faixas de cep, separado por região x peso x preço e prazo.
É assim que grandes e-commerces nunca ficam sem o cálculo.

@rodrigopeixotobr

Obrigado por postar, mas nesse caso esse pacoto é apenas de comunicação com os correios e deve permanecer assim, o correios offline nesses módulos que vc passou salvam em uma tabela todas as consultas com sucesso, quando o correios fica offline eles buscam em um raio nesses registros um valor aproximado que já tinha sido cotado anteriormente...

Não é 100% offline porque depende de algo que foi pesquisado antes, e os valores podem ficar defasados, porem garante uma venda...

Eu aconselho que essa solução seja aplicada aos projetos que esse pacote está sendo utilizado como forma de backup quando os correios está fora, ou retornar um valor médio fixo já cobrado.

Agradeço o uso desse pacote mas no momento não estou com tempo hábil para aplicar uma correção, se alguem puder fazer um PR com certeza irei aprovar o mais rápido possível.

Abraços!

@viniciusfb92
Copy link

Eu fiz uma mudança seguindo algumas migalhas que achei na net, troquei a url de consulta para http://ws.correios.com.br/calculador/CalcPrecoPrazo.asmx/CalcPrecoPrazo e troquei a forma da requisição de soap pra post com os mesmo parâmetros que tinhamos antes, aparentemente funcionou, só tive que fazer algumas adaptações na resposta.

caso alguém fique interessado, segue o trecho que eu inseri:

// $soap = new \SoapClient($endpoint, $options);
const FRETE_URL = 'http://ws.correios.com.br/calculador/CalcPrecoPrazo.asmx/CalcPrecoPrazo';

$curl = curl_init(self::FRETE_URL);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLINFO_HEADER_OUT, 1);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params));

    $result = curl_exec($curl);
    $resultado = simplexml_load_string($result);

    $resultado = (array) $resultado->Servicos;
    $resultado = $resultado['cServico'];

@cagartner
Copy link
Owner

Galera.

Acabei de subir uma atualização baseado nas orientações de vocês, dei uma refatorada em geral no método de consultar frete (to até com vergonha de algumas coisas que tinha escrevido rsrsrs fáz uns 6 anos que fiz esse pacote)

Podem atualizar para a versão 0.1.13 e ver se está melhor o desempenho do retorno?

Obrigado a todos, especial ao @viniciusfb92 e @lffruhling pelas orientações.

Abraços!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

9 participants