DevSecOps

16 set, 2008

Função para cálculo de frete dos correios

Publicidade

http://www.phpavancado.net

Conversando com o amigo Diego Hermes, participante do Drupal-BR, pesquisamos sobre profissionais que já haviam utilizado soluções de cálculo de frete e descobri que existe uma url que você acessa e recebe os valores e parâmetros via GET.

Logo, desenvolvi uma função bem simples para buscar os valores. Segue abaixo para estudo e utilização.

   1.      <?php
   2.       
   3.      define('FRETE_PAC',        '41106');
   4.      define('FRETE_SEDEX',      '40010');
   5.      define('FRETE_SEDEX_10',   '40215');
   6.      define('FRETE_SEDEX_HOJE', '40290');
   7.      define('FRETE_E_SEDEX',    '81019');
   8.      define('FRETE_MALOTE',     '44105');
   9.       
  10.      /**
  11.      * calcula_frete
  12.     *
  13.      * @param mixed $servico
  14.      * @param mixed $origem CEP da origem
  15.      * @param mixed $destino CEP do destino
  16.      * @param mixed $peso Peso em Kg
  17.     * @access public
  18.      * @return array
  19.      */
  20.      function calcula_frete ($servico, $origem, $destino, $peso) {
  21.        if (!$sock = fsockopen('www.correios.com.br', 80, $errornro, $error, 60)) {
  22.          throw new Exception($error, $errornro);
  23.        }
  24.         
  25.        $msg = "GET /encomendas/precos/calculo.cfm?"
  26.              ."Servico={$servico}&cepOrigem={$origem}&cepDestino={$destino}"
  27.              ."&peso={$peso}&resposta=localhost HTTP/1.1\n"
  28.              ."Host: www.correios.com.br\nConnection: Close\n\n";
  29.       
  30.        fwrite($sock, $msg);
  31.       
  32.        while (!feof($sock)) {
  33.          $line = fgets($sock);
  34.          if (!preg_match('/^Location: \w+\?(.*)$/i',$line, $match)) continue;
  35.       
  36.          $data = array();
  37.          foreach(split('&', $match[1]) as $item) {
  38.            $t = split('=', $item);
  39.            $data[$t[0]] = trim($t[1]);
  40.          }
  41.       
  42.          break;
  43.        }
  44.        $data['Servico'] = urldecode($data['Servico']);
  45.        $data['erro'] = urldecode($data['erro']);
  46.       
  47.        return $data;
  48.      }
  49.       
  50.      $result = calcula_frete(FRETE_SEDEX, '20512170', '78053378', '2');
  51.      var_dump($result);
  52.       
  53.

Bem simples, não é? Agora, $result contém a seguinte estrutura:

array(13) {
  ["Servico"]=>
  string(5) "SEDEX"
  ["cepOrigem"]=>
  string(8) "20512170"
  ["cepDestino"]=>
  string(8) "78053378"
  ["UFOrigem"]=>
  string(2) "RJ"
  ["LocalOrigem"]=>
  string(7) "Capital"
  ["UFdestino"]=>
  string(2) "MT"
  ["LocalDestino"]=>
  string(7) "Capital"
  ["Peso"]=>
  string(1) "1"
  ["MaoPropria"]=>
  string(1) "0"
  ["AvisoRecebimento"]=>
  string(1) "0"
  ["valorDeclarado"]=>
  string(1) "0"
  ["Tarifa"]=>
  string(4) "27.5"
  ["erro"]=>
  string(0) ""
}

Espero que seja útil para os leitores criarem algo mais elaborado. Qualquer coisa me avisa e vamos publicando por aqui.