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