PHP: Script para Cálculo de Frete dos Correios (Atualizado)
Um dos grandes problemas de quem está pensando em montar uma Loja Virtual (e-Commerce) é o tal do cálculo de frete, isso dava uma dor de cabeça enorme para os desenvolvedores, pois para quase qualquer procedimento de compra online, o frete é vital, e necessita ser calculado e adicionado ao valor total que o cliente irá pagar.
Há algum tempo atrás, o site dos Correios disponibilizou um WebService para cálculo de valores e tarifas de postagem para seus principais serviços, como Sedex e PAC. No momento em que essa ferramenta foi disponibilizada, nos facilitou a vida, pois tínhamos uma forma funcional e com valores corretos para cálculo, e não como se utilizava há tempos atrás com um valor aproximado, muitas vezes maior do que realmente a postagem custava.
Para utilização, precisamos passar alguns parâmetros que são obrigatórios para que o WebService nos dê um retorno bem sucedido, que são o CEP de Origem, que no caso deve ser o da Loja Virtual, o CEP de Destino, que será o da pessoa que está comprando na Loja por exemplo, e o Peso total da encomenda (em Quilos, no caso se o peso for menos que 1Kg, deve se usar “0.3″ por exemplo para representar 300g), juntamente com o Código do Serviço de envio que será utilizado, no caso Sedex, PAC, Sedex 10, etc… Esses códigos dos tipos de serviços estão disponíveis junto no script, além disso é necessário informar as dimensões do pacote, no caso deste script ele já vem com valores de uma embalagem padrão, mas é recomendável que se ajuste conforme o cálculo.
Código dos Serviços
- 41106: PAC
- 40010: SEDEX
- 40045: SEDEX a Cobrar
- 40215: SEDEX 10
Código da Função de Cálculo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?php function calcula_frete($servico,$CEPorigem,$CEPdestino,$peso,$altura='4',$largura='12',$comprimento='16',$valor='1.00'){ //////////////////////////////////////////////// // Código dos Serviços dos Correios // 41106 PAC // 40010 SEDEX // 40045 SEDEX a Cobrar // 40215 SEDEX 10 //////////////////////////////////////////////// // URL do WebService $correios = "http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?nCdEmpresa=&sDsSenha=&sCepOrigem=".$CEPorigem."&sCepDestino=".$CEPdestino."&nVlPeso=".$peso."&nCdFormato=1&nVlComprimento=".$comprimento."&nVlAltura=".$altura."&nVlLargura=".$largura."&sCdMaoPropria=n&nVlValorDeclarado=".$valor."&sCdAvisoRecebimento=n&nCdServico=".$servico."&nVlDiametro=0&StrRetorno=xml"; // Carrega o XML de Retorno $xml = simplexml_load_file($correios); // Verifica se não há erros if($xml->cServico->Erro == '0'){ return $xml->cServico->Valor; }else{ return false; } } ?> |
Exemplo de Uso:
1 2 3 | <?php echo calcula_frete('40010','93800000','90200210 ','0.5'); ?> |
.
Como sempre, eu disponibilizo o arquivo PHP do artigo aqui para Download.
Qualquer dúvida ou sugestão, escreva um comentário.







CodeIgniter e MVC – Parte 01 MVC: Conceito e Funcionamento.
10 Melhores dicas para WordPress
Nova colunista acaba de chegar para falar de WordPress
Grátis: API de CEPs para qualquer Linguagem
Confira o Podcast webARTz, com vários assuntos abordados aqui no blog. Utilize os links abaixo para baixar os arquivos.



Comentários (10)
Trackbacks/Pingbacks (0)
1ºJonatas de Souza escreveu:
Bom dia, tudo bem? veja se pode me ajudar.
Porque nos campos abaixo não aceita Post ou GET
Qual o nome do resulta em php tipo
Abraços
2ºRodrigo Luis escreveu:
Olá Jonatas,
Pode repetir sua pergunta ?? Pois não veio campos no seu comentário.
3ºJonatas de Souza escreveu:
Bom dia, tudo bem? veja se pode me ajudar.
Porque nos campos abaixo não aceita Post ou GET
echo calcula_frete(’40010′,’93800000′,’90200210 ‘,’0.5′);
Qual o nome do resulta em php tipo
echo $frete
Abraços
4ºRodrigo Luis escreveu:
Olá Jonatas,
Ele aceita sim, tanto POST quanto GET, talvez a forma com que você está declarando eles na hora de fazer o uso da função “calcula_frete” que está errado.
O ideal neste caso é antes da função você declarar uma variável com o valor deste GET ou POST, exemplo abaixo:
$cep_origem = $_GET['cep1'];
$cep_destino = $_GET['cep2'];
calcula_frete(’40010′,$cep_origem,$cep_destino,’0.5′);
Teste ai por gentileza.
5ºAtanaildo escreveu:
Olá bom dia.
Primeira mente muito obg pelo post, estive procurando isso por muito tempo.
bom o codigo funciona se eu pegar a url q ele gera e colar no navegador, ou seja ele me retorna os valores. Mas quando eu coloco no script php ele me retorna esses erros.
Warning: simplexml_load_file(http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?
nCdEmpresa=&sDsSenha=&sCepOrigem=93800000&sCepDestino=90200210%20&nVlPeso=0.5&
nCdFormato=1&nVlComprimento=16&nVlAltura=4&nVlLargura=12&sCdMaoPropria=n&
nVlValorDeclarado=1.00&sCdAvisoRecebimento=n&nCdServico=40010&nVlDiametro=0&StrRetorno=xml) [function.simplexml-load-file]: failed to open stream: Uma operação de soquete foi tentada em uma rede inacessível. in D:DropboxNotebook atanaildolojaadminpaginascadastrarprodutos.php on line 21
Notice: Trying to get property of non-object in D:DropboxNotebook atanaildolojaadminpaginascadastrarprodutos.php on line 23
Você poderia me informa oq pode está acontecendo??
6ºRodrigo Luis escreveu:
Olá Atanaildo,
Verifique seu phpinfo() e php.ini, pois pode ser que você não está conseguindo rodar o comenado “simplexml_load_file”.
7ºAtanaildo escreveu:
Boa tarde,
Rodrigo eu vi seu comentario a resolvi enviar a pagina para o meu servidor e nele funciono perfeitamente oq q quer dizer q o problema está no meu wamp q ñ está rodando o comando como vc falo. Eu já tentei de tudo para mudar e fazer funcinar mais não consigo se vc tiver uma dica de como posso fazer para funcionar eu agradeço.
Obg, vlw msm
8ºRodrigo Luis escreveu:
Olá Aranaildo,
Como o uso do XML necessita o carregamento de algumas bibliotecas no PHP, seria ideal você procurar no Google qual a biblioteca necessária para rodar o “simplexml_load_file” no Wamp, possivelmente você terá de fazer ajustes no arquivo “php.ini” do Wamp.
9ºAtanaildo escreveu:
Rodrigo mais uma vez obg pelas informações eu testei um script aqui com um xml ma mesma pasta em q o arquivo php com o script está e funciono srsrsrs bom já não sei mais oq fazer mais vou dá uma googada um pouco mais aqui se achar a resposta posto aqui talvez mais pessoas possam ter esse msm problema com o wamp.
vlw
10ºClaudio escreveu:
Muito útil…obrigado.