Ir para conteúdo

Arquivado

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

Carcleo

[Resolvido] Calculo de Frete correios

Recommended Posts

os formatos de saída são claros, nenhum dos dois vai te retornar o endereço.

 

se forem informados os serviços de mão-própria e aviso de recebimento, os valores serão informados nos respectivos nós XML

como eu disse, para processar melhor as informações, leia o arquivo de retorno com a biblioteca simpleXML

 

 

EDIT

 

vamos voltar láaaaa no começo??? Você abriu o tópico dizendo que tinha 3 dúvidas.

 

numerou a primeira como sendo o código, pra mim isso não é uma dúvida... está bem formado só está utilizando as funções erradas

 

perguntou na segunda, o que fazer caso o site dos correios esteja offline

 

if(!$dados_correios = simplexml_load_file($correios)) echo "O site dos correios está offline. Como não é possível calcular o frete, sua encomenda será enviada com o <b>frete grátis!</b>";

 

claro que isto é apenas uma sugestão ^^

 

 

na terceira, perguntou sobre as dimensões da embalagem.

 

informe as medidas mínimas, apenas para cálculos, a menos que vá comprar a embalagem na agência - interfere no custo total, pois cada caixote tem um preço.

 

No post #2, quis saber como manipular erros vindos de consultas inválidas, por exemplo CEP inexistentes informados.

Trabalhando com a simpleXML, verifique assim:

$erros = $dados_correios->xpath('erro');
if($erros[0] > 0) {
   $msg = $dados_correios->xpath('msgErro');
   echo $msg[0];
}

 

o uso de XPath, responde todas as suas dúvidas até o post #8

 

no post #9 pediu comentou sobre pegar o valor de CidadeOrigem e CidadeDestino

 

desconheço os campos. Em nenhuma das duas URL foi exibido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ok, entendi.

 

Experimentei assim e não imprimi nada.

Onde esta o erro?

 


$correios = "...................";
   $xml = simplexml_load_file($correios);
   foreach($xml->Item as $campo)
  { 
    $Valor = $campo->Valor;
	$Erro =  $campo->Erro;
	print "o Valor é: " . $Valor;
	print "O erro é: " .  $Erro;
  }
e tb assim não imprime nada

   $dados_correios = simplexml_load_file($correios);
   $erros = $dados_correios->xpath('erro');
	if($erros[0] > 0) {
		$msg = $dados_correios->xpath('msgErro');
		echo $msg[0];
	}

To quase chegando lá hein!

Compartilhar este post


Link para o post
Compartilhar em outros sites

dois erros meus:

 

1 - o caminho, troque 'erro' por 'cServico/Erro'. atente para maiúsculas e minúsculas

2 - os erros conhecidos, são dados por valores negativos, na condicional colocamos apenas maiores que 0. Troque > 0 por != 0

 

uma dica

<?php
$xmlData = <<<XML
<Servicos>
<cServico>
<Codigo>
41106
</Codigo>
<Valor>
0,00
</Valor>
<PrazoEntrega>
0
</PrazoEntrega>
<ValorMaoPropria>
0,00
</ValorMaoPropria>
<ValorAvisoRecebimento>
0,00
</ValorAvisoRecebimento>
<ValorValorDeclarado>
0,00
</ValorValorDeclarado>
<EntregaDomiciliar/>
<EntregaSabado/>
<Erro>
-18
</Erro>
<MsgErro>
A altura nao pode ser inferior a 2 cm.
</MsgErro>
</cServico>
</Servicos>
XML;

$myXML = simplexml_load_string($xmlData);

$erro = $myXML->xpath('cServico/Erro');
echo $erro[0];

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Assim?

   $dados_correios = simplexml_load_file($correios);
   $erros = $dados_correios->xpath('cServico/Erro');   
	if($erros[0] != 0) {
		$msg = $dados_correios->xpath('MsgErro');
		echo $msg[0];
                     	} 
Tabem não imprime nada!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Rapaz, tentei assim:


<?php

$correios = "http://shopping.correios.com.br/wbm/shopping/script/CalcPrecoPrazo.aspx?nCdEmpresa=&sDsSenha=&sCepOrigem=36855000&sCepDestino=36880000&nVlPeso=2&nCdFormato=1&nVlComprimento=20&nVlAltura=20&nVlLargura=20&sCdMaoPropria=S&nVlValorDeclarado=0&sCdAvisoRecebimento=N&nCdServico=40010&nVlDiametro=0&StrRetorno=xml";

 $xml = simplexml_load_file($correios);                                                                        
// print_r($xml);

 $Valor = $xml->Valor;
 print_r($Valor);


?>

Retornou o seguinte:

SimpleXMLElement Object ( )
Mas o valor não rertorna.

 

Caso eu cole a url no browsere, o browser mostra o retorno do xml certinho com os valores.

 

Onde esta o erro?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Assim?

   $dados_correios = simplexml_load_file($correios);
   $erros = $dados_correios->xpath('cServico/Erro');   
	if($erros[0] != 0) {
		$msg = $dados_correios->xpath('MsgErro');
		echo $msg[0];
                     	} 
Tabem não imprime nada!

 

se não tiver erro, não imprime nada mesmo ;)

 

na hora de montar a variável $correios, experimente deixar algum valor em branco, ou como 0. aí sim vamos testar

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, deixei o cep de origem em branco e retornou em branco de novo.

 

vê ai:


<?php

$correios = "http://shopping.correios.com.br/wbm/shopping/script/CalcPrecoPrazo.aspx?nCdEmpresa=&sDsSenha=&sCepOrigem=&sCepDestino=36880000&nVlPeso=2&nCdFormato=1&nVlComprimento=20&nVlAltura=20&nVlLargura=20&sCdMaoPropria=S&nVlValorDeclarado=0&sCdAvisoRecebimento=N&nCdServico=40010&nVlDiametro=0&StrRetorno=xml";

$dados_correios = simplexml_load_file($correios);

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

        if($erros[0] != 0) {

                $msg = $dados_correios->xpath('MsgErro');
 
               echo $msg[0];
 
                           }

?>

Cria um arquivo php só para esse codigo e testa ai fazendo um favor.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, deixei o cep de origem em branco e retornou em branco de novo.

 

vê ai:


<?php

$correios = "http://shopping.correios.com.br/wbm/shopping/script/CalcPrecoPrazo.aspx?nCdEmpresa=&sDsSenha=&sCepOrigem=&sCepDestino=36880000&nVlPeso=2&nCdFormato=1&nVlComprimento=20&nVlAltura=20&nVlLargura=20&sCdMaoPropria=S&nVlValorDeclarado=0&sCdAvisoRecebimento=N&nCdServico=40010&nVlDiametro=0&StrRetorno=xml";

$dados_correios = simplexml_load_file($correios);

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

        if($erros[0] != 0) {

                $msg = $dados_correios->xpath('MsgErro');
 
               echo $msg[0];
 
                           }

?>

Cria um arquivo php só para esse codigo e testa ai fazendo um favor.

 

 

aqui deu assim:

<?php
$correios = "http://shopping.correios.com.br/wbm/shopping/script/CalcPrecoPrazo.aspx?nCdEmpresa=&sDsSenha=&sCepOrigem=&sCepDestino=36880000&nVlPeso=2&nCdFormato=1&nVlComprimento=20&nVlAltura=20&nVlLargura=20&sCdMaoPropria=S&nVlValorDeclarado=0&sCdAvisoRecebimento=N&nCdServico=40010&nVlDiametro=0&StrRetorno=xml";

$dados_correios = simplexml_load_file($correios);

$erro = $dados_correios->cServico[0]->Erro;
echo $erro[0];
?>

ele imprime na tela o valor de $erro[0].

 

agora podemos fazer a checagem, se ele é ou não igual a 0

 

if($erro[0] != 0) die('um erro ocorreu!');
// aqui o restante do código

Compartilhar este post


Link para o post
Compartilhar em outros sites

Assim deu


<?php

$correios = "http://shopping.correios.com.br/wbm/shopping/script/CalcPrecoPrazo.aspx?nCdEmpresa=&sDsSenha=&sCepOrigem=36885000&sCepDestino=36880000&nVlPeso=2&nCdFormato=1&nVlComprimento=20&nVlAltura=20&nVlLargura=20&sCdMaoPropria=N&nVlValorDeclarado=0&sCdAvisoRecebimento=S&nCdServico=40010&nVlDiametro=0&StrRetorno=xml";

$dados_correios = simplexml_load_file($correios);

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

print $valor[0];
print "<p>";
print $erros[0];
print "<p>";

if ($erros[0] != 0)
   {
       print $erros[0];
   }
else 
   { 
       print $valor[0];
   }
?>

Valeu

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, conseguimos,

Para quem querr tai:

Falta apenas implementar a gosto

<?php
#####################################
# Código dos Serviços dos Correios  #
#    FRETE PAC = 41106              #
#    FRETE SEDEX = 40010            #
#    FRETE SEDEX 10 = 40215         #
#    FRETE SEDEX HOJE = 40290       #
#    FRETE E-SEDEX = 81019          #
#    FRETE MALOTE = 44105           #
#    FRETE NORMAL = 41017           #
#    SEDEX A COBRAR = 40045         #
#####################################

        $nCdEmpresa          = "";
        $sDsSenha            = "";
        $nCdServico          = $_POST['TENVIO'];
        $sCepOrigem          = 36855000;
        $sCepDestino         = $_POST['TCEP'];
		$sCepDestino         = eregi_replace("([^0-9])","",$sCepDestino);
        $nVlPeso             = $peso_medio;
        $nCdFormato          = 1;
        $nVlComprimento      = 20;
        $nVlAltura           = 20;
        $nVlLargura          = 20;
        $nVlDiametro         = 0;
        $sCdMaoPropria       = "N";
        $nVlValorDeclarado   = 0;
        $sCdAvisoRecebimento = "S";

// URL de Consulta dos Correios entregue à variavel $correios
$correios ="http://shopping.correios.com.br/wbm/shopping/script/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);
//print_r($dados_correios);
print "<p>";

$total = $dados_correios->xpath('cServico/Valor'); 
$total = floatval(str_replace(',', '.', $total[0]));
$PrazoEntrega = $dados_correios->xpath('cServico/PrazoEntrega');   
$erros = $dados_correios->xpath('cServico/Erro');   
$ValorAvisoRecebimento = $dados_correios->xpath('cServico/ValorAvisoRecebimento');   


if ($erros[0] != 0)
   {
       print $erros[0];
	   // Tentar outro webservice
   }
else 
   { 
      		  print "O valor do envio por ";
			  print $nome_servico;
			  print " será de: R$";
			  print number_format($total, 2, ',', '.');
			  print "<br>e o prazo de entrega será de ";
			  print $PrazoEntrega[0];
			  print " dia(s) úteis";
			  print "<p>";
			  print "Valor da compra sem o frete R$ ";
			  print number_format($preco_total, 2, ',', '.');
			  print "<p>"; 
			  $valor_final = $total + $preco_total;
			  print "Valor da compra com o frete R$ ";
			  print number_format($valor_final, 2, ',', '.');			   

   }

// Neste exemplo estou colocando apenas PAC e SEDEX
switch ($nCdServico) {
case 41106:
$nome_servico = " PAC ";
break;
case 40010:
$nome_servico = " SEDEX ";
break;
}
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Implementei o código acima e ele funcionou local corretamente, porém ao subir o arquivo e tentar calcular o frete novamente o seguinte erro aconteceu:

 

Warning: simplexml_load_file() [function.simplexml-load-file]: URL file-access is disabled in the server configuration in /home/accsolution/public_html/pages/pedidos/car/car.php on line 200

 

Warning: simplexml_load_file(http://shopping.correios.com.br/wbm/shopping/script/CalcPrecoPrazo.aspx?nCdEmpresa=&sDsSenha=&sCepOrigem=37901040&sCepDestino=37901040&nVlPeso=1.000&nCdFormato=1&nVlComprimento=20&nVlAltura=20&nVlLargura=20&sCdMaoPropria=N&nVlValorDeclarado=0&sCdAvisoRecebimento=S&nCdServico=41106&nVlDiametro=0&StrRetorno=xml) [function.simplexml-load-file]: failed to open stream: no suitable wrapper could be found in /home/accsolution/public_html/pages/pedidos/car/car.php on line 200

 

Warning: simplexml_load_file() [function.simplexml-load-file]: I/O warning : failed to load external entity "http://shopping.correios.com.br/wbm/shopping/script/CalcPrecoPrazo.aspx?nCdEmpresa=&sDsSenha=&sCepOrigem=37901040&sCepDestino=37901040&nVlPeso=1.000&nCdFormato=1&nVlComprimento=20&nVlAltura=20&nVlLargura=20&sCdMaoPropria=N&nVlValorDeclarado=0&sCdAvisoRecebimento=S&nCdServico=41106&nVlDiametro=0&StrRetorno=xml" in /home/accsolution/public_html/pages/pedidos/car/car.php on line 200

 

 

Fatal error: Call to a member function xpath() on a non-object in /home/accsolution/public_html/pages/pedidos/car/car.php on line 204

 

 

Alguém sabe me informar como posso contornar esse erro?

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.