Atualizado em 05 de Maio de 2014

Calcular Valor Frete PAC e Sedex com PHP

Olá pessoal,

Uma das grandes dúvidas quando criamos uma Loja Virtual (e-commerce) e como Calcular o Valor do Frete para enviar os produtos para os clientes.

Neste post vamos ver como fazer este calculo gerando valores para PAC e Sedex direto do Webservice dos Correios, e vamos disponibilizar o link da documentação oficial de utilização do mesmo.

Observação: Não deixem de conferir o Curso Criando Loja Virtual com PHP.

Neste Webservice existem três métodos, são eles:
  • CalcPrecoPrazo
  • CalcPrazo
  • CalcPreco

Os nomes deles já demonstram sua utilidade. ;)

Vamos ao script do Calculo do Valor do Frete:

<?php
$parametros = array();

// Código e senha da empresa, se você tiver contrato com os correios, se não tiver deixe vazio.
$parametros['nCdEmpresa'] = '';
$parametros['sDsSenha'] = '';

// CEP de origem e destino. Esse parametro precisa ser numérico, sem "-" (hífen) espaços ou algo diferente de um número.
$parametros['sCepOrigem'] = '96010140';
$parametros['sCepDestino'] = '02460000';

// O peso do produto deverá ser enviado em quilogramas, leve em consideração que isso deverá incluir o peso da embalagem.
$parametros['nVlPeso'] = '1';

// O formato tem apenas duas opções: 1 para caixa / pacote e 2 para rolo/prisma.
$parametros['nCdFormato'] = '1';

// O comprimento, altura, largura e diametro deverá ser informado em centímetros e somente números
$parametros['nVlComprimento'] = '16';
$parametros['nVlAltura'] = '5';
$parametros['nVlLargura'] = '15';
$parametros['nVlDiametro'] = '0';

// Aqui você informa se quer que a encomenda deva ser entregue somente para uma determinada pessoa após confirmação por RG. Use "s" e "n".
$parametros['sCdMaoPropria'] = 's';

// O valor declarado serve para o caso de sua encomenda extraviar, então você poderá recuperar o valor dela. Vale lembrar que o valor da encomenda interfere no valor do frete. Se não quiser declarar pode passar 0 (zero).
$parametros['nVlValorDeclarado'] = '200';

// Se você quer ser avisado sobre a entrega da encomenda. Para não avisar use "n", para avisar use "s".
$parametros['sCdAvisoRecebimento'] = 'n';

// Formato no qual a consulta será retornada, podendo ser: Popup é mostra uma janela pop-up - URL é envia os dados via post para a URL informada - XML é Retorna a resposta em XML
$parametros['StrRetorno'] = 'xml';

// Código do Serviço, pode ser apenas um ou mais. Para mais de um apenas separe por virgula.
$parametros['nCdServico'] = '40010,41106';


$parametros = http_build_query($parametros);
$url = 'http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx';
$curl = curl_init($url.'?'.$parametros);
 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$dados = curl_exec($curl);
$dados = simplexml_load_string($dados);

foreach($dados->cServico as $linhas) {
  if($linhas->Erro == 0) {
   echo $linhas->Codigo.'</br>';
   echo $linhas->Valor .'</br>';
   echo $linhas->PrazoEntrega.' Dias </br>';
  }else {
   echo $linhas->MsgErro;
  }
  echo '<hr>';
 }
?>

Download do script Clique aqui. Este script e de grande utilidade, aproveitem.

Para ver a documentação completa do Webservice dos correios clique aqui.


Gostou do post, continue por dentro das dicas de programação!!! Assine a newsletter.


E isso aí pessoal, até a próxima.

Tags:  Funções | PHP

Comentários

Sua foto do perfil

Roberto Marques

Quando tudo parece perdido e você não encontra nada que presta na internet a gente acha Maurício Programador a LUZ com seus códigos perfeitos e funcionais. Cara, Parabéns mesmo! e dizer que você é o cara nem precisa, acho que você ouve isso sempre, então muito abrigado por compartilhar abraço!

02 de Fevereiro de 2016 - 07:59

Sua foto do perfil

Mauricio Programador

Olá Roberto,

Obrigado pelas suas palavras. Fico feliz em poder ajudar.

E agora este ano (2016), vou começar com os Posts em Vídeo que acho que vai ser muito melhor do que textos para ajudar a comunidade do PHP.

Grande Abraço.

05 de Fevereiro de 2016 - 15:15

Sua foto do perfil

Jorge Fernandes Rezende Júnior

Boa tarde.

Esta solução funcionou perfeitamente para o projeto que estou criando. Agradeço muito.

Para melhor aproveitamento desse sistema em meu site, criei uma classe e a disponibilizei no github.
https://github.com/jorgejr568/freteCalculator

Novamente, obrigado.

23 de Janeiro de 2016 - 15:07

Sua foto do perfil

Mauricio Programador

Olá Jorge,

Obrigado pelo compartilhamento conosco.

Abraço.

25 de Janeiro de 2016 - 14:59

Sua foto do perfil

marcelo pessoa

Olá Mauricio, bom dia! Tenho um cliente que deseja colocar em seu site um calculador de fretes, mas a grande maioria de seus produtos são bem superiores no peso limite de 30 kg usado pelos correios, vc tem algum modelo de calculador de fretes que faça o calculo para produtos acima de 100 kg. Agradeço desde já sua atenção!

22 de Setembro de 2015 - 10:44

Sua foto do perfil

Mauricio Programador

Olá Marcelo,

Não tenho, mas vou dar uma procurada e criou um post sobre isso.

Abraço.

28 de Setembro de 2015 - 09:28

Sua foto do perfil

João Bosco

Muito Obrigado Mauricio pelo script, aqui funcionou belezinha, mas tenho uma dúvida. Por que o script funciona sem o código e a senha da empresa? E se funciona sem esses dados, por que então adiquirir esse código e senha?

Abraços.

04 de Setembro de 2015 - 04:05

Sua foto do perfil

Mauricio Programador

Olá João,

Na verdade quando você faz o convenio com os correios para receber o código e senha você adquiri outros benefícios como suporte entre outros.

Dependendo da situação isso pode ser interessante.

Abraço.

04 de Setembro de 2015 - 11:11

Sua foto do perfil

Celso

Olá, eu estou com um sério problema, um exemplo:
Eu tenho um cliente que possui vários produtos relativamente pesados e grandes...
Ele enviará pelos correios, pois todos os produtos atendem as especificações básicas dos correios.
Mas aí entra o meu problema, como fracionar o cálculo do frete, ou seja, se meu cliente possuir no carrinho 5 produtos com 30Kg cada e quiser saber o valor do frete? como resolver este problema?

07 de Agosto de 2015 - 16:45

Sua foto do perfil

Mauricio Programador

Olá Celso,

Se quiser ver o valor do frete em separado, basta fazer a chama do frete cinco vezes, uma para cada produto.

Assim você obtém o valor em separado.

Abraço.

10 de Agosto de 2015 - 10:22

Sua foto do perfil

Celso

Olá, Maurício, o que eu estou em dúvida não é isso, em relação ao frete separado, mas sim em relação ao frete unificado.

Ou seja.

Suponhamos que o cliente (comprador), está no site e seleciona 5 produtos, no carrinho eu preciso informar o valor do frete para estes 5 produtos (um único valor para todos).

Como eu realizo este cálculo por volume? ou seja, o valor do frete para todos os produtos.

Exemplo de caso:
Produto 01: 15 Kg
Produto 02: 30 Kg
Produto 03: 7 Kg
Produto 04: 8 Kg
Produto 05: 30 Kg

No total deste exemplo, os produtos, como um todo, ultrapassam o limite permitido pelos correios (30 KG).
Porém o cliente estará no fechamento do carrinho e se juntarmos os pesos de:
Produto 01 + Produto 03 + Produto 04 = 30 Kg, ficaria mais coerente e próximo do resultado real do que se fizer estes cálculos separados e depois somar tudo não é mesmo?

14 de Agosto de 2015 - 09:23

Sua foto do perfil

Mauricio Programador

Celso,

entendi, mas como você disse existe um limite então você terá que criar uma regra no seu script para ele somar os pesos dos produtos até os 30kg, e depois disso consultar. Depois você soma os que faltaram e vai ter que fazer a soma final.

Vai ser um trabalho maior, mas é um caminho.

Abraço.

14 de Agosto de 2015 - 09:25

Sua foto do perfil

Celso

Olá, Mauricio, você tem algum exemplo a ser seguido para fazer este tipo de cálculo?

E neste tipo de cálculo, a idéia é pegar depois as vezes que se repetiu e realizar solicitações...como no meu exemplo:

Exemplo de caso:
Produto 01: 15 Kg
Produto 02: 30 Kg
Produto 03: 7 Kg
Produto 04: 8 Kg
Produto 05: 30 Kg

A soma de tudo daria 90 o que seria dividido em 3x, correto?

Eu teria que fazer 3 solicitações ao webservice?

17 de Agosto de 2015 - 10:39

Sua foto do perfil

Mauricio Programador

Olá Celso,

Não tenho nenhum exemplo mostrando isso.

Mas você pode sim fazer as três solicitações. Some tudo que ter de peso, e divida e depois faz um FOR para fazer as solicitações no Webservice.

Abraço.

17 de Agosto de 2015 - 10:40

Sua foto do perfil

Junior

Professor mauricio eu comprei o curso de loja virtual, muito bom mesmo ! Eu queria implementar esse calculo de frete ! Mas onde e como eu implemente esse script ? da uma força ai?

16 de Junho de 2015 - 11:25

Sua foto do perfil

Mauricio Programador

Olá Junior,

você pode fazer as perguntas referente ao curso lá na sua área do aluno, pois lá respondo mais rapidamente.

Quanto a sua dúvida e bem simples implementar, basta criar mais uma sessão com o nome cep. Depois quando você obtiver o CEP do usuário (seja ele digitando o CEP no site ou pegando no cadastro dele quando ele se loga), você faz esta busca que esta no POST e salva o valor retornado na sessão do CEP.

Caso não consiga envia a sua pergunta via área do aluno.

Abraço.

22 de Junho de 2015 - 10:05

Sua foto do perfil

Tarcisio

Ola no CEP 08030720 esta ocorrendo um erro...

O CEP de destino está sujeito a condições especiais de entrega pela ECT e será realizada com o acréscimo de até 7 (sete) dias ao prazo regular.
O CEP de destino está sujeito a condições especiais de entrega pela ECT e será realizada com o acréscimo de até 7 (sete) dias ao prazo regular.

O que pode ser feito? não faço a minima o q pode estar acontecendo. Alguem sabe o que pode ser?

23 de Dezembro de 2014 - 09:14

Sua foto do perfil

Mauricio Programador

Olá Tarcisio,

Não e erro, para alguns CEP os correios não tem valor fixo, como e o caso do CEP informado.

Abraço.

23 de Dezembro de 2014 - 09:36

Sua foto do perfil

Tarcisio

Sim, ha um erro, e numero dele é 010, muitas plataformas de e commerce criam "correções" para esses caso.

eu só gostaria que já tivesse algum pronto...

26 de Dezembro de 2014 - 12:44

Sua foto do perfil

Mauricio Programador

Tarcisio,

pode ser, mas neste caso não foi criado nenhum tipo de tratamento para exceções.

Abraço.

26 de Dezembro de 2014 - 12:44

Sua foto do perfil

Juliano

Olá Maurício! Parabéns pelo tuto. Nos meus testes, dá erro quando o peso ultrapassa 5kg... Tá certo isso? Obrigado pela atenção!

25 de Julho de 2014 - 17:09

Sua foto do perfil

Mauricio Programador

Olá Juliano,

Não ta certo, até fiz o teste aqui agora e deu certo, qual erro mostra ai?

abraço.

28 de Julho de 2014 - 11:00

Sua foto do perfil

Daniel Soares

Boa tarde Maurício, tudo bem? Primeiramente gostaria de parabenizá-lo pelas dicas e cursos - inclusive adquiri recentemente o curso Loja Virtual. Aproveito a oportunidade para perguntar se houve alguma alteração/atualização no webservice dos correios para essa função de cálculo de frete, pois utilizando o script acima não houve o retorno de qualquer informação. Se for possível você puder disponibilizar um link com um exemplo prático ficaria muito agradecido. Um grande abraço!

14 de Julho de 2014 - 14:13

Sua foto do perfil

Mauricio Programador

Olá Daniel,

Tudo bem e com você?
Agradeço pelas palavras e fico muito feliz que estas gostando ;)

Eu testei aqui o script novamente e esta funcionando, devolveu os valores normalmente, ele mostra algum erro ai para você?

Verifique se o CEP passado e válido.

Abraço.

15 de Julho de 2014 - 09:19

Sua foto do perfil

Daniel Soares

Maurício, MUITO obrigado pelo retorno mais que rápido! Tive uma luz aqui e resolvi testar o seu arquivo no servidor da agência...e funcionou! Meus testes ontem foram no meu servidor. Com certeza algo relacionado a versão de php/apache né? Dados de ambos:

Meu servidor (não funcionou): Versão cPanel 11.42.1 (build 16) / Tema x3 / Versão Apache 2.2.27 / Versão PHP 5.3.27 / Versão MySQL 5.1.73-cll

Da agência (funcionou): cPanel Version 11.42.1 (build 21)/ Theme x3 / Apache version 2.2.26 / PHP version 5.2.17 / MySQL version 5.5.33-31.1

Existe algo que pode ser feito? Digo isso pois será um site hospedado no meu servidor. E já considerando que irá me salvar - rs - , eu gostaria que o resultado do cálculo fosse enviado via post para uma outra url ( vou integrá-lo com o prettyphoto ). Como ficaria o código?

Novamente, o meu MUITO OBRIGADO!

Obs.: Sua vídeo aula é fantástica!

16 de Julho de 2014 - 12:33

Sua foto do perfil

Mauricio Programador

Obrigado pelas palavras Daniel.

Olha quanto ao servidor eu não acredito que seja ele que esteja dando problema, pois isso são informações vindas de um Webservice.

Você usou o mesmo arquivo igualzinho nos dois?

Se você for usar outra URL pode enviar via GET que fica mais prático.

Abraço.

16 de Julho de 2014 - 12:34

Sua foto do perfil

Daniel Soares

Grande Maurício! Obrigado novamente! Então, utilizei o mesmo arquivo em ambos. Infelizmente no meu não funciona ( a página fica em branco - não é exibida qualquer mensagem de erro ). Eu vi um problema semelhante onde a causadora era uma permissão do arquivo php.ini ( allow_url_fopen = 0 ). Vou tentar e ver que bicho dá rs. Se você achar que faz sentido e puder me orientar em uma solução nessa linha, me salvaria!

Muito obrigado!!!

Abraços

17 de Julho de 2014 - 10:19

Sua foto do perfil

Mauricio Programador

Qual servidor de hospedagem você usa?

17 de Julho de 2014 - 10:23

Sua foto do perfil

Daniel Soares

É de um amigo: http://www.provedor.pro.br/

O meu teste que funcionou foi em uma hospedagem HostGator.

Não sei se ajuda, mas segue as informações de cURL do meu servidor:

curl

cURL support enabled
cURL Information 7.24.0
Age 3
Features
AsynchDNS No
Debug No
GSS-Negotiate No
IDN Yes
IPv6 Yes
Largefile Yes
NTLM Yes
SPNEGO No
SSL Yes
SSPI No
krb4 No
libz Yes
CharConv No
Protocols dict, file, ftp, ftps, gopher, http, https, imap, imaps, pop3, pop3s, rtsp, smtp, smtps, telnet, tftp
Host i686-pc-linux-gnu
SSL Version OpenSSL/0.9.8b
ZLib Version 1.2.3

Se precisar de alguma informação adicional me avise! Obrigado pela paciência rs.

Grande abraço!

21 de Julho de 2014 - 15:28

Sua foto do perfil

Mauricio Programador

Olha amigo realmente não sei o que pode estar acontecendo, pois todos os servidores que tenho de teste funcionam perfeitamente.

Desculpe não saber como ajudar neste problema. :,(

Abraço.

21 de Julho de 2014 - 15:29

NEWSLETTER

Receba dicas de programação
em seu e-mail

TWITTER

Acompanhe tudo o que rola
com Mauricio Programador

NEWSLETTER