PHP: Script para Cálculo de Frete dos Correios
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 uma ferramenta online para cálculo de valores e tarifas de postagem para seus principais serviços, como Sedex, PAC, Malote, Encomenda Normal, etc. 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.
Como é o funcionamento dessa ferramenta, hoje ela funciona somente nos sites dos correios, porém pode ser acessada por qualquer um, inclusive por um script, e isso o que fazemos, acessamos a página de resultado, onde o frete é calculado, e capturamos somente o dado que nos é necessário, a tarifa da postagem. Para utilização, precisamos passar alguns parâmetros para essa página dos correios, 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, 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.
Bom, vamos ao que interessa, o script:
< ?php
############################################
# Código dos Serviços dos Correios
# FRETE PAC = 41106
# FRETE SEDEX = 40010
# FRETE SEDEX 10 = 40215
# FRETE SEDEX HOJE = 40290
# FRETE E-SEDEX = 81019
# FRETE MALOTE = 44105
# FRETE NORMAL = 41017
# SEDEX A COBRAR = 40045
############################################
// Código do Serviço que deseja calcular, veja tabela acima:
$cod_servico = 41017;
// CEP de Origem, em geral o CEP da Loja
$cep_origem = 93800000;
// CEP de Destino, você pode passar esse CEP por GET ou POST vindo de um formulário
$cep_destino = 11430000;
// Peso total do pacote em Quilos, caso seja menos de 1Kg, ex.: 300g, coloque 0.300
$peso = 1;
// URL de Consulta dos Correios
$correios = "http://www.correios.com.br/encomendas/precos/calculo.cfm?servico=".$cod_servico."&cepOrigem=".$cep_origem."&cepDestino=".$cep_destino."&peso=".$peso."&MaoPropria=N&avisoRecebimento=N&resposta=xml";
// Capta as informações da página dos Correios
$correios_info = file($correios);
// Processa as informações vindas do site dos correios em um Array
foreach($correios_info as $info){
// Busca a informação do Preço da Postagem
if(preg_match("/\
(.*)\< \/preco_postal>/",$info,$tarifa)){
// Quando encontra o valor da postagem, exibe na página formatando em padrão de moeda 10,89
print number_format($tarifa[1],2,',','.');
// Caso você não queira formatar, será exibido assim 10.89 e basta executar o comando abaixo
print $tarifa[1];
// Você utilizará um ou outro método acima para exibição dos dados
}
}
?>
.
Como sempre, eu disponibilizo o arquivo PHP do artigo aqui para Download.
Os parâmetros de configuração estão escritos no script do arquivo, mas podem também ser passados por GET ou POST, dependendo da sua necessidade de uso. A tarifa da postagem vem no formato 10.89 mas já inclui no script uma formatação para impressão no padrão da moeda brasileira, com (,) ou seja, exibindo o valor no formato 10,89.
Qualquer dúvida ou sugestão, escreva um comentário.


























05/10/2008 às 3:41
oi ! estou garimpando um código para Sedex já um tempo. e gostei desse . Só uma dúvida como eu coloco , instalo na minha pagina configurado para aparecer um local padronizado para colocar o cep e a quantidade do produto e aparecendo o resultado a baixo ? Como configuro isso na minha página ??
Eu inseri esse Script na página e só apareceu assim : 10,7010.7
Poderia me ajudar nisso ?
Obrigada !!
06/10/2008 às 9:51
Olá Katya,
Esse script é pré-configurado com o CEP do local de origem, então você tem q especificar no campo $cep_destino, o CEP que o usuário preencheu, dai na quantidade de produtos não é inclusa nesse script, aqui você só terá de multiplicar por exemplo o PESO de cada produto, caso seja mais de um, para ter um valor de peso aproximado para especificar, pois como você deve imaginar, o valor do frete varia conforme o peso.
Quanto ao valor retornado, você deve usar a função do PHP number_format() para usar a separação de , entre os valores, ou então só dar um print no valor que ficará com . separando as casas decimais. No teu caso, você imprimiu os 2 resultados, com formatação de moeda brasileira e sem, no caso ele imprimiu na pagina o valor 10,7010.7 que na verdade é 10,70 formatado e 10.7 valor padrão. Seguindo o script acima, como disse você opta em utilizar o valor formatado que está de exemplo na linha 32 do script, ou não formatado conforma linha 34.
Espero ter ajudado.
06/10/2008 às 20:28
Bem, minha dúvida é parecida com a de cima. Se puder me ajudar agradeço muito!
Fiz tudo do jeito que vc falou. Mas só aparece o valor 12,40.
Como faço pra colocar meu CEP peso, serviço e o CEP de destino para aparecer o valor correto do frete?
Fiz uma PG só pra mostrar o valor, estou pegando os valores pelo metodo POST a mas acho que não está dando certo…
Agradeço!!
06/10/2008 às 21:54
Olá Bruno, funciona da seguinte forma, na linha 15 do script especificado o código do serviço nos correios (um pouco mais acima tem em comentário o código de cada serviço), ali você especifica qual o serviço que você quer, Sedex, PAC, etc… Já nas linhas 17 e 19 você especifica os CEPs de destino e origem, e na linha 21 o peso em quilos. Quanto ao método post, você pode usar por exemplo se sua variavel passada por post do CEP de origem for $meu_cep, na linha 17 você deve colocar assim: $cep_origem = $_POST['meu_cep']; que receberá via POST o CEP postado… e assim por diante nas outras variaveis que você me perguntou.
06/10/2008 às 22:01
Muito obrigo Rodrigo, desculpe minha distração. =]
Mas deu certo mesmo… Fiz isso que vc falou:
Deu certinho… Só errei pq coloquei isso antes do
E nas linhas 17 a 19 eles estavam recebendo outros valores… Pura distração minha… =P
Muito obrigado pela contribuição…
Estas de parabéns!
Há, estou tentando colocar esse sistema em um site Oscommerce… Os bons são pagos e não estou afim de pagar. Só em último caso… =]
Abraços!!
Voltarei outras vezes!
06/10/2008 às 22:37
Uma dúvida que acabou de surgir. Posso saber qual o tempo de entrega do produto? Ou seja informar ao cliente o tempo de entrega determinado pelo Correio?
Obrigado!!!
07/10/2008 às 2:59
O que eu estou dizendo e como colocar para aparecer um campo padronizado para a pessoa que entrar no site se caso interessar, ela irar digitar o seu Cep para obter a sua informação que no caso e o valor que ira aparecer. ou - assim e só um Exemplo : )
http://i36.tinypic.com/j7tc1s.jpg E só para mostrar a parte para colocar o CEP entendeu ?
desculpa alguma coisa
07/10/2008 às 8:53
Bruno, bom, na questão de prazos, esse script não busca essa informação, até porque creio que o site dos correios não forneçam isso, creio que geralmente os sites fazem uma média de dias padrão para diferentes lugares/estados do pais.
Katya, esse script aqui é um script de calculo de frete, o formulário onde a pessoa vai preencher o CEP, etc… isso você tem que fazer, ele apenas busca a informação do valor no site dos correios conforme as variaveis de CEP, serviço e peso passados para esse script.
07/10/2008 às 17:16
Ok Rodrigo !! Agora e saber fazer esse bendito formulário
Você ajudou em muito Brigadão .
07/10/2008 às 18:03
Katya, você só precisa de um formulário simples de postagem do CEP, mas se você tem dificuldades de fazer um formulário ou não souber, faça uma procura no google para achar algum modelo.
Espero ter ajudado !!
30/11/2008 às 20:27
Ola Rodrigo !! O que eu gostaria de saber e se o código gera esse valor que está no script 10,89 ok
Eu pergunto como se coloca o valor correto da mercadoria para gerar o valor do frete certo?
Esse o script que esta ai e para eu copiar direto numa página, (ctrl c e ctrl v) ou enviar para dentro do meu servidor do site esse arquivo “frete_correios.php” que baixei aqui.
e se for isso enviar para o diretório do site qual e a tag que puxa esse sclipt para a pagina?
São tantas perguntas rss Já viu que sou leiga né
01/12/2008 às 7:14
Olá Cacau,
O valor que o script gera é baseado no site dos correios, calculado pelo tipo de serviço escolhido (sedex, pac, etc), peso da mercadoria, cep de origem e cep de destino.
Neste exemplo de script, não é necessário colocar o valor da sua mercadoria para gerar o frete, pois como mencionei acima, ele gera o valor do frete conforme os parametros que falei.
Quanto a copia e colar, sim o script deve funcionar corretamente, exceto em alguns servidores, que não permitem o uso do comando “file” em PHP. Mas creio que deva funcionar corretamente sim em seu servidor, caso não funcione me avise. Quanto ao incluir o arquivo frete_correios.php, creio que deva funcionar, porém como não conheço a lógica de funcionamento desta sua sacola de compras, não posso te afirmar com certeza, mas não custa tentar, faça os testes ai, e veja se funciona.
02/12/2008 às 10:29
Ok !! O estranho e se eu tenho uma mercado ria com um valor de Ex : $49,50 como os correios vai saber esse valor ? Se o meu cliente quer saber quanto custará o frete final (valor X peso) o cep do cliente = valor da mercadoria que ele irá pagar. Não sei se entendi errado ou certo e nem sei se estou explicando a minha dúvida correta rss espero que sim
02/12/2008 às 12:37
Olá Cacau, esse script aqui postado apenas faz o calculo de frete, a soma com o valor de seu produto, para gerar um total, etc isso você terá de fazer em seu site, esse script que fiz o artigo, apenas efetua o calculo do valor de frete consultando o site dos Correios informando o CEP de origem e destino, juntamente com o peso do produto(s) em questão. Não sei se você entendeu Cacau, mas esse script apenas calcula o frete.
03/12/2008 às 23:54
Desculpa a burrice da minha pergunta rsss.. Mais eu entendi sim Brigadão !! E valeu pelo script ele funciona perfeitamente