Ir para conteúdo

Arquivado

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

Carcleo

Erro no Web Service dos Correios

Recommended Posts

Estou fazendo a seguinte consulta por valor de frete nos correios:


http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?
nCdEmpresa=&
sDsSenha=&
sCepOrigem=36880000&
sCepDestino=12345678&
nVlPeso=0.12&
nVlLargura=20&
nVlAltura=6&
nCdFormato=1&
nVlComprimento=20&
sCdMaoProria=n&
nVlValorDeclarado=4.00&
sCdAvisoRecebimento=n&
nCdServico=41106&
nVlDiametro=0&
StrRetorno=xml


E me retorna valor normalmente.


Já experimentei 11.111-111, etc... e retorna normalmente valores.


Mas quando vou a




e pesquiso pelo mesmo cep: 12.345-678, retorna que cep não existe.


O que estou fazendo errado?


O interessante é que a implementação via soap dá o mesmo resultado (segue a implementação no final)


Segue a classe:



<?php

class CalculaFrete {

//Sedex: 40010
//Pac: 41106

private $url = "http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?";
private $precoPacote = 0;
private $pesoPacote = 0.1;
private $cepOrigem;
private $cepDestino;
private $peso;
private $valor;
private $tipoFrete;
private $altura = 6;
private $largura = 20;
private $comprimento = 20;
private $quantosPacotes;
private $erro;

public function __construct (
$_cepOrigem,
$_cepDestino,
$_peso,
$_valor,
$_tipoFrete
) {
$pacotes = ceil($_peso / 30);

$this->cepOrigem = $_cepOrigem;
$this->cepDestino = $_cepDestino;
$this->peso = $_peso / $pacotes;
$this->valor = $_valor;
$this->tipoFrete = $_tipoFrete;
$this->quantosPacotes = $pacotes;
}

public function getPrecoPacote () {

return $this->precoPacote;
}

public function getPesoPacote () {

return $this->pesoPacote;
}

public function getPacotes () {

return $this->quantosPacotes;
}

public function getPeso () {

return $this->peso;
}

public function getErro () {

return $this->erro;
}

public function calcularFrete() {

$url = $this->url;
$url .= "nCdEmpresa=";
$url .= "&sDsSenha=";
$url .= "&sCepOrigem=" . $this->cepOrigem;
$url .= "&sCepDestino=" . $this->cepDestino;
$url .= "&nVlPeso=" . $this->peso;
$url .= "&nVlLargura=" . $this->largura;
$url .= "&nVlAltura=" . $this->altura;
$url .= "&nCdFormato=1";
$url .= "&nVlComprimento=" . $this->comprimento;
$url .= "&sCdMaoProria=n";
$url .= "&nVlValorDeclarado=" . $this->valor;
$url .= "&sCdAvisoRecebimento=n";
$url .= "&nCdServico=" . $this->tipoFrete;
$url .= "&nVlDiametro=0";
$url .= "&StrRetorno=xml";

$xml = simplexml_load_file($url);

$this->erro = $xml->cServico->Erro;

return $xml->cServico;

}

}
?>

Implementação via soap. Agora, ao invés da url ser aspx, é asmx.


<?php
ini_set("display_errors",true);
ini_set("display_startup_erros",1);
error_reporting(E_ALL && E_NOTICE);
error_reporting( E_ALL | E_STRICT ); // PHP 5.3
error_reporting( E_ALL ); // Todas as outras versões

$_urlWebservice = "http://ws.correios.com.br/calculador/CalcPrecoPrazo.asmx?wsdl";

$parametros = array(
"nCdEmpresa" => "",
"sDsSenha" => "",
"sCepOrigem" => '36880000',
"sCepDestino" => '11111111',
"nVlPeso" => '0.3',
"nCdServico" => '41106',
"nCdFormato" => "1",
"nVlComprimento" => "20",
"nVlAltura" => "6",
"nVlLargura" => "20",
"nVlDiametro" => "0",
"sCdMaoPropria" => "N",
"nVlValorDeclarado" => "0",
"sCdAvisoRecebimento" => "N"
);


function getPreco($parametros, $_urlWebservice) {
try {
$frete = new SoapClient($_urlWebservice);
} catch (Exception $e) {
return false;
}
$resultado = $frete->CalcPreco($parametros);
$hash = ( implode(",", $parametros) );
if (intval($resultado->CalcPrecoResult->Servicos->cServico->Erro) !== 0) {
$this->setCache($hash, false);
return false;
} else {
return $resultado;
//return (float) str_replace(",", ".", $resultado->CalcPrecoResult->Servicos->cServico->Valor);
}
}

function getPrazo($parametros, $_urlWebservice) {
try {
$frete = new SoapClient($_urlWebservice);
$resultado = $frete->CalcPrazo($parametros);

if (intval($resultado->CalcPrazoResult->Servicos->cServico->Erro) !== 0)
return false;
else

return $resultado;
//return (integer) $resultado->CalcPrazoResult->Servicos->cServico->PrazoEntrega;
} catch (Exception $e) {
return false;
}
}

print "<pre>";
print_r(getPreco($parametros, $_urlWebservice));
print_r(getPrazo($parametros, $_urlWebservice));
print "</pre>";
?>

Podem testar para ver.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Talvez seja uma má implementação por parte do web service de cálculo de frete em não verificar se o cep existe e trazer o valor base.

 

Se, no WS, você buscar pelo CEP, vai retornar ou avisará que não existe?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Os correios possuem outro webservice, que retorna as informações de endereço.

 

Talvez você tenha que validar o CEP e, após, calcular o frete.

 

https://apps.correios.com.br/SigepMasterJPA/AtendeClienteService/AtendeCliente?wsdl

 

Através do método consultaCEP.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estou desde quinta feira com esse código e a ampulheta do mouse só gira e não da retorno algum!

 

<?php 
 ini_set("display_errors",true);
 ini_set("display_startup_erros",1);
 error_reporting(E_ALL && E_NOTICE);
 error_reporting( E_ALL | E_STRICT ); // PHP 5.3
 error_reporting( E_ALL ); // Todas as outras versões 
 
 $config = array(
 "trace" => 1, 
 "exception" => 0, 
 "cache_wsdl" => WSDL_CACHE_MEMORY
 );
  
 $address = "https://apps.correios.com.br/SigepMasterJPA/AtendeClienteService/AtendeCliente?wsdl";
  
 try {
$client = new SoapClient($address, $config);    
$cepC = array ("cep"=>"36860000");
$cep  = $client->consultaCEP($cepC);
 
print "<pre>";
print_r($cep);
print "</pre>"; 
  
 } catch (SoapFault $fault) {
  
echo $fault->faultstring;
  
 }
?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use o SoapUI e teste o WSDL, veja como ficam as chamadas e os retornos. Você pode encontrar diferenças não visíveis no PHP.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Achei: O problema era que arquivo criei, estava com assinatura BOM, então ela carregava antes do php. Então dava erro. Removi ela com o formatar do Notepad++ para utf-8 sem BOM e resolveu!

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.