Simulador de frete - PHP

Simulador de frete - PHP


Calcular o valor de frete diretamente do site do Correios é um tipo de serviço essencial para quem trabalha com vendas pela internet. Para isto, os próprios correios disponibilizam um webservice gratuito para que possamos fazer consultas das tarifas. Neste post iremos ver um exemplo de utilização deste serviço em PHP.

Através da classe PHP Rscorreios que criei, poderemos utilizar de forma bem simples o webservice dos correios para consultar o frete.

Precisaremos basicamente de um formulário HTML para informar os valores. Este formulário fará uma chamado a outro arquivo PHP que irá utilizar a classe.

Sem mais delongas, o código do formulário:

<form action="frete.php" method="post">
<fieldset><legend>Digite os dados da encomenda</legend><label for="sCepOrigem">Cep de Origem (somente números): </label><input id="sCepOrigem" onkeypress="return txtBoxFormat(this, ’99999999′, event);"type="text" maxlength="8" name="sCepOrigem" /><label for="sCepDestino">Cep de Destino (somente números): </label><input id="sCepDestino" onkeypress="return txtBoxFormat(this, ’99999999′, event);"type="text" maxlength="8" name="sCepDestino" /><label for="nVlPeso">Peso Total (Kg): </label>

<input id="nVlPeso" onkeydown="javascript: return mascaraValor(this,event,5,3);"type="text" maxlength="5" name="nVlPeso" /><label for="nVlComprimento">Comprimento da Embalagem (Cm): </label>

<input id="nVlComprimento" onkeypress="return txtBoxFormat(this, ’999′, event);"type="text" maxlength="3" name="nVlComprimento" /><label for="nVlAltura">Altura da Embalagem (Cm): </label>

<input id="nVlAltura" onkeypress="return txtBoxFormat(this, ’999′, event);"type="text" maxlength="3" name="nVlAltura" /><label for="nVlLargura">Largura da Embalagem (Cm): </label>

<input id="nVlLargura" onkeypress="return txtBoxFormat(this, ’999′, event);"type="text" maxlength="3" name="nVlLargura" /><label for="nCdServico">Serviço:</label>

<select name="nCdServico"><option value="41106">PAC</option></select>SEDEX SEDEX 10 SEDEX HOJE<input type="submit" value="Calcular Frete" /></fieldset>
</form>



Basicamente precisamos informar o CEP de origem, CEP de Destino, dimensões e peso da encomenda. É importante também enviar os dados com a formatação correta, por isso incluí no exemplo um javascript de validação.

O arquivo frete.php é que usará a classe RsCorreios para obter o valor do frete.



<!–?php </p–>require_once(‘RsCorreios.php’);

// Instancia a classe
$frete = new RsCorreios();

// Percorre todos as variáveis $_POST para setar os atributos necessários
// Se você achar melhor pode fazer 1 a 1.
// Ex.: $frete-&gt;setValue(‘sCepOrigem’, $_POST['sCepOrigem']);
// Aqui estou usando um foreach para economizar código
foreach ($_POST as $key =&gt; $value) {
$frete-&gt;setValue($key, $value);
}

// Diâmetro
$frete-&gt;getDiametro();

// Chamado ao método getFrete, que irá se comunicar com os correios
// e nos trazer o resultado
$result = $frete-&gt;getFrete();

// Retornamos a mensagem de erro caso haja alguma falha
if ($result[‘erro’] != 0) {
$resultadoFrete = $result[‘msg_erro’];
}
// Caso não haja erros mostramos o resultado de cada variável retornada pelos correios.
// Use apenas as que forem de seu interesse
else {

$resultadoFrete = "Código do Serviço: " . $result[‘servico_codigo’] . "
"
;
$resultadoFrete .= "Valor do Frete: R$ " . $result[‘valor’] . "
"
;
$resultadoFrete .= "Prazo de Entrega: " . $result[‘prazo_entrega’] . " dias
"
;
$resultadoFrete .= "Valor p/ Mão Própria: R$ " . $result[‘mao_propria’] . "
"
;
$resultadoFrete .= "Valor Aviso de Recebimento: R$ " . $result[‘aviso_recebimento’]. "
"
;
$resultadoFrete .= "Valor Declarado: R$ " . $result[‘valor_declarado’] . "
"
;
$resultadoFrete .= "Entrega Domiciliar: " . $result[‘en_domiciliar’] . "
"
;
$resultadoFrete .= "Entrega Sábado: " . $result[‘en_sabado’] . "
"
;
}

echo $resultadoFrete;
?&gt;



O frete.php irá solicitar o valor do frete dos correios e exibirá os valores na tela. Em caso de falha, exibirá uma mensagem de erro.

Por fim, deixo abaixo o código da classe para apreciação.

<!–?php </p–>/**
* Classe RSCorreios
*
* Classe criada por Rodrigo dos Santos para realizar o cálculo de frete dos
* correios em suas aplicações de ecommerce.
*
* PHP Version 5
*
* @category RsCorreios
* @package RsCorreios
* @author Rodrigo dos Santos
* @license GNU GENERAL PUBLIC LICENSE
* @link http://rodrigodossantos.ws
*
*/
/**
* Esta classe faz a comunicação com o webservice dos correios
* para cálculo de frete por SEDEX e PAC, etc.
* Baseado no manual disponibilizado pelos Correios
*
* @category RsCorreios
* @package RsCorreios
* @author Rodrigo dos Santos
* @license GNU GENERAL PUBLIC LICENSE
* @version Release: 1.1
* @link http://rodrigodossantos.ws
*/

class RsCorreios
{

/**
* endereço do webservice dos correios
*/

private $_ect = "http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx";

/**
* Seu código administrativo junto à ECT.
* O código está disponível no corpo do contrato firmado com os Correios.
*/

protected $nCdEmpresa;

/**
* Senha para acesso ao serviço, associada ao seu c�digo administrativo.
*/

protected $sDsSenha;

/**
* Código do serviço
* 41106 PAC sem contrato
* 40010 SEDEX sem contrato
* 40045 SEDEX a Cobrar, sem contrato
* 40215 SEDEX 10, sem contrato
* 40290 SEDEX Hoje, sem contrato
* 40096 SEDEX com contrato
* 40436 SEDEX com contrato
* 40444 SEDEX com contrato
* 81019 e-SEDEX, com contrato
* 41068 PAC com contrato
*/

protected $nCdServico;

/**
* Cep de origem sem o dígito
* @example 05311900
*/

protected $sCepOrigem;

/**
* CEP de Destino Sem hífem
* @example 05311900
*/

protected $sCepDestino;

/**
* Peso da encomenda, incluindo sua embalagem.
* O peso deve ser informado em quilogramas.
*/

protected $nVlPeso;

/**
* Formato da encomenda (incluindo embalagem).
* Valores possíveis: 1 ou 2
* 1 ? Formato caixa/pacote
* 2 ? Formato rolo/prisma
*/

protected $nCdFormato = "1";

/**
* Comprimento da encomenda (incluindo embalagem), em centímetros.
* É obrigatório somente para PAC
*/

protected $nVlComprimento;

/**
* Altura da encomenda (incluindo embalagem), em centímetros.
* É obrigatório somente para PAC
*/

protected $nVlAltura;

/**
* Largura da encomenda (incluindo embalagem), em centímetros.
* É obrigatório somente para PAC
*/

protected $nVlLargura;

/**
* Diâmetro da encomenda (incluindo embalagem), em centímetros.
* É obrigatório somente para PAC
*/

protected $nVlDiametro = "";

/**
* Indica se a encomenda será entregue com o serviço adicional mão própria.
* Valores possíveis: S ou N (S = Sim, N = Não)
*/

protected $sCdMaoPropria = "N";

/**
* Indica se a encomenda será entregue com o serviço
* adicional valor declarado.
* Neste campo deve ser apresentado o valor declarado desejado, em Reais.
* Se não optar pelo serviço informar zero.
*/

protected $nVlValorDeclarado = "0";

/**
* Indica se a encomenda será entregue com o serviço
* adicional aviso de recebimento.
* Valores possíveis: S ou N (S = Sim, N = Não)
*/

protected $sCdAvisoRecebimento = "N";

/**
* Indica a forma de retorno da consulta.
* XML: Resultado em XML
* Popup: Resultado em uma janela popup
* : Resultado via post em uma página do requisitante
*/

protected $StrRetorno = "xml";

/**
* SETTER único para todos os atributos da classe
*
* @param string $name Nome do atributo
* @param string $value Valor do atributo
*
* @return void
*/

public function setValue($name, $value)
{
$this-&gt;$name = $value;
}

/**
* GETTER único para todos os atributos da class
*
* @param string $name Nome do atributo
*
* @return void
*/

public function getValue($name)
{
return $this-&gt;$name;
}

/**
* Calcula o diâmetro da encomenda em cm
*
* @return void
*/

public function getDiametro()
{
$this-&gt;nVlDiametro = $this-&gt;nVlAltura + $this-&gt;nVlLargura;
}

/**
* Monta a URL de Consulta para enviar ao webservice dos correios
*
* @return string
*/

private function _getURL()
{

$url = $this-&gt;_ect . ‘?’;
foreach ($this as $name =&gt; $var) {
if ($name == ‘ect’) {
continue;
}
$url .= "$name=$var&amp;";
}

$this-&gt;url = $url;

return $this-&gt;url;
}

/**
* Obtém dados de uma url via curl
*
* @param string $url URL do site que se deseja obter os dados
*
* @return mixed Dados retornados pela URL
*/

private function _getSite($url)
{
$curl_init = curl_init();
curl_setopt($curl_init, CURLOPT_URL, $url);
curl_setopt($curl_init, CURLOPT_SSL_VERIFYPEER, 0);
ob_start();
curl_exec($curl_init);
$response = ob_get_contents();
ob_end_clean();
return $response;
}

/**
* Comunica-se com os correios para obter os valores do frete
*
* @return array
*/

public function getFrete()
{

$response = $this-&gt;_getSite(self::_getURL());

$xml = simplexml_load_string($response);

$frete = array("servico_codigo" =&gt; $xml-&gt;cServico-&gt;Codigo,
"valor" =&gt; $xml-&gt;cServico-&gt;Valor,
"prazo_entrega" =&gt; $xml-&gt;cServico-&gt;PrazoEntrega,
"mao_propria" =&gt; $xml-&gt;cServico-&gt;ValorMaoPropria,
"aviso_recebimento" =&gt; $xml-&gt;cServico-&gt;ValorAvisoRecebimento,
"valor_declarado" =&gt; $xml-&gt;cServico-&gt;ValorValorDeclarado,
"en_domiciliar" =&gt; $xml-&gt;cServico-&gt;EntregaDomiciliar,
"en_sabado" =&gt; $xml-&gt;cServico-&gt;EntregaSabado,
"erro" =&gt; $xml-&gt;cServico-&gt;Erro,
"msg_erro" =&gt; $xml-&gt;cServico-&gt;MsgErro);

return $frete;
}

}

?&gt;



Clique aqui para ver o funcionamento deste exemplo.

Faça aqui o download dos códigos.

Problemas comuns


Call to undefined function curl_init()


Isso significa que o seu PHP não tem o cURL habilitado. Edite seu php.ini para habilitar a função.

Comentários

Postagens mais visitadas deste blog

Instalação NetBeans

Calcular frete pelos correios via PHP