Função para cálculo de frete a partir do novo webservice dos correios (atualizado)

Função para cálculo de frete a partir do novo webservice dos correios (atualizado)
4.5 36

A muito tempo atrás postamos uma função para cálculo de frete dos correios, posteriormente atualizamos ela e a algum tempo ela também parou de ser funcional devido a uma nova alteração no webservice dos correios. Agora vamos postar esta nova versão que diz respeito ao atual momento do webservice dos correios, esperamos que funcione por um bom tempo.

<?php
/*
DESENVOLVIDO POR EDGAR SERRA
http://www.edgarserra.com
*/
function calcula_frete($servico,$cep_origem,$cep_destino,$peso,$mao_propria,$valor_declarado,$aviso_recebimento){

$mao_propria = (strtolower($mao_propria) == 's')?'s':'n';
$aviso_recebimento = (strtolower($aviso_recebimento) == 's')?'s':'n';

$url = 'http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?nCdEmpresa=&sDsSenha=&sCepOrigem='. $cep_origem .'&sCepDestino='. $cep_destino .'&nVlPeso='. $peso .'&nCdFormato=1&nVlComprimento=20&nVlAltura=5&nVlLargura=15&sCdMaoPropria='. $mao_propria .'&nVlValorDeclarado='. $valor_declarado .'&sCdAvisoRecebimento='. $aviso_recebimento .'&nCdServico='. $servico .'&nVlDiametro=0&StrRetorno=xml';;

$frete_calcula = simplexml_load_string(file_get_contents($url));
/*
CASO QUEIRA VER TUDO QUE VEM DO SITE DOS CORREIOS, DESCOMENTE A LINHA ABAIXO.
echo print_r($frete_calcula);
*/
$frete = $frete_calcula->cServico;

if($frete->Erro == '0'){

    switch($frete->Codigo){
        case 04510: $servico = 'PAC'; break;
        case 40045: $servico = 'SEDEX a Cobrar'; break;
        case 40215: $servico = 'SEDEX 10'; break;
        case 40290: $servico = 'SEDEX Hoje'; break;
        default: $servico = 'SEDEX'; 
    }

    $retorno = 'Serviço: '.$servico.'
'; $retorno .= 'Valor: '.$frete->Valor.'
'; $retorno .= 'Prazo de entrega: '.$frete->PrazoEntrega.' dia(s)'; }elseif($frete->Erro == '7'){ $retorno = 'Serviço temporariamente indisponível, tente novamente mais tarde.'; }else{ $retorno = 'Erro no cálculo do frete, código de erro: '.$frete->Erro; } return $retorno; } /* A função é composta dos seguintes itens: $servico: Modalidade de frete, modalidadas válidas: 04510 - PAC (código antigo 41106 , alterado em 05/05/2017) 04014 - SEDEX (código antigo 40010, alterado em 05/05/2017) 40045 - SEDEX a Cobrar 40215 - SEDEX 10 40290 - SEDEX Hoje $cep_origem: CEP de origem, utilize apenas números! $cep_destino: CEP de destino, utilize apenas números! $peso: Peso da encomenda, qualquer valor entre 0.3 e 30 kg. $mao_propria: Entrega na sua casa, só são aceitos dois valores 's' e 'n', se for passado outro valor a função entenderá como 'n' $valor_declarado: Valor declarado da encomenda, se desejar declarar, por exemplo, R$1,00, use 100. $aviso_recebimento: Aviso de recebimento, só são aceitos dois valores 's' e 'n', se for passado outro valor a função entenderá como 'n' Abaixo o exemplo de uso: 04014 - Sedex 97032120 - CEP de origem 71939360 - CEP de destino 2 - Peso (2 kilos) n - Mão própria 700 - Valor declarado (R$7,00) s - Aviso de recebimento */ echo calcula_frete('04014','97032120','71939360','2','n','700','s'); ?>


Observe que só os parâmetros de acesso ao webservice mudaram, todo o resto da função continua igual a última versão postada.

Comentários (36)

  • Alexandre Schielke

    Nao é necessário os dados como altura, largura, comprimento, diamentro?

    09 de Novembro de 2018 às 00:05
  • Filipe

    Não sei o que acontece com o servidor dos Correios, está frequentemente dando erro. Mesmo no simulador aqui: http://ws.correios.com.br/calculador/CalcPrecoPrazo.asmx?op=CalcPrecoPrazo

    De cada 10 consultas, 3 a 5 dão essa página de erro:

    Server Error in Application "DEFAULT WEB SITE/CALCULADOR"
    HTTP Error 503.2 - Service Unavailable
    The serverRuntime@appConcurrentRequestLimit setting is being exceeded.

    11 de Janeiro de 2018 às 04:30
  • FAbio

    Então, sou meio novo nisso. Criei uma loja virtual e me falta colocar para calcular os valores dos fretes. Como posso fazer o uso desse código ai, dentro do meu código pronto?
    ME ajuda por favor. QUalquer coisa me mande um email que passo mais informações.
    fabioalvesdourado@gmail.com

    06 de Dezembro de 2017 às 23:49
    • Edgar Serra

      Recomendo que você contrate um profissional.

      14 de Dezembro de 2017 às 22:24
  • fabiano

    so tenho uma duvida, tentei criar mais um echo para mostrar sedex e pac,mas ele calcula certo os dois mas erra na pare onde diz o nome do serviço, mostra sedex nos dois. so este erro, como corrigir? obrigado

    04 de Julho de 2017 às 15:37
  • carlos

    Pode me ajudar Edgar ??

    uso sua função em meu codigo de calculo dos correios

    estava ok até dia 22 de maio depois parou de mostrar os valores e prazos

    24 de Maio de 2017 às 21:18
    • Edgar Serra

      Altere o código de serviço dos produtos:
      PAC de 41106 para 04510
      SEDEX de 40010 para 04014

      25 de Maio de 2017 às 00:09
  • Bruno Augusto Ramos Pires

    Bom dia,

    eu alterei para o código novo e mesmo assim não esta funcionando. Alterou mais alguma coisa na função do correios?

    16 de Maio de 2017 às 08:56
    • Edgar Serra

      Acabei de copiar e executar o código que está no post e está perfeitamente funcional apenas com a alteração dos códigos de serviço.

      17 de Maio de 2017 às 20:41
  • D. Mendes

    Bom dia,

    Eu usava " const URL_CALCULADOR = 'http://ws.correios.com.br/calculador/CalcPrecoPrazo.asmx?WSDL';"

    devo fazer alguma modificação ?

    15 de Maio de 2017 às 17:16
    • Edgar Serra

      Em tense apenas a os códigos dos produtos foram alterados:
      PAC de 41106 para 04510
      SEDEX de 40010 para 04014

      17 de Maio de 2017 às 20:40
  • Alexandre Carmo

    Amigo a função mudou de novo agora em 2017, atualiza pra gente, seu trabalho é muito importante para ajudar os que precisam de dicas de profissionais

    06 de Maio de 2017 às 17:44
    • Edgar Serra

      A única coisa que mudou foram os códigos de serviço:
      PAC de 41106 para 04510
      SEDEX de 40010 para 04014

      O resto continua exatamente igual. Já atualizei no script.

      14 de Maio de 2017 às 00:00
  • Alessandro

    Olá!

    Obrigado pelo tempo em criar e oferecer esse script.

    Qual seria a forma de informar as variaveis através da URL?

    Obrigado!

    08 de Agosto de 2016 às 00:38
    • Edgar Serra

      O modo de uso está claramente explicado no artigo.

      08 de Agosto de 2016 às 08:22
  • RODRIGO A ABREU

    Boa noite amigo. Uma dúvida que vem me atormentando a um tempo. Tem alguns CEPS que simplesmente não dão certo e a função apesar de receber os valores do frete e tempo de entrega, retorna tudo como zero (0). Por exemplo o CEP de destino 08161-190 é um CEP que existe e por conta do erro 010 a função simplesmente buga. Pode ajudar?

    25 de Junho de 2016 às 01:39
    • Edgar Serra

      Troque o:
      if($frete->Erro == '0'){

      Por:
      if($frete->Erro == '0' OR $frete->Erro == '010'){

      25 de Junho de 2016 às 21:47
  • Sergio Junior

    amigo vc tem um exemplo pra webservice de consulta a objetos (rastreamento)

    17 de Junho de 2016 às 03:02
  • Marcos

    Como eu retornaria o valor do frete na mesma página ? Exemplo, se eu tivesse um campo apenas para o usuário digitar o próprio CEP (CEP de destino), um campo pro usuário escolher o tipo do frete (PAC, SEDEX), um botão calcular frete e um campo para mostrar o valor do frete. Os outros dados seriam inseridos por mim mesmo e a quantidade seria a quantidade do carrinho de compras. Tem como fazer isso sem atualizar a página ? Poderia me indicar qual direção tomar se isso for possível ? Obrigado.

    06 de Outubro de 2015 às 02:40
    • Edgar Serra

      Basta implementar com ajax.

      06 de Outubro de 2015 às 16:32
  • Rodrigo Augusto de Abreu

    Cara vc salvou minha vida, hoje meu site parou e funcionar por conta da função antiga... obrigado mesmo! Agora tudo esta 100% novamente.

    05 de Outubro de 2015 às 04:39
  • Rodrigo

    Olá Edgar, tudo bem? Espero que sim!

    Estou tentando passar o cep_origem e cep_destino para a função esta dando erro.

    Ex: echo calcula_frete('40010',$cep_origem,$cep_destino,'2','n','700','s');

    Já tentei com aspas simples e sem aspas como no exemplo acima.

    Será que estou fazendo alguma besteira?

    Bom blog te acompanho sempre! Abraços...

    15 de Setembro de 2015 às 15:17
    • Edgar Serra

      A função funciona perfeitamente, a única explicação seria as variáveis que você criou não existirem antes de você chamar a função, neste caso não existiriam os CEPs e retornaria erro mesmo.

      Exemplo para você testar:
      $cep_origem = '97032120';
      $cep_destino = '71939360';
      echo calcula_frete('40010',$cep_origem,$cep_destino,'2','n','700','s');

      15 de Setembro de 2015 às 21:34
  • Rodrigo

    Estava pesando aqui!

    E quando o pedido tiver mais de um produtos pedido com medidas de embalagens diferente. Como deve ser passado essas informações para o calculo exato do frete a ser pago do total dos itens?

    Já tive problemas com isso uma vez.

    Obrigado!

    22 de Julho de 2015 às 01:29
    • Edgar Serra

      Pegue as maiores dimensões (comprimento x largura) e some a altura dos itens, basicamente como se você empilhasse eles para fazer o pacote, aliado a isto some o peso total.

      22 de Julho de 2015 às 23:36
  • ronaldo

    salvou minha vida rsrs

    12 de Julho de 2015 às 21:51
  • Rafael Severino

    Boa noite, tem como alterar o resultado do prazo, deixando ele um pouco mais longo, para que o cliente não venha a receber com atraso caso haja qualquer eventualidade

    19 de Abril de 2015 às 20:05
    • Edgar Serra

      Rafael, o prazo é o passado pelos correios, se você quer um prazo maior, pode implementar isto diretamente no seu sistema.

      21 de Abril de 2015 às 18:53
  • Nelson Marques

    Estou precisando de um script para colocar em página do MercadoLivre que possibilite ao comprador calcular prazo de entrega para envios por carta registrada

    11 de Dezembro de 2014 às 17:17
  • Luis Giehl

    Boa noite Edgar. Parece que os parâmetros de acesso ao webservice mudaram novamente. Voce faz ideia de qual seja agora?

    27 de Novembro de 2014 às 16:33
    • Edgar Serra

      Bom dia Luis, todos meus clientes utilizam este mesmo script e continua funcional.

      29 de Novembro de 2014 às 11:07
  • Marcia

    Bom dia, tenho um template no ML ( html) e preciso montar um calculador de frete com E-sedex. porem nao entendo de php.
    Voce conseguem montar um calculador com : PAC, SEDEX e E-sedex para eu usar no Ml?

    04 de Agosto de 2014 às 08:57
    • Edgar Serra

      Marcia, até consigo, mas já existem empresas que disponibilizam isto de graça, basta pesquisar.

      04 de Agosto de 2014 às 17:00
  • Regis

    Segue um exemplo sobre como testar o web service dos correios usando a ferramenta SoapUI

    http://regifelix.com/2013/01/06/testes-de-web-services-com-a-ferramenta-soapui/

    06 de Janeiro de 2013 às 14:27
  • Wellington Cunha

    public function calcularFrete($config){
    extract($config);

    if(!isset($sCepOrigem) || $sCepOrigem == '') $sCepOrigem = '81330000';
    if(!isset($nCdFormato) || $nCdFormato == '') $nCdFormato = '1';
    if(!isset($sCdMaoPropria) || $sCdMaoPropria == '') $sCdMaoPropria = 'n';
    if(!isset($nVlValorDeclarado) || $nVlValorDeclarado == '') $nVlValorDeclarado = '0';
    if(!isset($sCdAvisoRecebimento) || $sCdAvisoRecebimento == '') $sCdAvisoRecebimento = 'n';
    if(!isset($nCdServico) || $nCdServico == '') $nCdServico = '41106';
    if(!isset($nVlDiametro) || $nVlDiametro == '') $nVlDiametro = '0';
    if(!isset($StrRetorno) || $StrRetorno == '') $StrRetorno = 'xml';
    if(!isset($nVlPeso) || $nVlPeso == $nVlPeso) $nVlPeso = '1';
    if(!isset($nVlComprimento) || $nVlComprimento == '') $nVlComprimento = '20';
    if(!isset($nVlAltura) || $nVlAltura == '') $nVlAltura = '5';
    if(!isset($nVlLargura) || $nVlLargura == '') $nVlLargura = '15';

    $url = 'http://ws.correios.com.br/calculador/CalcPrecoPrazo.aspx?nCdEmpresa=' . @$nCdEmpresa . '&sDsSenha=' . @$sDsSenha . '&sCepOrigem='. $sCepOrigem . '&sCepDestino=' . $sCepDestino . '&nVlPeso=' . $nVlPeso .'&nCdFormato=' . $nCdFormato . '&nVlComprimento=' . $nVlComprimento . '&nVlAltura=' . $nVlAltura . '&nVlLargura=' . $nVlLargura . '&sCdMaoPropria=' . $sCdMaoPropria . '&nVlValorDeclarado=' . $nVlValorDeclarado . '&sCdAvisoRecebimento='. $sCdAvisoRecebimento . '&nCdServico='. $nCdServico .'&nVlDiametro=' . $nVlDiametro . '&StrRetorno=' . $StrRetorno;

    $calculo = simplexml_load_string(file_get_contents($url));

    return $calculo;
    }

    16 de Dezembro de 2012 às 06:28

Comente =)

Atenção: Todos os comentários são moderados, por isto não perca seu tempo postando bobagens ou spam.