Cálculo de Frete Redundante
Com as últimas alterações feitas nos Correios para cálculo de frete através de WebService, várias Lojas Virtuais tiveram impacto e ocasionalmente perderam algumas vendas, pois os clientes não conseguiam finalizar a compra devido ao erro de cálculo de frete.
O que já venho fazendo há mais de 1 ano é bem simples, utilizei redundância na consulta de frete.
Primeiramente faço a chamada ao WebService dos Correios, onde passo diversas informações como contrato esedex, etc…
Caso essa chamada falhe por algum motivo, eu então faço a chamada de consulta ao WebService do Pagseguro, perdendo apenas o cálculo de e-sedex, porém garantindo que meu cliente consiga efetuar a compra.
Seguem alguns exemplos de chamadas em PHP.
Os códigos de serviço podem variar caso você tenha contrato com os Correios, aqui vai a lista de Código de Serviços
////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
E a chamada ao WebService ficaria assim:
$url="http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?sCepOrigem=11035181&sCepDestino=".$sCepDestino."&nVlPeso=".$nVlPeso."&nCdFormato=1&nVlComprimento=20&nVlAltura=20&nVlLargura=20&sCdMaoPropria=n&nVlValorDeclarado=0&sCdAvisoRecebimento=n&nCdServico=41106,40010,40215,81019,40096&nVlDiametro=0&StrRetorno=xml&nCdEmpresa=XXXXX&sDsSenha=YYYYYY";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_POST, 0);
$result = curl_exec($ch);
$resultArray = curl_getinfo($ch);
curl_close($ch);Para ver o retorno ( header )
if($resultArray['http_code'] == "200"){
echo "Funcionou";
} else {
echo "Erro: " . $resultArray;
}Se der erro no resultado então faço a chamada a outro webservice, no caso o WebService do PagSeguro, se desejar pode adicionar outros quantos quiser, o importante aqui é você não perder a venda.
$url = "https://pagseguro.uol.com.br/desenvolvedor/simulador_de_frete_calcular.jhtml?postalCodeFrom={$sCepOrigem}&weight={$nVlPeso}&value={$Valor}&postalCodeTo={$sCepDestino}";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_VERBOSE, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Expect:'));
curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);
curl_setopt($ch, CURLOPT_POST, 0);
$result = curl_exec($ch);
$resultArray = curl_getinfo($ch);
curl_close($ch);Agora é só tratar o retorno dos WebServices, fazer as devidas validações e integrar com a sua aplicação de Loja Virtual.
No caso do retorno dos Correios:
$xml = @simplexml_load_string($result);
if($xml){
foreach($xml->cServico as $tfrete){
if($tfrete->Codigo==41106){
$valordofretePAC = $tfrete->Valor;
$prazodofretePAC = $tfrete->PrazoEntrega;
}
if($tfrete->Codigo==40010){
$valordofreteSEDEX = $tfrete->Valor;
$prazodofreteSEDEX = $tfrete->PrazoEntrega;
}
if($tfrete->Codigo==81019){
$valordofreteESEDEX = $tfrete->Valor;
$prazodofreteESEDEX = $tfrete->PrazoEntrega;
}
$erro = $tfrete->MsgErro;
}
}Em último caso se todas as chamadas falharem, você ainda pode optar por fazer um frete fixo, baseado na sua localidade e na região de destino. ( Estado / Capital | Interior ) fica a seu critério, como disse antes, o importante é não perder a venda por problemas técnicos.
Espero ter ajudado.


Cara, achei bacana teu post, mas o que é PHP?
HAHAHHAHAHAHHAHA
Conteúdo show de bola, Heric!
Ae Marimbondo!
Pra você aprender : http://pt.wikipedia.org/wiki/PHP
Fala, Heric. Gostei da abordagem “O importante é não perder a venda”.
Eu fiz alguns testes com o calculador de frete do PagSeguro e o retorno dele vem no formato como o exemplo abaixo:
ok|SP|true|11.20|8.20
Pelo o que eu entendi os valores separados por “|” significam:
ok = Cálculado com sucesso
SP = Estado de destino
true = Capital (false para Interior)
11.20 = Valor Sedex
8.30 = Valor PAC
É isso mesmo? Não achei a documentação desse serviço no site do PagSeguro.
Valeu.
Fala Fernando!
É isso mesmo, no caso só uso do retorno o “OK” e os valores.
Realmente, a documentação está deficiente.
Pois é uma boa abordagem, eu fiquei cerca de 1 dia fora do ar sem vender, por causa dessa mudança dos correios, e me obriguei a criar um sistema de calculo de frete interno, hoje utilizo somente o webservice busca cep, e o calculo minha aplicação faz, o ruim mesmo é atualizar as tabelas dos clientes quando é atualizada… mas foi uma saída para resolver o problema, “fácil” rápido e bem mais tranquilo caso algum dia caia todos webservices
abraço..
Olá pessoal, alguém teria alguma sugestão para trabalhar com este código, porém tendo a possibilidade de ter vários itens na sacola e a soma destes itens forem maior que a largura / altura máxima permitida.
exemplo:
se em uma loja eu compro itens
1.) largura de 50cm / altura de 50 cm
2.) largura de 50cm / altura de 50 cm
3.) largura de 50cm / altura de 50 cm
no caso a soma destes 3 itens estaria maior que a permitida (que no caso é de 105cm)
porém cabem em 2 “caixa” ou seja pagando o dobro do frete, teria como ter o cálculo certinho.
O você pensam sobre este problema.