Consultando Webservice dos Correios pelo PHP – Calculo de Frete

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.

calcular o frete pelo Webservice dos Correios pelo PHP

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 

  }

}

 

Resumo
Realizar um calculo de frete pelo Webservice do Correios utilizando PHP
Nome do Artigo
Realizar um calculo de frete pelo Webservice do Correios utilizando PHP
Descrição
Como consultar o Webservice dos Correios pelo PHP utilizando a biblioteca cURL, preparando cada parâmetro e processando o retorno no formato XML
Autor
Editor
Roger Mauricio Takemiya
Logo do Editor

6 comentários sobre “Consultando Webservice dos Correios pelo PHP – Calculo de Frete

    1. Problema é que o valor cobrado pelo correios poderá ser mais caro, neste caso você (a loja virtual) poderá perder uma venda pelo excesso no valor do frete.
  1. Olá Roger tudo bem? Você pode estar me ajudando? Gostaria de saber como é a formula para calcular o peso cubico de uma postagem, muito obrigado!
    1. Olá Paulo, obrigado pelo comentário! A formula utilizada é: (($itemAltura * $itemLargura * $itemComprimento) * $quantidade ) / $coeficiente_volume. $coeficiente_volume é o valor fixo de 6000 Você terá que fazer esse calculo para cada item, somando todos em um único valor.
  2. Olá Roger, tudo bem? Cara muito bom seu post, porém tenho uma dúvida, como faria pra fazer a consulta de multiplos produtos, como um carrinho de compras?
    1. Lucas, boa noite Você pode simplesmente somar o peso dos produtos que estão no carrinho e no campo Largura, Altura, Comprimento passar os valores da caixa que é mais utilizada no despacho dos produtos e acrescentar 20% no valor do frete, dessa forma você não precisa se preocupar em calcular o tamanho de uma unica caixa com todos os produtos. Mais caso você queria fazer o calculo preciso o Correios trabalha com peso cubico dá uma lida neste material: https://www.correios.com.br/para-sua-empresa/comercio-eletronico/como-calcular-precos-e-prazos-de-entrega-em-sua-loja-on-line

Dúvidas? Faça um comentário logo abaixo ou envie uma mensagem clicando aqui.

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *