PHP

Em por

No tutorial de hoje, vamos aprender como calcular um frete de uma mercadoria, com o WebService dos correios, retornando o resultado em XML para sua aplicação.

Calculando Frete com WebService dos Correios

Bem, para darmos inicio a explicação, você deve acessar o Manual de implementação do webservice de cálculo de preços e prazos de encomendas no site dos correios através desse link.

//www.correios.com.br/para-voce/correios-de-a-a-z/pdf/calculador-remoto-de-precos-e-prazos/manual-de-implementacao-do-calculo-remoto-de-precos-e-prazos

Após o acesso ao PDF e uma breve leitura, você pode concluir que há várias maneiras de se fazer esse procedimento, porém a que eu vou ensinar aqui, foi à maneira que eu utilizei em meu projeto, caso você queira fazer esse processo de outra forma, fique a vontade, a lógica seque quase que a mesma coisa.

Calculando Frete

Vamos ao que interessa... (rsrs)

Inicialmente você deve criar dois arquivos para fazer a comunicação. Seriam eles, o índex e um arquivo chamado Correios.class, no qual ele será o responsável por passar nossos parâmetros das variáveis para a WebService do correio.

Então nosso arquivo índex.php ficará da seguinte forma:

 <?php ini_set('default_charset', 'UTF-8'); //incluo a classe correios include('class/Correios.class.php'); //instancio a classe correios $frete = new Correios(); $frete->servico = '40010';//tipo de servicos, ou seja, sedex, pac, sedex 10, esses codigos voce encontra no PDF que mencionei acima $frete->cepOrigem = '12970000';//cep de origem, ou seja, de onde parte $frete->cepDestino = '12942770';//cep destino, ou seja, para onde vai ser mandado $frete->peso = '2';//peso em kilogramas $frete->comprimento = '80';//em cm $frete->altura = '20';//em cm $frete->largura = '20';//em cm $frete->diametro = '91';//em cm //chamo meu metodo para calcular $calc = $frete->calc(); //verifica se foi calculado, se sim damos um var_dump pra mostrar na tela o xml retornado if(!$calc){ $error = $frete->error(); echo $error[1]; }else{ var_dump($calc); } ?>

Criado nosso índex.php, vamos criar um diretório chamado class, e dentro dele criamos nossa classe Correios.class.php, isso não é uma regra, é apenas boas práticas de organização do projeto, separar arquivos classe de outros, fica mais legível o projeto.

Nossa classe ficará assim:

 <?php class Correios{ public $servico, $cepOrigem, $cepDestino, $peso, $formato = '1', $comprimento, $altura, $largura, $diametro, $maoPropria = 'N', $valordeclarado = '0', $avisoRecebimento = 'N', $retorno = 'xml'; public function calc(){ $cURL = curl_init(sprintf( '//ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?nCdServico=%s&sCepOrigem=%s&sCepDestino=%s&nVlPeso=%s&nCdFormato=%s&nVlComprimento=%s&nVlAltura=%s&nVlLargura=%s&nVlDiametro=%s&sCdMaoPropria=%s&nVlValorDeclarado=%s&sCdAvisoRecebimento=%s&StrRetorno=%s', $this->servico, $this->cepOrigem, $this->cepDestino, $this->peso, $this->formato, $this->comprimento, $this->altura, $this->largura, $this->diametro, $this->maoPropria, $this->valordeclarado, $this->avisoRecebimento, $this->retorno )); // Define a opção que diz que você quer receber o resultado encontrado curl_setopt($cURL, CURLOPT_RETURNTRANSFER, true); // Executa a consulta, conectando-se ao site e salvando o resultado na variável $string $string = curl_exec($cURL); // Encerra a conexão com o site curl_close($cURL); $xml = simplexml_load_string($string); if($xml->Erro != ''){ $this->error = array($xml->cServico->Erro, $xml->cServico->MgsErrro); return false; }else{ return $xml; } } public function error(){ if(is_null($this->error)){ return false; }else{ return $this->error; } } } ?>

Comentando a classe:

Bom, começamos declarando nossas variáveis de uma forma mais estruturada e legível, lembrando que você deve deixa-las como public para poder deixa-las públicas para outros arquivos acessarem, pois se você deixa-las como privadas, somente a classe onde estão poderão ser acessadas.

Logo depois criamos nossa função calc(), na qual ela fará o serviço do calculo para nós.

Criamos uma var $cURL e damos um curl_init e montamos uma string parametrizada com sprintf, onde montamos nossa URL de acesso e envio das variáveis a plataforma WebService dos correios, e a cada %s que você encontra nessa URL, corresponde a uma variável abaixo passada por parâmetro.

Caso seu WampServer não esteja habilitado o Curl, ele vai ocasionar um erro, para resolvermos esse problema você deve acessar o php.ini, e na linha onde está o ;extension=php_curl.dll, você deve retirar o (;) do começo para poder habilita-lo.

Logo abaixo a função curl_setopt() irá definir opções para uma sessão CURL identificada pelo parâmetro ch. O parâmetro option é a opção que você quer definir, e o value é o valor da opção dada por option.

CURLOPT_RETURNTRANSFER passa um valor diferente de zero se você quer que o CURL retorne diretamente a transferência ao invés de mostra-la diretamente.

Depois pegamos o resultado, atribuímos a uma variável o simplexml_load_string, ele Interpreta uma string XML e a transforma em um objeto.

Verifica se houve erros, se não ele retorna nossa var em formato XML para nosso inde.php, na qual damos um var_dump para exibir na tela.

Prontinho, nosso calculo está realizado e se tudo ocorrer corretamente seu resultado deve ser algo como:

calculo de frete com xml

Lembrando que no tutorial de hoje, foi mostrado um exemplo simples, com passagens de parâmetros fixos, porém você pode implementar isso em seu projeto, e através de sua interface passar os parâmetros que deseja.

No PDF do manual, ele diz quais variáveis são obrigatórias na passagem de parâmetro e quais não são, e o que cada uma representa. Leia com atenção e seja feliz....

Dúvidas, criticas ou sugestões comentem abaixo que termos o prazer em lhe ajuda-los. laugh

Veja Também:

Artigos Relacionados a categoria: PHP

Olá, deixe seu comentário para Calculando Frete com WebService dos Correios

Já temos 2 comentário(s). DEIXE O SEU :)
master souza

master souza

olá, tudo bem? como faço para obter retorno de mais de 1 serviço, exemplo: PAC e SEDEX, com apenas uma chamada, pois aqui tenho que passar o COD serviço, ou seja antes de fazer a consulta envio se é pac ou sedex, como faço para receber mais de um serviço no XML
★★★★★ DIA 27.08.16 09h38 RESPONDER
Leonardo Martins
Enviando Comentário Fechar :/
Leonardo Martins

Leonardo Martins

Boa tarde, bom primeiramente você deve procurar saber se eles disponibilizam esse tipo de serviço que vc precisa, que no caso seria os dois serviços, porém se a webservice não fornece como você deseja, basta adaptar sua lógica pra fazer duas buscas talvez, precisa estudar a melhor hipótese.
★★★★★ DIA 28.10.16 14h02 RESPONDER
N/A
Enviando Comentário Fechar :/
Enviando Comentário Fechar :/

...AINDA NÃO VIU NOSSO PORTFÓLIO?

Se ainda não viu nosso Portfólio e quer conhecer um pouco mais... aproveite e veja agora mesmo e tenha um site de qualidade para o seu negócio!

[contato]
Ver o Portfólio Agora