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

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

    OLá, tem um outro sistema que faz isso, e não usa a tabela diferenciada como usa a locaweb. O retorno é simples, em XML.

    Exemplo de como usar:

    URL:
    http://frete.w21studio.com/calFrete.xml?cep=72600000&cod=1000&peso=10&comprimento=60&largura=60&altura=5&servico=3

    Note que não há cep de origem, isso porque o cep de origem esta vinculado ao parametro ‘cod’ da url. Este código você receberá ao se cadastrar no site
    http://frete.w21studio.com/

    No exemplo acima utilizei o “cod 1000″ de exemplo. O cep vinculado a esta conta é: 72853035

    Só lembrando, o cadastro é necessário, mas é GRATUITO

  • http://frete.w21studio.com/ Natanael

    OLá, tem um outro sistema que faz isso, e não usa a tabela diferenciada como usa a locaweb. O retorno é simples, em XML.

    Exemplo de como usar:

    URL:
    http://frete.w21studio.com/calFrete.xml?cep=72600000&cod=1000&peso=10&comprimento=60&largura=60&altura=5&servico=3

    Note que não há cep de origem, isso porque o cep de origem esta vinculado ao parametro ‘cod’ da url. Este código você receberá ao se cadastrar no site
    http://frete.w21studio.com/

    No exemplo acima utilizei o “cod 1000″ de exemplo. O cep vinculado a esta conta é: 72853035

    Só lembrando, o cadastro é necessário, mas é GRATUITO

  • Luiz Felipe

    Valeu pela dica caro Natanael.

    Eu resolvi postar esta solução da Locaweb, pois trabalho com e-commerce e levei um certo tempo até descobrir e bolar esta solução e em determinado momento do mês passado, nenhuma das lojas virtuais estava efetuando nenhum tipo de cálculo, o que me deixou desesperado ( incluindo os clientes.. hehe ).

    Irei me cadastrar no site e farei alguns testes para integrar à sua ferramenta.

    abraço e até mais

    ( desculpe não ter aprovado antes seu comentário, é que ele tinha entrado na caixa de spams )

    Obrigado mesmo pela dica.

  • http://frete.w21studio.com/ Natanael

    Olá Luiz felipe, espero que essa ferramenta seja util pra você e para todos que leem seu blog e que precisam de um serviço desses.

    Belo trabalho o seu, compartilhar conhecimento e soluções, parabens. Abraços.

  • http://frete.w21studio.com/ Natanael

    Olá Luiz felipe, espero que essa ferramenta seja util pra você e para todos que leem seu blog e que precisam de um serviço desses.

    Belo trabalho o seu, compartilhar conhecimento e soluções, parabens. Abraços.

  • Luiz Felipe

    Com certeza, segunda-feira já vou compartilhar o conhecimento com o pessoal da empresa que trabalho e divulgar o seu também.

    Obrigado pelo apoio novamente.

    =)

  • http://criacao-sites.com criacao-sites

    alguel sabe como empregar essa aplicação em outro servidor (usando o virtuemart)?

  • http://criacao-sites.com criacao-sites

    alguel sabe como empregar essa aplicação em outro servidor (usando o virtuemart)?

  • http://weber.eti.br Luiz F. Weber

    Para isso seria necessário alterar dentro de cada plugin de cálculo de frete. Seria somente de trocar o site aonde é feito o cálculo para um outro, como este da Locaweb, ou até o mesmo novo dos Correios, que utiliza XML.
    Na verdade eu já estou trabalhando numa outra versão deste módulo. Assim que estiver pronto, eu divulgo aqui no site, ok?

  • http://weber.eti.br/ Luiz Felipe

    Para isso seria necessário alterar dentro de cada plugin de cálculo de frete. Seria somente de trocar o site aonde é feito o cálculo para um outro, como este da Locaweb, ou até o mesmo novo dos Correios, que utiliza XML.
    Na verdade eu já estou trabalhando numa outra versão deste módulo. Assim que estiver pronto, eu divulgo aqui no site, ok?

blog comments powered by Disqus