Calculando frete pelo site dos correios com PHP.
Uma das coisas mais utilizadas em qualquer tipo de loja virtual é o cálculo de frete, infelizmente o unico modo de faze-lo com 100% de certeza é pelo site dos correios, que disponibilizam uma url de consulta para isso.
Com o PHP conseguimos facilmente fazer esta consulta não esquecendo de que ela depende na sua maior parte do sistema dos correios estar funcionando sem problemas porém da parte do PHP utiliza-se somente funções que estão instaladas na maioria dos servidores como o simple XML.
Apesar de que nesta função vou só imprimir o valor do frete no caso PAC ou SEDEX em alguns casos da para pegar o prazo de entrega, porém como não utilizo esta função e pelo fato de nem todas as vezes receber esta informação não adicionei a sída dele neste exemplo.
Lembre-se que o código é somente um exemplo funcional de implementação:
$sCepDestino = htmlspecialchars($_GET['cep']); //LIMPA A VARIAVEL
$sCepDestino = str_replace("-", "", $sCepDestino); //REMOVE O - CASO POSSUA
//PEGA O TIPO DE FRETE E CONVERTE NO CODIGO
if ($_GET['tipo'] == "PAC") {
$nCdServico = 41106;
}
if ($_GET['tipo'] == "SEDEX") {
$nCdServico = 40010;
}
//DADOS PARA O CORREIO
$nCdEmpresa = "";
$sDsSenha = "";
$sCepOrigem = 36015000; //CEP DE ORIGEM
$nVlPeso = 1; //PESO É IMPORTANTE PARA O CALCULO
$nCdFormato = 1;
$nVlComprimento = 20;
$nVlAltura = 20;
$nVlLargura = 20;
$nVlDiametro = 0;
$sCdMaoPropria = "N";
$nVlValorDeclarado = 0;
$sCdAvisoRecebimento = "S";
//
// URL QUE FARÁ AS CONSULTAS NOS CORREIOS
$URLcorreios ="http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?"
."nCdEmpresa=$nCdEmpresa&"
."sDsSenha=$sDsSenha&"
."sCepOrigem=$sCepOrigem&"
."sCepDestino=$sCepDestino&"
."nVlPeso=$nVlPeso&"
."nCdFormato=$nCdFormato&"
."nVlComprimento=$nVlComprimento&"
."nVlAltura=$nVlAltura&"
."nVlLargura=$nVlLargura&"
."sCdMaoPropria=$sCdMaoPropria&"
."nVlValorDeclarado=$nVlValorDeclarado&"
."sCdAvisoRecebimento=$sCdAvisoRecebimento&"
."nCdServico=$nCdServico&"
."nVlDiametro=$nVlDiametro&"
."StrRetorno=xml";
//PEGAMOS OS DADOS DE RETORNO XML COM O SIMPLEXML DO PHP
$dados_correios = simplexml_load_file($URLcorreios);
$total = $dados_correios->xpath('cServico/Valor');
$total = floatval(str_replace(',', '.', $total[0]));
$PrazoEntrega = $dados_correios->xpath('cServico/PrazoEntrega');
$erros = $dados_correios->xpath('cServico/Erro');
$ValorAvisoRecebimento = $dados_correios->xpath('cServico/ValorAvisoRecebimento');
//
//IMPRIME A RESPOSTA COM O VALOR DO FRETE
$resposta[valor] = number_format($total, 2, ',', '.');
print_r($resposta[valor]);
Primeiro eu limpei a variável do cep e removi o traço se ele existir, depois peguei o segundo argumento com o tipo do frete, no momento o cálculo é somente com SEDEX e o PAC. Os dados seguintes são auto explicativas, no caso do PAC ele usa mais algumas como largura , comprimento etc. O Peso é muito importante para o cálculo pois dependendo do peso do produto o frete fica mais caro e um peso muito grande o SEDEX não suporta.
Na próxima parte definimos a url que será enviada para os correios e retiramos os dados da url de retorno usando o Simple XML do PHP e retiramos o que nos importa que é o valor do frete. Neste exemplo eu somente imprimi este valor que é o que precisamos.
Espero que este código ajude quem esta procurando um modo simples de calcular o frete pelo site dos correios, lembre-se que as implementações de segurança é de responsabilidade sua.
Atualização:
Alterado a url de acesso aos correios, agora o script funciona direto sem necessidade de alteração.