. JEFFERSON DE MELLO . Software e Pensamento . [Web-Programação: Tutoriais]

 

   
 

Tutoriais
 


Pegando preços e prazos de frete do webservice dos Correios no PHP4

Código para PHP4 e PHP5

Recentemente um cliente me pediu para integrar o webservice dos Correios à sua loja virtual. O problema é que o PHP do clente era o 4. Bem, eu tive que reescrever meu código usual em PHP5 para funcionar no servidor do cliente. Veja, neste artigo, como eu fiz. Espero que ajude.

Este artigo não tem como objetivo entrar em detalhes sobre lojas virtuais, então vou passar a descrever dretamente as funções usadas e um exemplo de como usar o Array obtido.

A função principal envia os dados via GET ao webservice dos Correios, recebe-os em XML, solicita o parseamento (e armazenamento em um Array) do resultado à função XMLArray() e, finalmente, retorna o Array obtido.

A chamada da função ficou assim
$ArrCorreios = CorreiosPegaValorPHP4($Peso,$Comprimento,$Altura,$Largura,$CepDestino);
$Peso: O peso total do pacote, em quilos.
$Comprimento, $Altura e $Largura: As dimensões do pacote em centímetros.
$CepDestino: O CEP do comprador. Apenas números.

Os outros dados, a princípio, serão os mesmos para todas as compras, então eu os coloquei diretamente na URL que vai para os Correios. Se seu projeto prevê mudanças nesses dados em cada compra, basta alterar a função conforme suas necessidads. Então vamos à função:
function CorreiosPegaValorPHP4($Peso,$Comprimento,$Altura,$Largura,$CepDestino)
      {
      //Setando a URL
      $url  = "http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx";
      $url .= "?nCdEmpresa=";//Se houver contrato com os Coreios coloque o número aqui
      $url .= "&sDsSenha=";//Aqui vai a senha referente ao contrato, se houver
      $url .= "&sCepOrigem=80020200";//O CEP da loja
      $url .= "&sCepDestino=$CepDestino";//Passado para a funçao
      $url .= "&nVlPeso=$Peso";//Passado para a função
      $url .= "&nCdFormato=1";//Formato pacote. Para outros formatos veja o manual fornecido no site dos Coreios
      $url .= "&nVlComprimento=$Comprimento";//Passado para a função
      $url .= "&nVlAltura=$Altura";//Passado para a função
      $url .= "&nVlLargura=$Largura";//Passado para a função
      $url .= "&sCdMaoPropria=n";//Serviço adicional de entrega em mãos de pessoa determinada. s = sim, n = não.
      $url .= "&nVlValorDeclarado=0";//Serviço Valor Declarado. Se o valor for informado será cobrada uma taxa
      $url .= "&sCdAvisoRecebimento=n";//Serviço adicional Aviso de Recebimento
      $url .= "&nCdServico=40010,40215,40290,41106";//Solicitando informações para 4 serviços
                                                    //(SEDEX, SEDEX 10, SEDEX Hoje e PAC)
      $url .= "&nVlDiametro=0";//Se o formato da encomenda for cilíndrico, informar o diâmetro em centítros
      $url .= "&StrRetorno=xml";//Vamos receber os dados em XML
      $url .= "&nIndicaCalculo=3";//Dados retornados: 1 = só preço, 2 = só prazo, 3 = preço e prazo
 
      //Solicitando a resposta e colocando as linhas em um Array
      $ARR_RESPOSTA = file("$url");
 
      //Transformando o Array em uma string
      $XML = implode("",$ARR_$RESPOSTA);
 
      //Enviando a string para a função XMLArray()
      $XML_ARRAY = XMLArray($XML);
 
      //A função XMLArray() irá retornar um Array com toda a estrutura do XML.
      //E finalmente retornamos o resultado!
      return $XML_ARRAY;
      }
Agora vamos à função XMLArray(). Ela apenas faz o parse do XML e monta um Array multidimensional com os dados:
function XMLArray($XML)
	{
    	$XMLPARSEROB = xml_parser_create();//Cria o parser
    	xml_parse_into_struct($XMLPARSEROB, $XML, $ArrValores);//Cria o Array (mal extruturado) $ArrValores
    	                                                       //com os elementos de $XML 
    	xml_parser_free($XMLPARSEROB);//Libera o parser criado
 
    	$_tmp='';
 
	/*
	Cada elemento de $ArrValores é um Array com tag, level, type, value e attributes.
	O código a seguir monta um Array bem extruturado e de fácil leitua
	ordenando os elementos e valores:
	*/
        foreach ($ArrValores as $ArrXmlElemento)
    		{
            	$thistag=$ArrXmlElemento['tag'];
            	$thislevel=$ArrXmlElemento['level'];
            	$thistype=$ArrXmlElemento['type'];
 
            	if($thislevel!=1 && $thistype == 'close')
    			{
                	if(isset($multi_key[$thistag][$thislevel]))
    				{
                    		$multi_key[$thistag][$thislevel]=1;
    				}
                		else
    			   	   {
                    	   	   $multi_key[$thistag][$thislevel]=0;
            		   	   }
 
            	if($thislevel!=1 && $thistype == 'complete')
    			{
                	if($_tmp==$thistag)
    				{
                    		$multi_key[$thistag][$thislevel]=1;
                		$_tmp=$thistag;
    				}
            		}
    		}
 
    	foreach ($ArrValores as $ArrXmlElemento)
		{
        	$thistag=$ArrXmlElemento['tag'];
        	$thislevel=$ArrXmlElemento['level'];
        	$thistype=$ArrXmlElemento['type'];
 
        	if($thistype == 'open')
			{
            		$level[$thislevel] = $thistag;
        		$start_level = 1;
        		$php_stmt = '$XML_ARAY';
			}
 
        	if($thistype=='close' && $thislevel!=1)
			{
            		$multi_key[$thistag][$thislevel]++;
 
        		while ($start_level < $thislevel)
				{
            			$php_stmt .= '[$level['.$start_level.']]';
 
            			if(isset($multi_key[$level[$start_level]][$start_level])
				&& $multi_key[$level[$start_level]][$start_level])
					{
                			$php_stmt .= '[';
                			$php_stmt .= ($multi_key[$level[$start_level]][$start_level]-1);
                			$php_stmt .= .']';
            				$start_level++;
					}
        			}
 
        		$add='';
 
        		if (isset($multi_key[$thistag][$thislevel]) && $multi_key[$thistag][$thislevel]
			&& ($thistype=='open' || $thistype=='complete'))
				{
            			if(!isset($multi_key2[$thistag][$thislevel]))
					{
                			$multi_key2[$thistag][$thislevel]=0;
					}
            				else
					   {
                			   $multi_key2[$thistag][$thislevel]++;
            				   $add='['.$multi_key2[$thistag][$thislevel].']';
					   }
        			}
 
        		if(isset($ArrXmlElemento['value'])
			&& trim($ArrXmlElemento['value'])!=''
			&& !array_key_exists('attributes', $ArrXmlElemento))
				{
            			if($thistype == 'open')
					{
                			$php_stmt_main =$php_stmt.'[$thistype]'.$add.'[\'content\']';
                			$php_stmt_main.=' = $ArrXmlElemento[\'value\'];';
					}
            				else
					   {
                			   $php_stmt_main =$php_stmt.'[$thistag]'.$add;
                			   $php_stmt_main.=' = $ArrXmlElemento[\'value\'];';
            				   eval($php_stmt_main);
        				   }
 
        			if (array_key_exists('attributes', $ArrXmlElemento))
					{
            				if (isset($ArrXmlElemento['value']))
						{
                				$php_stmt_main =$php_stmt.'[$thistag]'.$add.'[\'content\']';
                				$php_stmt_main.=' = $ArrXmlElemento[\'value\'];';
                				eval($php_stmt_main);
						}
            				}
 
            			foreach ($ArrXmlElemento['attributes'] as $key=>$value)
					{
                			$php_stmt_att=$php_stmt.'[$thistag]'.$add.'[$key] = $value;';
                			eval($php_stmt_att);
            				}
        			}
    		}
 
		//E retornamos o Array bem estruturado!
    		return $XML_ARRAY;
	}
Um exemplo do Array retornado
Array
(
    [SERVICOS] => Array
        (
            [CSERVICO] => Array
                (
                    [0] => Array
                        (
                            [CODIGO] => 40010
                            [VALOR] => 17,20
                            [PRAZOENTREGA] => 1
                            [VALORMAOPROPRIA] => 0,00
                            [VALORAVISORECEBIMENTO] => 0,00
                            [VALORVALORDECLARADO] => 0,00
                            [ENTREGADOMICILIAR] => S
                            [ENTREGASABADO] => S
                            [ERRO] => 0
                        )
 
                    [1] => Array
                        (
                            [CODIGO] => 40215
                            [VALOR] => 27,50
                            [PRAZOENTREGA] => 1
                            [VALORMAOPROPRIA] => 0,00
                            [VALORAVISORECEBIMENTO] => 0,00
                            [VALORVALORDECLARADO] => 0,00
                            [ENTREGADOMICILIAR] => S
                            [ENTREGASABADO] => S
                            [ERRO] => 0
                        )
 
                    [2] => Array
                        (
                            [CODIGO] => 40290
                            [VALOR] => 34,80
                            [PRAZOENTREGA] => 1
                            [VALORMAOPROPRIA] => 0,00
                            [VALORAVISORECEBIMENTO] => 0,00
                            [VALORVALORDECLARADO] => 0,00
                            [ENTREGADOMICILIAR] => S
                            [ENTREGASABADO] => S
                            [ERRO] => 0
                        )
 
                    [3] => Array
                        (
                            [CODIGO] => 41106
                            [VALOR] => 14,40
                            [PRAZOENTREGA] => 3
                            [VALORMAOPROPRIA] => 0,00
                            [VALORAVISORECEBIMENTO] => 0,00
                            [VALORVALORDECLARADO] => 0,00
                            [ENTREGADOMICILIAR] => S
                            [ENTREGASABADO] => N
                            [ERRO] => 0
                        )
 
                )
 
        )
 
)
Um simples exemplo de uso do Array retornado

Usaremos esta pequena função para definir o nome de cada serviço:
function CorreiosServiceName($codigo)
	{
	if($codigo == '40010'){return 'SEDEX';}
	if($codigo == '40215'){return 'SEDEX&nbsp;10';}
	if($codigo == '40290'){return 'SEDEX&nbsp;Hoje';}
	if($codigo == '41106'){return 'PAC';}
	return false;
	}
Agora vamos montar uma tabela com os quatro serviços apresentados.
echo "
<table border=1 cellpadding=4 cellspacing=3>
<tr>
<td bgcolor=#F4F4F4><font FACE=ARIAL><b>Serviço</b></font></td>
<td bgcolor=#F4F4F4><font FACE=ARIAL><b>Prazo</b></font></td>
<td bgcolor=#F4F4F4><font FACE=ARIAL><b>Entrega<br>Sábados</b></font></td>
<td bgcolor=#F4F4F4><font FACE=ARIAL><b>Valor</b></font></td>
<td>&nbsp;</font></td>
</tr>
";
 
foreach($ArrCorreios['SERVICOS']['CSERVICO'] as $ArrServico)
      	{
	//Preparando alguns dados
      	$nome_do_servico = CorreiosServiceName($ArrServico['CODIGO']);
      	if($ArrServico['PRAZOENTREGA'] == 1){$dias = 'dia';}else{$dias = 'dias';}
      	if($ArrServico['ENTREGASABADO'] == 'S'){$entrega_sabado = 'Sim';}else{$entrega_sabado = 'Não';}
 
      	if($ArrServico['VALOR'] != '0,00')//Não queremos um frete gratuito!
      		{
      		echo "
		<tr>
      		<td><font FACE=ARIAL>$nome_do_servico</font></td>
      		<td><font FACE=ARIAL>$ArrServico[PRAZOENTREGA]&nbsp;$dias</font></td>
      		<td><font FACE=ARIAL>$entrega_sabado</font></td>
      		<td><font FACE=ARIAL><b>R$&nbsp;$ArrServico[VALOR]</b></font></td>
      		<td>
			<table border=1 celpadding=0 cellspacing=2>
			<tr>
			<td>
			<font FACE=ARIAL><a href=link/para/o/cliente/escolher>escolher</a></font>
			</td>
			</tr>
			</table>
		</td>
      		</tr>
		";
      		}
      	}
	echo "</table>";
PHP4 e PHP5, alguns erros comuns e uma possível solução

O código apresentado serve tanto para o PHP4 quanto para o PHP5, porém, alguns servidores, principalmente no PHP5, desabilitam a opção de GET URL para a função file() (e file_get_contents()), nesse caso a função file(), dentro de CorreiosPegaValorPHP4() vai retornar um erro. Se você usa o PHP4 tente solicitar ao seu servidor que habilite o GET URL para a função file(). Se você estiver usando o PHP5, a seguinte ação provavelmente vai resolver seu problema:

Na CorreiosPegaValorPHP4(), substitua as seguintes linhas:
$ARR_RESPOSTA = file("$url");
$XML = implode("",$ARR_$RESPOSTA);
Pela seguinte:
$XML = CURL_file("$url");
E adicione ao seu código a seguinte função:
function CURL_file($url)
	{
	$ch = curl_init();
	curl_setopt($ch,CURLOPT_URL,$url);
	curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
	curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,0);
	$XML = curl_exec($ch);
	curl_close($ch);
	return $XML;
	}
Extras

URL dos Correios sobre o webservice
Manual do webservice dos Correios
Para entrar em contato comigo clique aqui

É isso. Até a próxima!

Jefferson de Mello
 
 

 

  

  

 
Quem Sou
Jefferson de Mello
Web-Programação
Serviços
Produtos
Portfólio
Tutoriais
Orçamento
Atendimento
Artes Cênicas
Espetáculos
Vídeos
Longas
Literatura
Peças Teatrais
Contos
Publicações
Roteiros
Filosofia
Teorias
Pensamentos
Mais
Links
Curiosidades
Contato
Home
  
 
 


Copyright © Jefferson de Mello. Todos os direitos reservados.
Design by CiadaLogo. Programação by Jefferson de Mello. Powered by Trilhas