Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Carcleo

Retorno correios

Recommended Posts

Pessoal.

 

Estou precisando mais uma vez da ajuda de vocês.

 

Seguinte:

 

Tenho um script de cálculo de frete com retorno do site dos correios. Aquel que muita gente usa mesmo.

 


// URL de Consulta dos Correios entregue à variavel $correios
$correios ="http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?"
."nCdEmpresa=$nCdEmpresa&"
."sDsSenha=$sDsSenha&"
."sCepOrigem=$sCepOrigem&"
."sCepDestino=$sCepDestino&"
."nVlPeso=$nVlPeso&"
."nCdFormato=$nCdFormato&"
."nVlComprimento=$nVlComprimento&"
."nVlAltura=$nVlAltura&"
."nVlLargura=$nVlLargura&"
."sCdMaoPropria=$sCdMaoPropria&"
."nVlValorDeclarado=$nVlValorDeclarado&"
."sCdAvisoRecebimento=$sCdAvisoRecebimento&"
."nCdServico=$nCdServico&"
."nVlDiametro=$nVlDiametro&"
."StrRetorno=xml";


$dados_correios = simplexml_load_file($correios);

$erros = $dados_correios->xpath('cServico/Erro');

Nesse sistema que estou desenvolvendo agora, precisava fazer duas implementações e gostaria de saber se são possíveis e como:

 

1) Gostaria de ter retorno também da cidade e o estado do CEP informado;

2) Gostaria de saber se já existe aqui no fórum alguma arquivo com a relação do início da composição dos números dos CEPs para identificar o estado de um CEP.

 

Alguma coisa do gênero.

 

Outra dúvida é a seguinte: Se esse XML dos correios não entregam dados sobre a cidade e endereço do CEP, então como seria que esses sites grandes ai fazem para que, quando a gente coloca o CEP, ele já completa com a cidade e endereço completos?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Outra dúvida é a seguinte: Se esse XML dos correios não entregam dados sobre a cidade e endereço do CEP, então como seria que esses sites grandes ai fazem para que, quando a gente coloca o CEP, ele já completa com a cidade e endereço completos?

O próprio correios fornece a base de dados deles, pra consulta ... tem que comprar.

Você pode tentar consumir esse serviço pra encontrar o nome da cidade junto ao UF

 

:seta: http://m.correios.com.br/movel/buscaCep.do

:seta: http://www.pinceladasdaweb.com.br/blog/2012/01/31/webservice-consulta-de-cep-diretamente-ao-site-dos-correios/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi.

 

Então, de posse dessa base de dados de cep doa correios, ai monto o ajax para autocompletar os campos né?

 

Sem isso, sem chance.

 

Obrigado pela direção.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas Andrey, deixa eu te amolar só mais um pouco.

 

Pelo código que eu postei no inicio desse post, o endereço dos correios que eu recebo o valor do frete, tem retorno por xml.

 

Mas não recebo, nem a cidade, nem o estado.

 

Então, pelo que entendi, o código do site pinceladas da web faz tipo uma adaptação para receber os retornos que vem em html para serem usadas pelo php como se fossem retornadas em xml.

 

É isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Utilizando apenas a função descrita no blog que o Andrey Knupp passou o link

 

 

function simple_curl($url,$post=array(),$get=array()){
$url = explode('?',$url,2);
if(count($url)===2){
	$temp_get = array();
	parse_str($url[1],$temp_get);
	$get = array_merge($get,$temp_get);
}

$ch = curl_init($url[0]."?".http_build_query($get));
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, http_build_query($post));
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
return curl_exec ($ch);
}

 

 

 

Você pode trabalhar usando DOMDocument para "extrair" os dados que você quer

<?php

$cep  = '94045330';
$html = simple_curl(
       'http://m.correios.com.br/movel/buscaCepConfirma.do',
       array(
           'cepEntrada' => $cep,
           'tipoCep'    => '',
           'cepTemp'    => '',
           'metodo'     => 'buscarCep'
       )
   );

$DOMDocument = new DOMDocument( '1.0', 'UTF-8' );
$DOMDocument->preserveWhiteSpace = false;
@$DOMDocument->loadHTML( $html );
$DOMXPath = new DOMXPath( $DOMDocument );

$value = $DOMXPath->query( './/*[@class="respostadestaque"]' );
$key   = $DOMXPath->query( './/*[@class="resposta"]' );

foreach( $key as $content )
{    
   foreach( $content->childNodes as $child )
   {
       $keys[ ] = trim( $child->nodeValue );
   }
}
foreach( $value as $content )
{    
   foreach( $content->childNodes as $child )
   {
       $values[ ] = preg_replace( '/[\s]{2,}/', null, $child->nodeValue );
   }
}

var_dump( array_combine( $keys, $values ) );

?>

 

Saída

array
 'Logradouro:' => string 'Rua Antônio Carlos Berta' (length=25)
 'Bairro:' => string 'Marrocos' (length=8)
 'Localidade / UF:' => string 'Gravataí/RS' (length=12)
 'CEP:' => string '94045330' (length=8)

 

Pelo menos evita uma porrada de código(gordura) que vem junto com phpQuery

Obs.: Não testei o desempenho e tals, mas fica a dica :thumbsup:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas, nesse mesmo endereço, consigo pegar valor de frete?

Ou tenho que fazer com o script que ja tenho e depois, em paralelo, pegar o endereço com este script?

Esta dando warning:

Warning: DOMDocument::loadHTML(): ID tipoCep already defined in Entity, line: 183 in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\php\chinelospuff.com.br\webservice-cep\index.php on line 35 Warning: DOMDocument::loadHTML(): ID cepTemp already defined in Entity, line: 184 in C:\Program Files\Apache Software Foundation\Apache2.2\htdocs\php\chinelospuff.com.br\webservice-cep\index.php on line 35 
array(2) {
 ["Localidade / UF:"]=>
 string(10) "Muriaé/MG"
 ["CEP:"]=>
 string(8) "36880000"
}

O codigo que o Andrey postou funcionou sem erros.

Meu problema é mais dificil.

Derepente, eu preciso mais de orientação que código.

 

É o seguinte:

O sisteminha que eu estou fazendo, terá opções personalizadas por região do Brasil.

 

Então, se a pessoa esta na região SUDESTE, terá opções(já cadastradas em banco) da SUDESTE e assim, por diante.

 

Então, na pagina principal, tem um select option pro cara escolher a região, mas não há como filtrar com segurança se ele escolheu certo sua região. Cheguei a usar um plugin da geoplugin.net mas ele tem hora que falha e não entrega o estado ou vem vazio. Eles requerem o ip do cliente.

<?php
$link = "http://www.geoplugin.net/php.gp?ip=".$_SERVER["REMOTE_ADDR"];

$data =  unserialize(file_get_contents($link));

$estado = $data["geoplugin_region"];

if($estado == "Distrito Federal" ){$regiao = "CENTRO-OESTE";}
else if($estado == "Goiás" ){$regiao = "CENTRO-OESTE";}
else if($estado == "Mato Grosso" ){$regiao = "CENTRO-OESTE";}
else if($estado == "Mato Grosso do Sul" ){$regiao = "CENTRO-OESTE";}

else if($estado == "Acre" ){$regiao = "NORTE";}
else if($estado == "Distrito Federal" ){$regiao = "NORTE";}
else if($estado == "Amapá" ){$regiao = "NORTE";}
else if($estado == "Amazonas" ){$regiao = "NORTE";}
else if($estado == "Pará" ){$regiao = "NORTE";}
else if($estado == "Rondônia" ){$regiao = "NORTE";}
else if($estado == "Roraima" ){$regiao = "NORTE";}
else if($estado == "Tocantins" ){$regiao = "NORTE";}

else if($estado == "Alagoas" ){$regiao = "NORDESTE";}
else if($estado == "Bahia" ){$regiao = "NORDESTE";}
else if($estado == "Ceará" ){$regiao = "NORDESTE";}
else if($estado == "Maranhão" ){$regiao = "NORDESTE";}
else if($estado == "Paraíba" ){$regiao = "NORDESTE";}
else if($estado == "Pernambuco" ){$regiao = "NORDESTE";}
else if($estado == "Piauí" ){$regiao = "NORDESTE";}
else if($estado == "Rio Grande do Norte" ){$regiao = "NORDESTE";}
else if($estado == "Sergipe" ){$regiao = "NORDESTE";}

else if($estado == "Espírito Santo" ){$regiao = "SUDESTE";}
else if($estado == "Minas Gerais" ){$regiao = "SUDESTE";}
else if($estado == "Rio de Janeiro" ){$regiao = "SUDESTE";}
else if($estado == "São Paulo" ){$regiao = "SUDESTE";}

else if($estado == "Paraná" ){$regiao = "SUL";}
else if($estado == "Santa Catarina" ){$regiao = "SUL";}
else if($estado == "Rio Grande do Sul" ){$regiao = "SUL";}

else 
{
 echo "<table align=\"center\" width=\"600px\" height=\"300px\"><tr><td align=\"center\" valign=\"middle\">";
 echo "Desculpe, não conseguimos validar a região do Brasil a qual você se encontra";
 echo "<br />";
 echo "Tentando outra vez em 10 segundos...";
 echo "</td></tr></table>";
 header("refresh: 10; url=index.php"); 
}

header ("Location:logon.php?acao=login&regiao=$regiao")
?>

para ele ver produtos do site, deverá fazer cadastro. Mas não acho uma forma de validar sua região de forma tal que, no cadastro, e no formulario de envio dos produtos comprados, só permita ao cliente entrar com ceps da região a qual ele logou.

 

De repente existe uma logico que abranja todos os logons.

 

Alguma orientação?

 

Estou no caminho certo?

 

O endereço é

 

http://www.dinamicaimoveis.com.br/loja

 

Alguma orientação?

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.