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

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+\?(.*)$/',$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+

Categoria: