Jump to content


Photo

Demora No Cálculo Do Frete


  • Faça o login para participar
3 replies to this topic

#1 bambolero

bambolero

    Novato no fórum

  • Usuários
  • 7 posts
  • Sexo:Não informado

Posted 05/01/2010, 11:27

Um trecho do meu script frete.php é esse:

$correios = "http://www.correios.com.br/encomendas... etc.. etc... &resposta=xml";

$correios_info = FALSE;

while (!$correios_info) {
    $correios_info = @file($correios);
}

foreach($correios_info as $info) {
    if(preg_match("/\<preco_postal>(.*)\<\/preco_postal>/",$info,$tarifa)) {
        $ValorFreteSEDEX10 = $tarifa[1];
    }
}



A primeira dúvida...

while (!$correios_info) {
    $correios_info = @file($correios);
}

Essa é a maneira certa de fazer isso, certo?
Continuar enviando a requisição enquanto não houver uma resposta.. ou ela for nula.
Pois antes, sem o while, as vezes o valor do frete retornava R$ 0,00



O principal é: as vezes esse cálculo de frete demora demais, muito mesmo.
A noite funciona bem.. é rápido, mas a tarde complica.


Esse web service dos Correios é assim mesmo? Lerdo?

Ou posso fazer isso de uma forma mais decente?



Obrigado!

#2 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 05/01/2010, 12:15

Esse não é o webservice indicado no Manual de Implementação de Cálculo Remoto de Preços e Prazos de Encomendas. Neste manual você tem a opção de usar a saída em XML, o que acaba ficando mais prático, podendo usar a biblioteca SimpleXML. :)

Aqui vai um exemplo de uma classe simples que fiz tempos atrás só para brincar com as possibilidades:

<?php

/*
 * @author    Paulo Freitas <paulofreitas dot web at gmail dot com>
 * @copyright Copyright (C) 2009-2010  Paulo Freitas
 * @license   http://creativecommons.org/licenses/by-sa/3.0
 */

class EncomendasCorreios
{
    /*
     * Serviços
     */
    const SERVICO_ESEDEX       = 81019;
    const SERVICO_MALOTE       = 44105;
    const SERVICO_PAC          = 41106;
    const SERVICO_SEDEX        = 40010;
    const SERVICO_SEDEX10      = 40215;
    const SERVICO_SEDEXACOBRAR = 40045;
    const SERVICO_SEDEXHOJE    = 40290;

    protected static $api_url =
        'http://shopping.correios.com.br/wbm/shopping/script/CalcPrecoPrazo.aspx';

    protected $entrada = array(
        'nCdEmpresa'          => '',
        'sDsSenha'            => '',
        'nCdServico'          => self::SERVICO_SEDEX,
        'sCepOrigem'          => '',
        'sCepDestino'         => '',
        'nVlPeso'             => 0,
        'nCdFormato'          => 1,
        'nVlComprimento'      => 0,
        'nVlAltura'           => 0,
        'nVlLargura'          => 0,
        'nVlDiametro'         => 0,
        'sCdMaoPropria'       => 'N',
        'nVlValorDeclarado'   => 0,
        'sCdAvisoRecebimento' => 'N'
    );
    protected $saida;

    public function __construct($nCdEmpresa = '', $sDsSenha = '')
    {
        $this->nCdEmpresa = $nCdEmpresa;
        $this->sDsSenha   = $sDsSenha;
    }

    public function obterResposta()
    {
        $this->entrada['StrRetorno'] = 'xml';
        $this->saida = @simplexml_load_string(html_entity_decode(
            file_get_contents(self::$api_url . '?' . http_build_query(
                $this->entrada))));
    }

    public function __get($nome)
    {
        if (isset($this->saida[0]->cServico->$nome)) {
            return $this->saida[0]->cServico->$nome;
        } else {
            throw new Exception('propriedade inexistente');
        }
    }

    public function __set($nome, $valor)
    {
        if (array_key_exists($nome, $this->entrada)) {
            $this->entrada[$nome] = $valor;
        } else {
            throw new Exception('propriedade inexistente');
        }
    }
}

try {
    $EncomendasCorreios = new EncomendasCorreios;
    $EncomendasCorreios->nCdServico     = EncomendasCorreios::SERVICO_PAC;
    $EncomendasCorreios->sCepOrigem     = '13100000';
    $EncomendasCorreios->sCepDestino    = '20000000';
    $EncomendasCorreios->nVlPeso        = 1;
    $EncomendasCorreios->nVlComprimento = 20;
    $EncomendasCorreios->nVlAltura      = 10;
    $EncomendasCorreios->nVlLargura     = 20;
    $EncomendasCorreios->nCdFormato     = 1;
    $EncomendasCorreios->obterResposta();

    if ($EncomendasCorreios->Erro != '0') {
        print "Erro: {$EncomendasCorreios->MsgErro}";
    } else {
        printf("Valor: R$%s\nPrazo de entrega: %s dias úteis",
            $EncomendasCorreios->Valor, $EncomendasCorreios->PrazoEntrega);
    }
} catch (Exception $e) {
    print "Erro: {$e->getMessage()}";
}

?>
Sinta-se livre para usar e/ou adaptar.

[]’sAté mais
  • bambolero likes this

#3 bambolero

bambolero

    Novato no fórum

  • Usuários
  • 7 posts
  • Sexo:Não informado

Posted 05/01/2010, 17:10

Paulo, muito obrigado pelas dicas e pelo código!


Se surgir alguma novidade pra sua classe eu lhe aviso.


Um abraço!

#4 Paulo Freitas

Paulo Freitas

    ××××××× LRU #456504 ××××××× ××××××× LRM #364686 ×××××××

  • Ex-Admins
  • 5612 posts
  • Sexo:Masculino
  • Localidade:Campinas - SP

Posted 05/01/2010, 17:37

Opa, só pra deixar claro o uso dos métodos mágicos __get() e __set():

Tu pode passar qualquer índice do array $_entrada como propriedade do objeto $EncomendasCorreios na consulta. Pra facilitar, as informações nCdEmpresa e sDsSenha são definidas no próprio construtor e o método de retorno (StrRetorno) é definido no método obterResposta().

Quanto as propriedades de resposta, você pode obter: Codigo, Valor, PrazoEntrega, ValorMaoPropria, ValorAvisoRecebimento, ValorValorDeclarado, EntregaDomiciliar, EntregaSabado, Erro e MsgErro. Eis um exemplo de um vardump() do objeto $EncomendasCorreios da requisição de exemplo da classe:

["_saida":"EncomendasCorreios":private]=>
  object(SimpleXMLElement)#2 (1) {
    ["cServico"]=>
    object(SimpleXMLElement)#5 (10) {
      ["Codigo"]=>
      string(5) "41106"
      ["Valor"]=>
      string(5) "12,00"
      ["PrazoEntrega"]=>
      string(1) "5"
      ["ValorMaoPropria"]=>
      string(4) "0,00"
      ["ValorAvisoRecebimento"]=>
      string(4) "0,00"
      ["ValorValorDeclarado"]=>
      string(4) "0,00"
      ["EntregaDomiciliar"]=>
      string(1) "S"
      ["EntregaSabado"]=>
      string(1) "N"
      ["Erro"]=>
      string(1) "0"
      ["MsgErro"]=>
      object(SimpleXMLElement)#3 (0) {
      }
    }
É isso. Espero que seja útil. :)

[]’sAté mais




0 user(s) are reading this topic

0 membro(s), 0 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq