PHP
Calculando Frete com WebService dos Correios
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.
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.
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:
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. =)
Gigasystems Login:
Informe seu e-mail abaixo para continuar!
XVeja Também:
Artigos Relacionados a categoria: PHP
Cotações para compra e venda de Moedas estrangeiras com PHP
27 July de 2016
Gerenciador de dependências Composer
14 January de 2016
Erro ao acessar um arquivo externo com o comando file_get_content
04 November de 2015
Baixando anexo do email no servidor com IMAP e PHP
27 August de 2015
Olá, deixe seu comentário para Calculando Frete com WebService dos Correios
jorge A
rogerio amaral
master souza
Leonardo Martins