26 abril 2011 ~ 5 Comments

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.

facebook Cálculo de Frete Redundante twitter Cálculo de Frete Redundante email Cálculo de Frete Redundante

5 Responses to “Cálculo de Frete Redundante”

  1. Rafa Liziero 26 abril 2011 at 14:28 Permalink

    Cara, achei bacana teu post, mas o que é PHP?
    HAHAHHAHAHAHHAHA

    Conteúdo show de bola, Heric!

  2. Héric Tilly 26 abril 2011 at 15:03 Permalink

    Ae Marimbondo!
    Pra você aprender : http://pt.wikipedia.org/wiki/PHP

  3. 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.

  4. Héric Tilly 27 abril 2011 at 13:53 Permalink

    Fala Fernando!

    É isso mesmo, no caso só uso do retorno o “OK” e os valores.
    Realmente, a documentação está deficiente.

  5. Carlinhoslehn 30 maio 2011 at 22:53 Permalink

    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..


Leave a Reply

Page optimized by WP Minify WordPress Plugin