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 julho de 2016
Gerenciador de dependências Composer
14 janeiro de 2016
Erro ao acessar um arquivo externo com o comando file_get_content
04 novembro de 2015
Baixando anexo do email no servidor com IMAP e PHP
27 agosto de 2015
Olá, deixe seu comentário para Calculando Frete com WebService dos Correios
jorge A
rogerio amaral
master souza
Leonardo Martins