Carrinho Compras – Calcular Valor Do Frete

Há algumas semanas atrás, comentamos sobre carrinho de compras, porém, atendendo a pedidos dos visitantes do webmaster.pt, hoje falaremos mais sobre este assunto.

Uma das maiores dificuldades de quem trabalha com vendas através da Internet é a “cobrança de preço justo”. Isto é: Alguns compradores estão na mesma cidade onde a empresa ou o vendedor estão, outros estão em outros Estados ou Países!

Se você for analisar a situação, nada mais justo que o Internauta que mora em outro Estado ou País pagar um pouco mais caro, concorda comigo?

Analisei na Internet sobre este assunto e pouco se fala sobre este assunto! O pouco que falam é cópia um do outro, importando às outras soluções os mesmos erros e dúvidas!

Por este motivo, nosso foco de hoje será elaborar script que calcule o valor do frete (para você posteriormente implementar no carrinho de compras).

Como de costume, no final de nossa matéria, disponibilizamos o código fonte para testes.

Como Funciona A Busca?

Antes de pensarmos em programar, o ideal é sabermos como o script funciona este script!

Nosso trabalho será apenas o de capturar os dados principais através do formulário, tratá-los junto ao site dos correios e em seguida, retornar em tela a informação necessária às suas atividades!

Descreverei abaixo qual a finalidade dos campos principais (que deverão passar suas informações ao site dos correios através do método GET):

nCdServico: Hoje um dos mais usados é o “40010″, porém, baseado nos exemplos abaixo, você pode alterar conforme sua necessidade.

  • 40215 – SEDEX 10
  • 40010 – SEDEX CONVENCIONAL
  • 40096 – SEDEX
  • 40045 – SEDEX A COBRAR
  • 40290 – SEDEX HOJE
  • 41017 – Encomenda Normal

sCepOrigem: Neste campo você poderá passar ao formulário o CEP de onde será retirado o produto a ser enviado.

sCepDestino: Através deste campo seu cliente poderá informar o CEP para onde será entregue o produto.

nVlPeso: Deverá ser apresentado (pelo administrador do site) o peso do produto.

OBS.: deverá ser usado peso máximo de 30. Caso haja necessidade de separar as casas decimais, deverá usar por exemplo 0.2

Bem… existem outros campos que você trará o resultado, mas… chega de teoria, né? Vamos agora à parte prática!

Através dos códigos abaixo você poderá trazer em tela as informações necessárias para implementar seu carrinho de compras.

Veja o código da página “index.php”:



<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>:: WebMaster.PT - Implementando um Carrinho de Compras ::</title>
<style type="text/css">

* {
font-family:"Trebuchet MS","Lucida Grande",Verdana,Tahoma,Helvetica,Arial,sans-serif;
font-size:12px;
font-style:normal;
font-variant:normal;
font-weight:normal;
line-height:normal;
}

body {
background:#FFFFFF none repeat scroll 0 0;
height:100%;
margin:0;
margin-top:20px;
width:100%;
}

div#wrapper {
margin:auto;
position:relative;
width:450px;
z-index:0;
}

.formMain .select {
text-transform:uppercase;
width:99%;
border:1px solid #B6B6B6;
display:block;
}

.formSearch fieldset {
border:1px solid #CCCCCC;
margin:0;
padding:0 10px;
}implementando-um-c

.formMain label {
display:block;
float:left;
margin-right:4px;
padding-bottom:5px !important;
}

.formMain legend {
color:#1E398D;
font-family:"Legacy Sans ITC TT Bold","Trebuchet MS","Lucida Grande",Verdana,Tahoma,Helvetica,Arial,sans-serif;
font-size:1.5em;
padding:10px 5px;
}

.formMain .button {
background:#F5EED3;
border:1px solid #CCCCCC;
color:#666666;
cursor:pointer;
font-size:12px;
font-weight:bold;
letter-spacing:1px;
margin:10px 0 0;
overflow:visible;
text-transform:uppercase;
width:100%;
}implementando-um-c

.formMain .inline {
margin:15px 0 0 !important;
}

.formMain .text, .formMain .select, .formMain .textarea, .formMain .password {
border:1px solid #B6B6B6;
display:block;
text-transform:uppercase;
}

.formMain fieldset span.nameField {
color:#666666;
text-transform:uppercase;
}

h3 {
border-bottom:1px solid #F58220;
margin:0;
padding:0;
}

h3 span {
-x-system-font:none;
color:#1E398D;
font-family:"Legacy Sans ITC TT Bold","Trebuchet MS","Lucida Grande",Verdana,Tahoma,Helvetica,Arial,sans-serif;
font-size:1.5em;
font-style:normal;
font-variant:normal;
font-weight:bold;
line-height:normal;
}

#value {
-x-system-font:none;
color:#9B0000;
font-family:"Legacy Sans ITC TT Bold","Trebuchet MS","Lucida Grande",Verdana,Tahoma,Helvetica,Arial,sans-serif;
font-size:1.5em;
font-style:normal;
font-variant:normal;
font-weight:bold;
line-height:normal;
}
</style>

</head>
<body>
<div id="wrapper">
<h3>
<span>Pesquisa valor de frete</span>

</h3>
<form id="form-pesquisa-repasse" action="calcularFrete.php" method="post" class="formMain formSearch wsizep100" onsubmit="submitForm(this); return false;">
<fieldset>
<legend>Filtrar Referência</legend>
<label for="servico" class="wsize015">
<span class="nameField">Envio</span>
<select id="servico" name="servico" title="Serviços dos Correios" class="select" tabindex="1">
<option value="41106">PAC</option>
<option value="40010">SEDEX</option>
</select>
</label>
<label class="wsize010" for="cep-destino">
<span class="nameField">CEP Destino</span>
<input id="cep-destino" class="text" type="text" value="" maxlength="9" title="CPF destino" name="cep-destino" tabindex="2"/>implementando-um-c
</label>
<label for="pesquisar" class="wsize010">
<input type="submit" id="pesquisar" name="pesquisar" tabindex="3" class="button inline"  value="Pesquisar" />
</label>
</fieldset>
</form>
<span>* Digitar somente número no CEP</span>
<br />
<span id="value"></span>
</div>
<script src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.3/prototype.js" type="text/javascript"></script>
<script type="text/javascript">
function submitForm(form) {
form.request({
onComplete: function(transport){

if(transport.responseText !=-1)  {
$('value').innerHTML = transport.responseText;
} else {
form.reset();
$('value').innerHTML = 'Erro ao consultar';
}
}
});
return false;
}

</script>
</body>
</html>

Página Inicial

OBS.: Como você pode ver, o código acima não está limpo!

Nossa finalidade principal é apresentar a qualidade disponível no script que tratará as informações!

Veja abaixo como vai ficar a página “calcularfrete.php”


<?php

// Peso total do pacote em Quilos, caso seja menos de 1Kg, ex.: 300g, coloque 0.300
define('PESO',2.00);
define('EMBALAGEM',0.00);

// Valor adicional no envio como custo de embalagem.
define('COMPRIMENTO',20);
define('ALTURA',15);
define('LARGURA',20);

if($_POST) {
// Código do Serviço que deseja calcular, veja tabela acima:
if ($_POST['servico']) {
$cod_servico = $_POST['servico'];
}
// CEP de Origem, em geral o CEP da Loja
$cep_origem = '13060-854';

// CEP de Destino, você pode passar esse CEP por GET ou POST vindo de um formulário
$cep_destino = $_POST['cep-destino'];
$cep_destino = eregi_replace("([^0-9])","",$cep_destino);

// URL de Consulta dos Correios
$correios = "http://shopping.correios.com.br/wbm/shopping/script/CalcPrecoPrazo.aspx?StrRetorno=xml&nCdServico={$cod_servico}&nVlPeso=" . PESO . "&sCepOrigem={$cep_origem}&sCepDestino={$cep_destino}&nCdFormato=1&nVlComprimento=" . COMPRIMENTO . "&nVlAltura=" . ALTURA . "&nVlLargura=" . LARGURA;

// 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("/\<Valor>(.*)\<\/Valor>/",$info,$tarifa)) {

$total = $tarifa[1] + EMBALAGEM;
}
if(preg_match("/\<PrazoEntrega>(.*)\<\/PrazoEntrega>/",$info,$PrazoEntrega)) {implementando-um-c
$PrazoEntrega = $PrazoEntrega[1];
}
}

// Neste exemplo estamos usando apenas PAC e SEDEX. Caso seja necessário, utilize outras opções.
switch ($cod_servico) {
case 41106:
$nome_servico = " PAC ";
break;
case 40010:
$nome_servico = " SEDEX ";
break;
}

// Caso venha valor de resposta é numerio e maior que o custo da embalagem senão ocorreu algum erro na solicitação.
if(is_numeric($total) and ($total > $embalagem)) {

// Quando encontra o valor da postagem, exibe na página formatando em padrão de moeda 10,89
// Caso você não queira formatar basta comentar a linha abaixo que será exibido assim 10.89 e basta executar o comando abaixo
$total = number_format($total,2,',','.');

echo $nome_servico . $total . ' prazo entrega de ' . $PrazoEntrega . ' dia(s) ';
} else {implementando-um-c
echo 'Erro ao consultar verifique se CEP esta correto';
}
}
?>

Após calcular o CEP, o script retornará as informações (conforme imagem a seguir)

O Script retorna as informações

Bem… talvez de início você fique meio perdido, mas… se você analisar detalhadamente o script “calcularFrete.php”, certamente não terá qualquer problema ao implementar sua loja virtual.

Não perca nossas próximas matérias!

Estaremos falando ainda mais sobre o carrinho de compras e scripts que podem facilitar ainda mais a vida do vendedor ou dono do site.

Download do código utilizado neste tutorial: Carrinho Compras – Calcular Valor Do Frete

Be Sociable, Share!

14 Comentários

  1. boa noite testei de todas as formas mas está dando um erro veja ai por favor:
    http://www.belojardim.pe.gov.br/ficheiros

    • Olá! O erro que eu vejo no URL que você indicou é: Parse error: syntax error, unexpected T_VARIABLE in /home/belojard/public_html/ficheiros/calcularFrete.php on line 77 Ora, este ficheiro calcularFrete.php fecha a tag php na linha 65. Termina aí o código. Você alterou o ficheiro. E o erro é de sintaxe do PHP. Um Abraço! Rui Soares

  2. olá ainda nao consegui, vc tem um link dele funcionando ou poderia enviar para meu email os dois scripts para eu publicar no servidor, tanto o index.php (form) quanto o calcularfrete.php tenho muito interesse nisto, tenho um trabalho pendente que depende deste sistema, pois o que eu fiz dá erro na ENCOMENDA NORMAL só dá certo no SEDEX.

  3. junior

    Parabéns pelo tutorial mas em um primeiro teste não rodou, claro que não sou um as no php mas de cara informa uma url inválida. Se tiver um tempinho da uma revisada. Parabéns mais uma vez.

  4. Robson

    Ta dando erro…. eu testei o codigo baixado e da esse erro….
    Warning: file (http://shopping.correios.com.br/wbm/shopping/script/CalcPrecoPrazo.aspx?StrRetorno=xml&nCdServico=40010&nVlPeso=2&sCepOrigem=13060-854&sCepDestino=03534000&nCdFormato=1&nVlComprimento=20&nVlAltura=15&nVlLargura=20) [function.file]: failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in /home/th51807/public_html/teste/calcularFrete.php on line 28

    Warning: Invalid argument supplied for foreach() in /home/th51807/public_html/teste/calcularFrete.php on line 31
    Erro ao consultar verifique se CEP esta correto

  5. Ronaldo

    Olá, parabéns pela matéria…
    Bom, eu estou com o mesmo problema relatado pelo amigo Robson e não consigo resolver, preciso de uma ajuda porque é muito importante este script… outro detalhe se tenho vários itens no carrinho com tamanhos diferentes como calcular o montante deste itens no frete ou o peso?
    No aguardo, Ronaldo

  6. gerson correia

    olá pessoal to com o mesmo erro, podem me ajudar?
    Warning: file (http://shopping.correios.com.br/wbm/shopping/script/CalcPrecoPrazo.aspx?StrRetorno=xml&nCdServico=40010&nVlPeso=2&sCepOrigem=13060-854&sCepDestino=03534000&nCdFormato=1&nVlComprimento=20&nVlAltura=15&nVlLargura=20) [function.file]: failed to open stream: HTTP request failed! HTTP/1.1 403 Forbidden in /home/th51807/public_html/teste/calcularFrete.php on line 28 

    Warning: Invalid argument supplied for foreach() in /home/th51807/public_html/teste/calcularFrete.php on line 31 
    Erro ao consultar verifique se CEP esta correto

  7. jocimar

    e bom  so falta funcionar rsrsrsrsrsrs

    • Olá Jocimar! Penso que testei todos os scripts do Quemuel em ambiente Linux e MySQL. Um dia destes, publicamos um carrinhos de compras completo e open source. Um Abraço! Rui

  8. pedro

    Ola tbm estou com erro ao consultar cep podedia colocar um trecho onde ser trocado pelo novo endereço.

  9. Maicom

    Esse código serve para calculos aqui no Brasil?

  10. gabrielfelippem

    MANO EU TE DEVO A MINHA VIDA INTEIRA!
    Hahsuehsau

  11. Tenho a mesma dúvida. Serve para fazer calculos aqui no brasil?

Participa! Comenta...