Cálculo do frete via SEDEX com PHP e AJAX
por Aderbal Nunes

Irei explicar nesse tutorial simples como fazer o cálculo de frete via SEDEX, nesse caso o valor vindo direto do site dos correios, usando PHP e AJAX para fazer esse trabalho.



Este tutorial além de calcular o valor do frete via sedex, vamos ter uma noção de como funciona o Ajax (Asynchronous Javascript And XML).

Ajax é resumidamente o uso sistemático de Javascript e XML para tornar a nevegação mais interativa com o usuário, utilizando-se de solicitações assíncronas de informações. Podemos dizer que Ajax não é uma tecnologia, mas sim um conjunto de tecnologias trabalhando em conjunto, cada uma fazendo sua parte para criar novas funcionalidades.

Então estamos vendo que além do PHP, também iremos aprender um pouco de javascript.

Pra começar vamos pra o arquivo ajax.js


function ajax()
{
    try {
        return new ActiveXObject("Microsoft.XMLHTTP");
    } catch(e) {
        try {
            return new ActiveXObject("Msxml2.XMLHTTP");
        } catch(ex) {
            try {
                return new XMLHttpRequest();
            } catch(exc) {
                alert("Esse browser não tem recursos para uso do Ajax");
                return false;
            }
        }
    }
}


Complicou? Não se preocupe...



Iremos usar a função ajax criada no arquivo anterior para saber se o navegador tem suporte ao serviço. Nesse caso com o arquivo mãe do nosso tutorial. É ele quem vai ser invocado pelo usuário.

Arquivo calculoFrete.html


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Cálculo do Frete</title>
</head>
<script language="javascript" src="ajax.js"></script>
<script>
ajax1 = new ajax;
function calculoFrete()
{
    var cepOrigem     = document.getElementById("cepOrigem").value;
    var cepDestino    = document.getElementById("cepDestino").value;
    var peso = 1;

    ajax1.open("POST", "calcularFrete.php", true );
    ajax1.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    ajax1.send("cepOrigem="+cepOrigem+"&cepDestino="+cepDestino);

    ajax1.onreadystatechange = function() { 
        if (ajax1.readyState == 4) {
            document.getElementById("result").innerHTML = ajax1.responseText;
        } else {
            document.getElementById("result").innerHTML = "Aguarde, calculando...";
        }
    }
}
</script>
<body>

<form method="post" action="">
<table width="322" border="0" cellspacing="0" cellpadding="0">
  <tr>
    <td>
      CEP Origem: 
      <input name="cepOrigem" type="text" id="cepOrigem">
      <br />
      CEP Destino: 
      <input name="cepDestino" type="text" id="cepDestino">
      <br />
      <br />
      <input name="postok" type="button" id="postok" value="Calcular" onClick="calculoFrete();">
    </td>
  </tr>
</table>
</form> 
<div id="result"></div>

</body>
</html>





Vamos analisar agora. Na linha 6 estou incluindo em nosso arquivo o javascript ajax.js para podermos usar.

Para isso temos uma função em javascript que faz a ligação do arquivo que vai realmente fazer o cálculo e esse nosso HTML puro aqui. Vejamos.

(comentada)

<script type="text/javascript">
// crio a variável que vai utilizar nosso ajax.
ajax1 = new ajax;
function calculoFrete()
{
    // captura o valor do cep de origem
    var cepOrigem     = document.getElementById("cepOrigem").value;
    // captura o valor do cep de destino
    var cepDestino    = document.getElementById("cepDestino").value;
    // defino o peso da embalagem
    var peso = 1;
    // abro o arquivo que vai calcular nosso frete
    ajax1.open("POST", "calcularFrete.php", true );
    // seto o header de resposta
    ajax1.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    // envia os dados para o php
    ajax1.send("cepOrigem="+cepOrigem+"&cepDestino="+cepDestino);
    
    // aqui vamos testar o estado da nossa requisição no nosso caso:
    // status = 4 concluido
    // != de 4 em andamento.
    ajax1.onreadystatechange = function() {
        if (ajax1.readyState == 4) {
            // jogo o resultado encontrado no DIV em nosso html
            document.getElementById("result").innerHTML = ajax1.responseText;
        } else {
            // por enquanto, aguardando status 4....
            document.getElementById("result").innerHTML = "Aguarde, calculando...";
        }
    }
}
</script>



O resto do arquivo é puro HTML.

vamos pra a parte principal, que é do cálculo do frete.

Arquivo calcularFrete.php

Esse será o nosso arquivo que vai ser requisitado sem causar transferência visual pra o usuário. Nosso PHP vai entrar em cena agora.

Linha a linha comentada:

<?php
// cep de origem e cep de destino
$cepOrigem $_POST['cepOrigem'];
$cepDestino $_POST['cepDestino'];
?>


Capturamos os valores vindo do formulário, e quem nos enviou foi a função javascript via POST.


<?php
// altere aqui o peso
$peso 1// 1 kg
?>


Valor do peso de nossa embalagem, via SEDEX peso mínimo de 1Kg


<?php
// esta é a URL dos correios
$url "http://www.correios.com.br/encomendas/precos/calculo.cfm?resposta=paginaCorreios&servico=40010&cepOrigem=".$cepOrigem."&cepDestino=".$cepDestino."&peso=".$peso."&MaoPropria=n&valorDeclarado=&avisoRecebimento=N";
?>


Essa variável é a URL que vai calcular o valor de seu frete.


<?php
// captura as linhas da URL retornada
$lines file($url);

// varro as linhas e procuro o valor do frete, no caso está na linha 660
// caso não retorne descomene a linha dentro do foreach e veja qual a linha que retorna o valor
foreach ($lines as $line_num => $line) {
    
//echo "Line #<b>{$line_num}</b> : " .strip_tags($line). "<br />\n";
    
if( $line_num == 660 ){ echo "Valor do Frete via SEDEX: ".strip_tags($line); }
}
?>


No arquivo PHP será mostrado “Valor do Frete via SEDEX: xxx”

Pode-se utilizar o preg_match_all() para filtrar esse resultado. Pois se o HTML for alterado vc não precisa varrer a linha pra retornar o valor. Porém torna-se a execuçao do script mais lenta. Fica a critério. =)


Por fim temos nosso script de cálculo de frete. Para ver um em funcionamento visite esse link http://www.farmaciabeirario.com.br/calculo_frete.php

Colocarei os arquivos para downloads em contribuições de scripts. Qualquer dúvida aderbalnunes@gmail.com

Espero ter ajudado. VALEU!!