PHP

Consultando Webservice dos Correios pelo PHP – Calculo de Frete

Como consultar o service dos pelo , utilizando a biblioteca . 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 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.
  • “” – 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 "
";
var_dump($result);
echo "
";

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  . "";

    // $row->Codigo
    // $row->PrazoEntrega
    // $row->Valor 

  }

}

 

Resumo
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

Ver comentários

  • Mais uma dúvida, se eu não utilizar o peso cubico e somar os pesos de forma simples, qual seria o problema?

    • 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.

  • 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!

    • 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.

  • 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?

Post Recentes

Por que devo sempre manter o Magento 2 atualizado?

Segurança: Atualizações frequentes geralmente incluem patches de segurança para corrigir vulnerabilidades identificadas. Ao manter o Magento atualizado, você reduz significativamente…

1 mês atrás

Adicionar uma mensagem de Alerta ou Aviso do Admin do Magento 2

Como adicionar uma mensagem de Alerta ou Aviso do Admin do Magento 2 Injete o Magento\Framework\Message\ManagerInterface no construtor da sua…

1 mês atrás

Exibir mensagens erro/sucesso da Classe: Magento\Framework\Message\ManagerInterface

Para exibir as mensagens adicionadas na classe Magento\Framework\Message\ManagerInterface em um arquivo .phtml, você pode usar o seguinte código: <?php $objectManager…

1 mês atrás

Exportar as categorias do Magento 2 em um XML

Para criar um script no Magento 2 que exporte as categorias para um arquivo XML com o nome da categoria,…

2 meses atrás

Colocar um video como Background utilizando HTML + CSS

Para definir um vídeo MP4 como plano de fundo em um <div> usando HTML e CSS, você pode seguir estas…

4 meses atrás

Desativar o “lastname” no Magento 2

Como desativar o "lastname" no Magento 2 e Adobe Commerce Desativando a obrigatoriedade do campo Execute a SQL abaixo diretamente…

4 meses atrás