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.
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.
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.
$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.
$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.
$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
Observação: O código de outras modalidades deverão ser consultados no seu contrato junto aos Correios.
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.
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 "";
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.
$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 } }
Segurança: Atualizações frequentes geralmente incluem patches de segurança para corrigir vulnerabilidades identificadas. Ao manter o Magento atualizado, você reduz significativamente…
Como adicionar uma mensagem de Alerta ou Aviso do Admin do Magento 2 Injete o Magento\Framework\Message\ManagerInterface no construtor da sua…
Para exibir as mensagens adicionadas na classe Magento\Framework\Message\ManagerInterface em um arquivo .phtml, você pode usar o seguinte código: <?php $objectManager…
Para criar um script no Magento 2 que exporte as categorias para um arquivo XML com o nome da categoria,…
Para definir um vídeo MP4 como plano de fundo em um <div> usando HTML e CSS, você pode seguir estas…
Como desativar o "lastname" no Magento 2 e Adobe Commerce Desativando a obrigatoriedade do campo Execute a SQL abaixo diretamente…
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?
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