Função simples para cálculo de frete a partir do site dos correios
Escrito por
Edgar Serra em 17 de Novembro de 2009 às 14:58.
Arquivado em PHP Dicas.
Vou mostrar uma função simples para o cálculo de frete a partir do site dos correios. Essa função usa o próprio webservice dos correios que disponibiliza o retorno em XML, ficando assim fácil parsear e sem as gambiarraas que muita gente usa.
A função é a seguinte:
function frete($cep_origem, $cep_destino, $servico, $peso, $valor_declarado){
$correios = html_entity_decode( file_get_contents('http://www.correios.com.br/encomendas/precos/calculo.cfm?resposta=xml&servico='. $servico. '&cepOrigem='. $cep_origem .'&cepDestino='. $cep_destino .'&peso='. $peso. '&valorDeclarado='. $valor_declarado));
$frete = simplexml_load_string($correios);
if($frete->erro->codigo == '0'){
echo 'Valor da tarifa: '.$frete->dados_postais->preco_postal;
}else{
echo 'Erro: '.$frete->erro->descricao;
}
}
Ela é muito simples, por isso não vou ficar me atendo a explicar, só vale ressaltar que nesse exemplo foi usado o file_get_contents, logo allow_url_fopen deve estar ativa no servidor, se não estiver ai tem que partir pra cURL. Também foi usado o simpleXML para parsear a resposta do webservice dos correios, logo, isso também tem que estar ativo no servidor.
Os códigos de serviço, atualmente usados pelos correios são:
41106 = PAC
40010 = Sedex
40290 = Sedex Hoje
40215 = Sedex 10
40045 = Sedex a Cobrar
Exemplo de uso da função:
frete('97032120','01102000','40215','2','15');
Onde:
97032120: CEP de origem
01102000: CEP de destino
40215: Código do serviço
2: Peso
15: Valor declarado
O CEP pode ser passado no formato 00000-000 ou 00000000. Se o peso for inferior a 1 kg deve estar no formato 0.0, ou seja 0.1 é 100 gramas, 1 é 1 quilo. Se o valor for inferior a R$1,00 o procedimento é o mesmo do peso. O valor declarado é obrigatório para sedex a cobrar, se for usar outra modalidade e não desejar declarar valor use 0.
Mais simples impossível. Só lembre-se, o webservice dos correios as vezes fica instável, logo, se for implementar isso em um sistema seu crie uma rotina para verificar se ele está disponível no momento ou não.
Até a próxima.