Cálculo de Frete Correios – Solução Alternativa

O cálculo do valor do frete dos Correios é necessário para todo sistema de e-commerce. Devido à indisponibilidade de taxas e valores para cálculo manual, se faz necessário montar scripts que peguem o valor processado diretamente no site dos Correios.
Acontece que ultimamente isto se tornou praticamente impossível. Tanto por bloqueios extras que foram feitos no site, bem como instabilidades constantes do serviço online.
Então à procura de uma solução melhor, descobri que a Locaweb possui um Gateway de Cálculo de Frete dos Correios, que, pelo que me parece, é totalmente independente.
Só tem um problema: Somente Sedex, Pac ( Encomenda Normal ) e E-sedex que o Gateway possui cálculo, o restante ainda não possuo solução. ( Se alguem possuir, por favor avise ).
Então como fiquei muito contente com esta notícia, resolvi disponibilizar o código e os dados necessários para fazer uma aplicação PHP se comunicar com o sistema.
A Locaweb já possui um tutorial aqui , o que fiz foi fazer uma comunicação usando os códigos de serviço padrão dos Correios, fazendo a conversão.
Antes de rodar o código, certifique-se que a extensão do PHP php_soap.dll esteja habilitada.
< ?
/**
* Webservice Frete
* @description Faz o cálculo do valor do frete passando o tipo de servico, cep de origem, cep de destino e peso, usa o webservice da Locaweb
* @description Outros parâmetros não são obrigatórios
*
*
* //////////
* para teste:
* //////////
* $int_cepOrigem = "85802150"
* $int_cepDestino = "07500000"
* $int_pesoFrete = "1,2"
* $int_volumeFrete = "15"
* $int_codigoFrete = "40096"
*
**/
$correiosWSLocaWeb = 'http://comercio.locaweb.com.br/correios/frete.asmx?WSDL'; //Endereço do WebService da LocaWeb
// Define os valores para o cálculo do frete
$int_cepOrigem = $_REQUEST['cepOrigem'];
$int_cepDestino = $_REQUEST['cepDestino'];
$int_pesoFrete = $_REQUEST['peso'];
$int_volumeFrete = $_REQUEST['volume'];
switch($_REQUEST['servico']) {
case '41106': $int_codigoFrete = '41025'; break; //PAC
case '40010': $int_codigoFrete = '40096'; break; //SEDEX
case '81019': $int_codigoFrete = '81019'; break; //E-sedex
default: $int_codigoFrete = '40096';
}
// pega as strings de acordo com os códigos
$vetor_frete = array(
"41106"=>'PAC',
"40010"=>'SEDEX',
"40215"=>'SEDEX 10',
"40045"=>'SEDEX a Cobrar',
"40290"=>'SEDEX HOJE',
"81019"=>'e-SEDEX',
"44105"=>'MALOTE'
);
class Parameters { }
// Inicializa o cliente SOAP
$soap = new SoapClient($correiosWSLocaWeb, array(
'trace' => true,
'exceptions' => true,
'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP,
'connection_timeout' => 1000
));
// Postagem dos parâmetros
$parms = new Parameters();
$parms->cepOrigem = utf8_encode($int_cepOrigem);
$parms->cepDestino = utf8_encode($int_cepDestino);
$parms->peso = utf8_encode($int_pesoFrete);
$parms->volume = utf8_encode($int_volumeFrete);
$parms->codigo = utf8_encode($int_codigoFrete);
$XMLresposta = $soap->CorreiosXml($parms); // Resgata o XML de retorno do processo
$XMLresposta = utf8_decode($XMLresposta->CorreiosXmlResult);
$objDom = new DomDocument(); // Carrega o XML
$loadDom = $objDom->loadXML($XMLresposta);
$nodeRetorno = $objDom->getElementsByTagName('retorno')->item(0);// Resgata os dados iniciais do retorno da consulta
$Retorno = $nodeRetorno->nodeValue;
$conteudo_xml = '';
$conteudo_xml .= "";
$conteudo_xml .= "1.1";
// Verifica se a consulta foi feita com sucesso
if ($Retorno == 'OK') {
// Resgata a opção e o valor de frete
$nodeCodigo = $objDom->getElementsByTagName('codigo')->item(0);
$Codigo = $nodeCodigo->nodeValue;
$nodeValor = $objDom->getElementsByTagName('valor')->item(0);
$Valor = $nodeValor->nodeValue;
$conteudo_xml .= '';
$conteudo_xml .= '
'.$Valor.'';
$conteudo_xml .= ''.$vetor_frete[$_REQUEST['servico']].''; //retorna o nome do servico
$conteudo_xml .= "";
} else {// Em caso de erro no proceesso
// Resgata o motivo do erro
$nodeDescricao = $objDom->getElementsByTagName('descricao')->item(0);
$Descricao = $nodeDescricao->nodeValue;
// erro
$conteudo_xml .= "";
$conteudo_xml .= "".utf8_decode($Descricao)."";
$conteudo_xml .= "";
}
$conteudo_xml .= '';
die($conteudo_xml);
?>
Bom é isso então Pessoal, abraço a todos.
-
http://frete.w21studio.com/ Natanael
-
http://frete.w21studio.com/ Natanael
-
Luiz Felipe
-
http://frete.w21studio.com/ Natanael
-
http://frete.w21studio.com/ Natanael
-
Luiz Felipe
-
http://criacao-sites.com criacao-sites
-
http://criacao-sites.com criacao-sites
-
http://weber.eti.br Luiz F. Weber
-
http://weber.eti.br/ Luiz Felipe


















