Carcleo 4 Denunciar post Postado Junho 2, 2016 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 http://www.buscacep.correios.com.br/sistemas/buscacep/ 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
Gabriel Heming 766 Denunciar post Postado Junho 2, 2016 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
Carcleo 4 Denunciar post Postado Junho 2, 2016 Retorna valor normal. Tanto no ws quanto no xml! Compartilhar este post Link para o post Compartilhar em outros sites
Gabriel Heming 766 Denunciar post Postado Junho 2, 2016 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
Carcleo 4 Denunciar post Postado Junho 2, 2016 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
Gabriel Heming 766 Denunciar post Postado Junho 3, 2016 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
Carcleo 4 Denunciar post Postado Junho 5, 2016 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