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

PHP
Enviado por Pedro Faria em Seg, 22/10/2007 - 08:15.PHP

Trocando uma idéia com Diego Hermes (um camarada lá do fórum drupal-br) resolvi pesquisar se alguém já havia feito isso e descobri que existe uma url que você acessa e recebe os valores e parâmetros via GET.

Então eu resolvi fazer uma função BEEEEEEEEEM SIMPLES que pega os valores.

  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é? agora, $result contém o 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 util para alguém e se você criar algo mais elaborado, me avisa que eu posto aqui!

T+



Enviado por guest (não verificado(a)) em Ter, 27/11/2007 - 19:30.

fiz um upload para um host e só mudou o tipo de erro

Parse error: syntax error, unexpected T_NEW in /home/ipifila/public_html/frete.php on line 22

será que tem jeito de ver o que seria ou tem esse arquivo rodando em algum lugar?

Enviado por Pedro Faria em Ter, 27/11/2007 - 21:14.

provavelmente seu php eh 4 e este código eh para php 5.. soh adaptar a linha 22...

flw!

Enviado por guest (não verificado(a)) em Ter, 11/12/2007 - 23:37.

E ai amigo, você não tem esse script sem ser em classe e para PHP4 não?

Se tiver, me avise.

Bruno Estevao
www.sempihost.com.br

Enviado por Marlon Parizzotto (não verificado(a)) em Ter, 12/02/2008 - 10:43.

tive q fazer uma alteraçao para funcionar,
a funçao nao estava retornando nd,
entao olhando o retorno verifiquei que a para encontrar os valores
tem q mudar a linha:

if (!preg_match('/^Location: \w+\?(.*)$/',$line, $match)) continue;

para:

if (!preg_match('/^location: \w+\?(.*)$/',$line, $match)) continue;

trocar o "L" maiusculo de Location para "l" minusculo

Enviado por Pedro Faria em Qua, 20/02/2008 - 12:41.

Caro Marlon,

Você pode só colocar o modificador i na expressão regular também.

Valeu pelo comentário.

Pedro.

Enviado por Insonia (não verificado(a)) em Sáb, 10/05/2008 - 13:30.

Olá, náo tem como criar um exemplo com o cep vindo do form e chamando as paginas e colocando o nome em cada página, pois não entendi bem se uso todo o codigo numa página só eu separa.

To bem leigo nesse esquema de calculo de frete

Enviado por Pedro (não verificado(a)) em Ter, 24/06/2008 - 14:53.

Warning: pfsockopen() [function.pfsockopen]: unable to connect to www.correios.com.br:80 (Connection timed out) in /var/www/vhosts/americanbrasil.com.br/httpdocs/site/correio.php on line 21
boa tarde, alguem sabe como resolvo esse prrobleminha com o script q eu peguei acima??
eu uso o php 5
Fatal error: Uncaught exception 'Exception' with message 'Connection timed out' in /var/www/vhosts/americanbrasil.com.br/httpdocs/site/correio.php:22 Stack trace: #0 /var/www/vhosts/americanbrasil.com.br/httpdocs/site/correio.php(50): calcula_frete('40010', '13140000', '13061100', '2') #1 {main} thrown in /var/www/vhosts/americanbrasil.com.br/httpdocs/site/correio.php on line 22

Enviado por Pedro Faria em Ter, 24/06/2008 - 15:02.

É PROVÁVEL que seu host nao permita fsockopen pra fora...

imagino que seja isso!