Agregando conhecimento…
Recentemente o site dos Correios disponibilizou (outro) webservice para o calculo de frete. Infelizmente eles desativaram o webservice anteiror, deixando muita gente na mão. A ferramenta disponibilizada pela Locaweb ainda funciona para os sites que estão hospedados lá. Para os que não estão devem atualizar seus scripts.
Vou deixar aqui a função que eu adaptei de outro webservice. Fiquem a vontade para editar o código de acordo com suas necessidades, criticar ou sugerir alguma implementação. A função recebe o cep destinatário, peso e como você quer o retorno: objeto, array ou json. Vocês notarão que Webservice disponível pode calcular simultaneamente mais de um tipo de frete, por exemplo PAC e SEDEX na mesma consulta.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 | /* * * Essa função utiliza o cep do remetente fixo dentro da função * Você especifica o cep destino e peso * o terceiro parametro é como você quer o retorno: * 'objeto', 'arrray', 'json' * * Se você precisar especificar mais variáveis para o PAC fique a vontade para atualizar a função * XD divirta-se * */ function frete_correios($cep_destino, $peso='0.300', $retorno = 'array') { // TRATA OS CEP'S $cep_destino = eregi_replace("([^0-9])",'',$cep_destino); $cep_origem = '79050020';// CEP DE QUEM ESTÁ ENVIANDO (LOJA - SE VC QUISER PODE PUXAR DO BANCO DE DADOS) /* * TIPOS DE FRETE * 41106 = PAC sem contrato 40010 = SEDEX sem contrato 40045 = SEDEX a Cobrar, sem contrato 40215 = SEDEX 10, sem contrato 40290 = SEDEX Hoje, sem contrato 40096 = SEDEX com contrato 40436 = SEDEX com contrato 40444 = SEDEX com contrato 81019 = e-SEDEX, com contrato 41068 = PAC com contrato * * */ // ESTE ARRAYS PARA O RETORNO (NO MEU CASO SÓ QUERO MOSTRAR ESTES) $rotulo = array('41068'=>'PAC','40436'=>'SEDEX','81019'=>'ESEDEX'); //$webservice = 'http://shopping.correios.com.br/wbm/shopping/script/CalcPrecoPrazo.asmx?WSDL';// URL ANTIGA $webservice = 'http://ws.correios.com.br/calculador/CalcPrecoPrazo.asmx?WSDL'; // TORNA EM OBJETO AS VARIAVEIS $parms = new stdClass; $parms->nCdServico = '41068,40436,81019';// PAC, SEDEX E ESEDEX (TODOS COM CONTRATO) - se vc precisar de mais tipos adicione aqui $parms->nCdEmpresa = '';// <- LOGIN DO CADASTRO NO CORREIOS (OPCIONAL) $parms->sDsSenha = '';// <- SENHA DO CADASTRO NO CORREIOS (OPCIONAL) $parms->StrRetorno = 'xml'; // DADOS DINAMICOS $parms->sCepDestino = $cep_destino;// CEP CLIENTE $parms->sCepOrigem = $cep_origem;// CEP DA LOJA (BD) $parms->nVlPeso = $peso; // VALORES MINIMOS DO PAC (SE VC PRECISAR ESPECIFICAR OUTROS FAÇA ISSO AQUI) $parms->nVlComprimento = '18'; $parms->nVlDiametro = 5; $parms->nVlAltura = 2; $parms->nVlLargura = 11; // OUTROS OBRIGATORIOS (MESMO VAZIO) $parms->nCdFormato = 1; $parms->sCdMaoPropria = 'N'; $parms->nVlValorDeclarado = 0; $parms->sCdAvisoRecebimento = 'N'; // Inicializa o cliente SOAP $soap = @new SoapClient($webservice, array( 'trace' => true, 'exceptions' => true, 'compression' => SOAP_COMPRESSION_ACCEPT | SOAP_COMPRESSION_GZIP, 'connection_timeout' => 1000 )); // Resgata o valor calculado $resposta = $soap->CalcPrecoPrazo($parms); $objeto = $resposta->CalcPrecoPrazoResult->Servicos->cServico; $array = array(); foreach($objeto as $obj) { $tipo = isset($rotulo[$obj->Codigo]) ? strtolower($rotulo[$obj->Codigo]) : ''; if($tipo!='') { $array[$tipo] = array('tipo'=>strtoupper($tipo),'valor'=>str_replace(',','.',$obj->Valor),'prazo'=>$obj->PrazoEntrega,'erro'=>$obj->Erro,'msg'=>$obj->MsgErro); } } // RETORNO if($retorno == 'objeto') { return $objeto; } elseif($retorno == 'json') { $json = json_encode($array); return $json; } else { return $array; } } |
Aproveitem o dia
Página para publicar e armazenar conteúdo relacionado a Desenvolvimento Web:
PHP, MySQL, Javascript, JQuery, CSS e as novas tecnologias do momento.
Façam comentários, perguntas e sugestões que ficarei satisfeito por recebê-los.
Shiguenori Junior
Ruben
agosto 21st, 2010 at 11:18
Nosssa!!!! Muito bom seu script, você poderia me dizer onde os correios tem um manual para a implementação disso?
Obg
Gabriel
agosto 23rd, 2010 at 12:47
desculpe a ignorancia mais vc podia deixar um exemplo de uso do seu script
Irineu Martins Junior
agosto 24th, 2010 at 18:03
Muito interessante o seu script. Vou fazer alguns testes aqui na empresa.
Parabens.
Obrigado por compartilhar.
Gladson
agosto 25th, 2010 at 18:07
Olá estamos com dificuldades com o webservices dos correios você esta acessando por soap normalmente?
Rafael Brandão
agosto 26th, 2010 at 13:09
Só eu que to tendo esse problema ou esse novo endereço é MUUUUUUITO mais lento que o antigo? Às vez até cai… alguém conhece uma outra alternativa? Mesmo paga?
Junior
agosto 27th, 2010 at 13:23
@Rubben tem o manual eu encontrei neste link. Agora é só esperar eles melhorarem o desempenho e não ficar trocando o endereço.
Junior
agosto 27th, 2010 at 13:32
@Gabriel tá desculpado. Brincadeiras a parte, utilize assim:
Note que na função (linha 32) eu especifiquei 3 tipos (pac, sedex e e-sedex) vc pode allterar conforme sua necessidade (pode adicionar todos, deixar só um), o terceiro parâmetro da função pode receber: ‘array’, ‘objeto’ ou ‘json’ para facilitar o seu retorno. Havendo dúvidas não exite em perguntar.
Junior
agosto 27th, 2010 at 13:45
@Gladson sim, testei hoje e funcionou, uma coisa que eu notei no site de um cliente é que este serviço está muito instável. Meu cliente tem muitas queixas deste novo webservice. Mas parece que temos que esperar eles arrumarem isso. Até mais.
Junior
agosto 27th, 2010 at 13:54
@Rafael Brandão não é só vc que reclama deste novo serviço dos correios. Se o site estiver na Locaweb AINDA dá para usar a ferramenta deles, mas vc vai precisar estar hospedado lá. Para calcular frete ainda estou procurando outras opções. Para buscar endereço parece que é mais fácil, eu estou utilizando do Republica Virtual, mas parece que existe vários outros também gratuito. Quem souber de alguma ferramenta ou webservice e quiser compartilhar deixe o recado.
Rodrigo
setembro 18th, 2010 at 18:59
Fala!
O código ta bom!!
To encontrando um problema, ta me retornando erro 34 dos correios, Codigo Administrativo ou Senha invalidos.
Alguem teve esse problema? o ocdigo da empresa e a senha eu deixei vazio como no codigo.
Junior
setembro 21st, 2010 at 13:08
@Rodrigo até onde eu sei estes dois campos são opcionais, vc está utilizando o webservice como no exemplo? Caso vc não seja cadastrado estes devem ir vazio.
Reinaldo Deprera
outubro 16th, 2010 at 8:44
@Rodrigo O erro ocorre pois o autor utilizou serviços do correio que utiliza contrato. Faça isso:
$rotulo = array(’41106′ => ‘PAC’, ’40010′ => ‘SEDEX sem contrato’);
e isso:
$parms->nCdServico = ’41106,40010′;
Outra coisa, o código do autor não irá funcionar caso utilize a opção de retorno <> e você solicite apenas 1 serviço na variavel retorno e no parametro nCdServico do objeto params, supra citado. Para corrigir isso, altere o respectivo código:
if(is_array($objeto))
{
foreach($objeto as $obj)
{
$tipo = isset($rotulo[$obj->Codigo]) ? strtolower($rotulo[$obj->Codigo]) : ”;
if($tipo!=”)
{
$array[$tipo] = array(‘tipo’=>strtoupper($tipo),’valor’=>str_replace(‘,’,’.’,$obj->Valor),’prazo’=>$obj->PrazoEntrega,’erro’=>$obj->Erro,’msg’=>$obj->MsgErro);
}
}
}
else
{
$tipo = isset($rotulo[$objeto->Codigo]) ? strtolower($rotulo[$objeto->Codigo]) : ”;
if($tipo!=”)
{
$array[$tipo] = array(‘tipo’=>strtoupper($tipo),’valor’=>str_replace(‘,’,’.’,$objeto->Valor),’prazo’=>$objeto->PrazoEntrega,’erro’=>$objeto->Erro,’msg’=>$objeto->MsgErro);
}
}
Reinaldo Deprera
outubro 16th, 2010 at 8:47
@Rodrigo Corrigindo o post anterior:
Ao postar o blog retirou uma palavra (ARRAY) quando me referi que nao iria funcionar em uma opção de retorno com um serviço somente de parametro. A opção que foi cortada onde está , no caso é a opção ARRAY
Bruno
novembro 4th, 2010 at 12:11
O webservice ainda continua ficando offline?
Junior
novembro 12th, 2010 at 9:37
@Bruno eventualmente acontece, mas está diminuindo essa instabilidade
Carlos Samurai Nakane
março 12th, 2011 at 14:34
Fantastico, vai me ajudar muito. Obrigado!
Luís
maio 18th, 2011 at 10:02
Muito bom parabens!
Me ajuda, no dia 21/04/2011 o correio atualilou e ficou obrigatorio o uso da medidas para maioria dos serviços:
http://www.correios.com.br/webservices/ como que fica agora?
Junior
maio 18th, 2011 at 11:08
@Luís eu testei agora e o script funcionou, vc está utilizando o código acima? Lembre de alterar o nCdServico para o que vc precisa, se vc utilizar um código com contrato é necessário informar login e senha.
tulio
junho 17th, 2011 at 12:18
Olá amigo, onde eu me cadastro no site do correios para conseguir um login e senha? É gratuito?
Junior
junho 24th, 2011 at 16:38
@tulio não, este serviço dos correios não é gratuito, como o nome diz PAC COM CONTRATO, SEDEX COM CONTRATO. É necessário fazer um contrato com eles para eles te darem o desconto, dependendo do contrato (quantidade encomendas que você enviar) eles te dão o código do contrato, login e senha.
Pablo Garcia
julho 10th, 2011 at 13:31
Ola,
segue um serviço muito bom e dependendo do volume de acesso é gratuito.
http://www.wscepbrasil.com.br
Att
Junior
julho 19th, 2011 at 19:18
@Pablo Garcia Tá parecendo MySQL (gratuito até um certo ponto). Eu acessei o site e não encontrei como utilizá-lo, vc tem alguma documentação ou exemplos para mostrar? Outra coisa o banco de dados é de 10/2009 mesmo? É atualizado de quanto em quanto tempo?
Leonardo
agosto 24th, 2011 at 16:37
Muito bom ! parabéns junior
Sergio Afornalli
novembro 20th, 2011 at 11:38
Olá, boa tarde.
Gostaria de agradecer pelas instruções aqui passadas por você. Foram de grande ajuda. Obrigado
João Paulo
janeiro 7th, 2012 at 15:14
Para usar em PHP 5.3.0 altere:
$cep_destino = eregi_replace(“([^0-9])”,”,$cep_destino);
PARA
$cep_destino = preg_match (“[^0-9]“, “”, $cep_destino);
MIXVIRTUAL.COM.BR
janeiro 13th, 2012 at 19:21
Ótima solução “mastigada” e “digerida” para os desenvolvedores. Parabéns! Pena que os Correios, como a maioria dos órgãos governamentais, fazem suas mudanças e muitas vezes deixam o usuário na mão… Como ocorreu recentemente com a alteração da consulta de Frete/Cep. Imaginem quantos lojistas/e-commerce ficaram na mão por conta disso.
Eu particularmente, utilizava a consulta do CEP LIVRE (http://ceplivre.pc2consultoria.com/index.php) que inclusive era apoiado/mantido por vários desenvolvedores, e de uma hora para outra a empresa mudou o acesso. Muita gente não gostou e teve problema, mas como diz o ditado “é o preço do progresso”… ou resumindo, pimenta no ** dos outros é refresco. Valeu demais, parabéns pelo excelente script!!!!
Marciano C.Rocha
fevereiro 7th, 2012 at 16:12
teria está função em ASP
Junior
março 11th, 2012 at 18:57
@Marciano C.Rocha não programo em ASP, mas se precisar de ajuda pode contar comigo. A primeira coisa que precisamos saber é se no ASP existe uma função ou classe equivalente ao SoapClient.
Cleverson Sacramento
março 12th, 2012 at 23:22
Olá, criei um RESTful Web Service para rastreamento de encomendas dos Correios no formato JSON. Para quem estiver interessado, olha o post que eu fiz. Ah, é de graça!
http://cleversonsacramento.com/2012/03/12/restful-web-services-dos-correios/
Regis
janeiro 6th, 2013 at 18:32
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/
criar loja virtual
março 15th, 2013 at 14:17
Olá, gostaria de agradecer pelas dicas que deram. Foi o único blog que conseguiu me dar uma luz. Obrigado.