Como consultar o web service dos Correios pelo PHP, utilizando a biblioteca cURL. Iremos fazer uma simples requisição GET para realizar o calculo de frete e processar o seu retorno.
Este tutorial é útil para você que deseja integrar o calculo de frete do seu sistema ou loja virtual diretamente com Correios, sem a utilização de intermediários.
Primeiro passo, vamos ler o manual.
Antes de iniciarmos o desenvolvimento, por favor, de uma rápida lida no Manual disponibilizado pelo Correios .
Você pode acessar neste link: Manual – Webservice – Correios.
Colocando a mão na massa
O fluxo de informações é bem simples, iremos enviar os parâmetros necessários para consulta e processar o retorno da requisição, até ai não tem nenhum segredo. Você verá que para realizar a integração com o calculo do frete é bem simples.
Preparando os parâmetros
$data = array(); $data['nCdEmpresa'] = ''; $data['sDsSenha'] = '';
“nCdEmpresa” e “sDsSenha”: Deixe em branco caso você não tenha, são o código da empresa e senha, fornecidos pelo Correios para as empresas que possuem um contrato especial que oferece preços e serviços diferenciados.
$data['sCepOrigem'] = $cep_origem; $data['sCepDestino'] = $cep; $data['nVlPeso'] = $peso;
“sCepOrigem”: CEP de origem do envio.
“sCepDestino”: CEP para aonde será enviado.
“nVlPeso”: peso da encomenda, em quilogramas, 1000 para 1kg.
$data['nCdFormato'] = '1';
“nCdFormato”: Formato da encomenda. Pode ser 1, 2, ou 3.
- 1 – Formato caixa/pacote
- 2 – Formato rolo/prisma
- 3 – Envelope
$data['nVlComprimento'] = '16'; $data['nVlAltura'] = '5'; $data['nVlLargura'] = '15'; $data['nVlDiametro'] = '0';
Comprimento, Altura, Largura e Diâmetro da encomenda, incluindo a embalagem, o valor deverá ser em centímetros.
$data['sCdMaoPropria'] = 'n'; $data['nVlValorDeclarado'] = '0'; $data['sCdAvisoRecebimento'] = 'n'; $data['StrRetorno'] = 'xml';
“sCdMaoPropria”: Serviço de mãos própria, “n” para não e “s” para sim.
“nVlValorDeclarado”: Valor declarado da encomenda, em reais. Informar “0” para não utilizar esse serviço.
“sCdAvisoRecebimento”: Aviso de recebimento da mercadoria, “n” para não e “s” para sim.
“StrRetorno”: Formato de retorno do webservice.
- “XML” – Resultado no formato XML.
- “Popup” – Resultado será aberto em uma janela popup.
- “<URL>” – Resultado é enviado via post para uma página do requisitante.
$data['nCdServico'] = '40010,41106';
“nCdServico”: São os códigos do serviços que deverão ser inclusos e calculados, separados por virgula.
Código de serviço invalido, SEDEX e PAC foram alterados
- 40010 – SEDEX Varejo
- 40045 – SEDEX a Cobrar Varejo
- 40215 – SEDEX 10 Varejo
- 40290 – SEDEX Hoje Varejo
- 41106 – PAC Varejo
Observação: O código de outras modalidades deverão ser consultados no seu contrato junto aos Correios.
Fazendo a consulta
Agora que já temos os parâmetros necessários, vamos enviar para o webservice do Correios.
$data = http_build_query($data); $url = 'http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx'; $curl = curl_init($url . '?' . $data); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($curl); $result = simplexml_load_string($result);
Utilizando a função “http_build_query” convertemos nosso array em em uma string de consulta(query) em formato URL.
O endereço para realizar as consultas por meio de uma simples requisição GET: http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx
Já o endereço do Web service é: http://ws.correios.com.br/calculador/CalcPrecoPrazo.asmx
Com o “curl_init” preparamos a consulta passando a URL concatenada com os nossos parâmetros, definimos a configuração “CURLOPT_RETURNTRANSFER” como “true”, pois queremos o retorno e executamos a consulta utilizando o “curl_exec”.
Com o retorno do Correios no formato XML convertemos em um Objeto utilizando o “simplexml_load_string”, essa conversão é necessária para facilitar a leitura dos dados.
Processando o retorno
foreach($result -> cServico as $row){ if($row->Erro == 0){ // $row->Codigo // $row->PrazoEntrega // $row->Valor } }
Pronto, “Voilá” a consulta está feita.
Cada “row” no nosso “foreach” será um serviço retornado, no “if” valido se ocorreu algum erro com “$row->Erro == 0”, dessa forma podemos acessar o código, valor e prazo de cada resultado.
Você pode consultar os outros parâmetros retornado utilizando um “var_dump” no “row” ou no próprio “result”.
echo "<pre>"; var_dump($result); echo "</pre>";
Conclusão da consulta ao Webservice dos Correios pelo PHP
Teste incansavelmente o seu código e façavalidações e LOGs com o resultados antes de coloca-lo em produção.
Desenvolva validações para exibir apenas os serviços com valores superiores a zero ou crie uma rotina que analise se ocorreu algum erro nos cálculos e dispara um e-mail para você.
Você pode perder alguns “milissegundos” em desempenho no seu código, porém você pode evitar que a sua cabeça seja pedida caso ocorra algum problema.
Código Completo
$data = array(); $data['nCdEmpresa'] = ''; $data['sDsSenha'] = ''; $cep_origem = '86300000'; $cep = '86300000'; $peso = '0.100'; $data['sCepOrigem'] = $cep_origem; $data['sCepDestino'] = $cep; $data['nVlPeso'] = $peso; $data['nCdFormato'] = '1'; $data['nVlComprimento'] = '16'; $data['nVlAltura'] = '5'; $data['nVlLargura'] = '15'; $data['nVlDiametro'] = '0'; $data['sCdMaoPropria'] = 'n'; $data['nVlValorDeclarado'] = '0'; $data['sCdAvisoRecebimento'] = 'n'; $data['StrRetorno'] = 'xml'; $data['nCdServico'] = '40010,41106'; $data = http_build_query($data); $url = 'http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx'; $curl = curl_init($url . '?' . $data); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($curl); $result = simplexml_load_string($result); foreach($result -> cServico as $row){ if($row->Erro == 0){ echo $row->Codigo . " - " . $row->Valor . "</br>"; // $row->Codigo // $row->PrazoEntrega // $row->Valor } }
6 comentários sobre “Consultando Webservice dos Correios pelo PHP – Calculo de Frete”