Pular para o conteúdo principal

Rastreamento de Pedidos : Correios - PHP + SOAP

Nota Importante: Olá, esse mesmo artigo encontra-se atualizado em um novo site de minha autoria, o Sooho http://sooho.com.br/2017/03/24/rastreamento-de-pedidos-correios-php-soap/ , dêem preferência ao conteúdo ali contido, visto futuramente este blog ficara obsoleto. Obrigado. 

O Código que se segue, é uma alternativa para rastrear objetos do Correio através do PHP com a tecnologia SOAP. Uma vez que a API mais antiga dos correios - PHP + XML -, não tem funcionado corretamente, resolvi por publicar esse método simples que espero ser de alguma ajuda a quem necessite.

Codígo melhorado no Github: https://github.com/osians/rastreamento-de-pedidos/

Bom, eu não vou me ater a uma extensa explicação sobre os detalhes do código, apenas gostaria de frisar algumas notas importantes. 


 - Primeiro:  se você pretende utilizar a API dos correios, tire um tempo e vá até uma Agência e solicite sua senha e username para uso da mesma. 
 - Segundo: A documentação para compreender a terminologia dos correios, encontra-se em https://www.correios.com.br/para-voce/correios-de-a-a-z/pdf/rastreamento-de-objetos/manual_rastreamentoobjetosws.pdf/view . Creio que toda a informação necessária para implementar um sistema completo, encontra-se no PDF. Infelizmente, a documentação não conta com uma implementação em PHP, por isso, resolvi desenvolver esta de forma rápida, para dar um norte a quem pretende usar a mesma via SOAP.
Caso tenha dúvidas, entre em contato ou deixe seu comentário, ficarei feliz em ajudar.

Segue imagem:








































Código (para copiar e colar):

function rastrearObjeto( $__codigo )
{
    //@var string - URL dos correios para obter dados
    $__wsdl = "http://webservice.correios.com.br/service/rastro/Rastro.wsdl";

    //@var array - a ser usado com parametro para 1 objeto
    $_buscaEventos = array(
        'usuario'   => 'ECT',
        'senha'     => 'SRO',
        'tipo'      => 'L',
        'resultado' => 'T',
        'lingua'    => '101'
    );
    $_buscaEventos['objetos'] = $__codigo;

    // criando objeto soap a partir da URL
    $client = new SoapClient( $__wsdl );
    $r = $client->buscaEventos( $_buscaEventos );

    // sempre retorna objeto por padrao
    return $r->return->objeto;
}

// rastreando um objeto teste hipotetico
$objeto = rastrearObjeto( 'JF598971235BR' );

if(! isset( $objeto->erro ) ):
    foreach ($objeto->evento as $e):
        var_dump( $e );
    endforeach;
else:
    echo $objeto->numero . ": ". $objeto->erro;
endif;




Comentários

  1. Muito bom cara, parabéns e obrigado :)

    ResponderExcluir
  2. Cara esta com erro, esta aparecendo Notice: Array to string conversion in, nessa parte aqui $r = $client->buscaEventos( $_buscaEventos ); vc esta passando uma string em um array. teria que percorrer o array ou não ?

    ResponderExcluir
    Respostas
    1. Olá obrigado pelo feedback. Bom, considere seguir o código contido no GITHUB como exemplo: https://github.com/osians/rastreamento-de-pedidos/blob/master/exemplo-01.php

      A variável "$r" espera obter uma string, note que caso os desenvolvedores dos correios decidam mudar o tipo de dado retornado na API deles (string para array ou para object) isso afeta a forma como a variável "$r" deve ser processada, por isso é bom nunca confiar no tipo de dado de terceiros. Eu aconselho a sempre verificar se "$r" é uma string ou um Array. Caso seja um Array ( if(is_array($r)... ), então seria exatamente como você falou, percorrer o Array exibindo cada indice como string!

      Excluir
    2. sim é só a pessoa fazer um foreach antes do que ele vai passar do código dos correios...
      cara fazendo desse jeito, como percorre um array de objetos, pq o que vem dos correios vem assim :
      stdClass Object
      (
      [numero] => PI225478211BR
      [evento] => Array
      (
      [0] => stdClass Object
      (
      [tipo] => OEC
      [destino] => stdClass Object
      (
      [local] => CDD PARNAMIRIM
      )
      )
      )
      )

      como percorrer isso alguem ai tem uma idéia ?

      Excluir
    3. Funciona da seguinte forma, digamos que a resposta dos correios está dentro de uma variável chamada $obj, logo, você pode acessar direto todos os itens da resposta que tiverem tipos de dados primitivos(integer, string, bool):
      echo "NUMERO: " . $obj -> numero ;
      já no caso de um tipo de dado Array, como é o caso de evento:
      foreach( $obj -> evento as $ev ):
      echo "TIPO: " . $ev -> tipo . "
      " ;
      echo "STATUS: " . $ev -> status . "
      " ;
      echo "DATA: " . $ev -> data . "
      " ;
      echo "HORA: " . $ev -> hora . "
      " ;
      echo "DESCRICAO: " . $ev -> descricao . "
      " ;
      endforeach;

      Excluir
    4. Entendi, deu certo, vamos supor que eu mando varias informações para o correios e ele me retorna inúmeras números desse ex: [numero] => PI225478211BR ... um diferente do outro, como eu faço para fazer um foreach nele pegando todos os conteúdos que tem dentro de cada um ? vc tem idéia Osians.

      Excluir
    5. Essa é uma ótima questão! Em verdade, no caso do código contido nesse artigo, a API dos Correios nunca irá retornar mais do que 1 número de identificação de produto. Por que esse código acima é especifico para pesquisar o rastreamento de apenas 1 objeto. Se você quiser rastrear mais do que 1 objeto, você precisa alterar o código acima em alguns lugares.

      1. Em primeiro lugar, você iria passar os números de todos os objetos em uma única string sem espaços ou caracteres separadores, a exemplo:
      $objeto = rastrearObjeto( 'JF598971235BRPI225478211BRSQ458226057BR' );

      2. Em segundo lugar, você teria que alterar a função "rastrearObjeto" para fazer a chamada para uma outra função da API dos Correios, que é especifica para o rastreamento de até no máximo 5.000 objetos:
      $r = $client->buscaEventosLista( $_buscaEventos );

      3. O XML retornado por essa chamada seria um pouco diferente, e o retorno da função "rastrearObjeto" teria que ser alterado para:
      return $r->return;

      4. Por fim, para percorrer os objetos retornados pelo função "rastrearObjeto", você teria que verificar primeiro qual o numero de objetos que retornados, e então destrinchar cada evento em particular.
      for($i = 0; $i < $objeto->qtd ; $i++):

      if(! isset( $objeto->erro ) ):
      foreach ($objeto[$i]->evento as $e):
      var_dump( $e );
      endforeach;
      else:
      echo $objeto->numero . ": ". $objeto->erro;
      endif;

      endfor;

      Enfim, esse é o caminho para o rastreamento de N objetos. Eu não testei o código, mas em teoria seria isso. Espero que isso possa ser de alguma ajuda.

      Excluir
    6. Osians pode mandar até 50 números de identificação pro correios eu liguei lá...o que eu to querendo saber é se me vem 50 números de identificação, como eu eu faço um foreach em cada número de identificação, sendo que cada número de identificação traz o conteúdo, por exemplo:
      traz evento, destino e local...
      tem idéia de como fazer isso ?

      Excluir
    7. Osians vc tem e-mail ou skype pra eu t mostrar um exemplo que eu estou fazendo? se tiver me passa fazendo favor...

      Excluir
    8. email: sans.pds@gmail.com
      skype: sans.pds

      Excluir
    9. no skype aparece wandeco sans ... é isso mesmo ?

      Excluir
    10. Sim é isso mesmo. Acredito que têm 1 ou 2 com o mesmo nome, ambos são meus, mas 1 está inativo. Adicione-os.

      Excluir
    11. ok, adicionei os dois, e ja mandei a solicitaçõa, vc nõa entra muito no skype né ?..
      eu refiz aquela parte que vc deu a dica de jogar N objetos e trazer N objetos, porem esta sem sucesso, só que eu fiz com o código que vc mostrou logo a cima, sem ser o do github...

      Excluir
  3. Pessoal este código nao retorna a variável "status->descrição" caso a mesma tenha somente o objeto ou um único registro, ou seja nunca retornara que a encomenda foi postado, somente quando a encomenda é encaminhada que o código funcionara como proposto pois o objeto retornara um array fazendo jus o uso do foreach.

    Segue o código de correção:

    'ECT',
    'senha' => 'SRO',
    'tipo' => 'L',
    'resultado' => 'T',
    'lingua' => '101'
    );
    $_buscaEventos['objetos'] = $__codigo;

    // criando objeto soap a partir da URL
    $client = new SoapClient( $__wsdl );
    $r = $client->buscaEventos( $_buscaEventos );
    $objeto = $r->return->objeto;

    if((! isset( $objeto->erro ) ) and (! isset($objeto->evento->descricao))){

    foreach ($objeto->evento as $e){
    $retorno[] = $e;
    }
    }
    elseif (! isset($objeto->evento->descricao)) {
    $retorno[] = $objeto->numero . ": ". $objeto->erro;
    } else {
    $retorno[] = $objeto->evento;
    }

    // sempre retorna objeto por padrao
    foreach ($retorno as $e){

    print_r ($e);

    }
    //return $retorno;


    ?>

    ResponderExcluir

Postar um comentário

Postagens mais visitadas deste blog

Dicas para Iniciantes - Clash of Clans

Este post visa apenas expor algumas dicas e experiências vividas até o momento no jogo Crash of Clans, desenvolvido para aparelhos da Apple, é indicado para quem não conhece o game ainda ou para quem apenas quer ler algumas dicas e experiências (ao fim) .  Sou o membro Osians  integrante do Clan Unrated.

How to play Clash of Clans on PC

A few days ago I was looking for a way to play Clash of Clans on my Desktop PC, but I just found fakes and links to surveys. After some frustrations I discovered that Clash of Clans now is available for Google Android, so I think that an easy way to play this game is to install an Android emulator on PC. There's a lot of Android emulator over the internet and after testing a bunch of these last month I conclude that the best choise is BlueStacks .  (You can download it at  http://www.bluestacks.com/  ) Note that I'll not teach you how to install it because there's a lot of tutorials and how-to's over the internet. - After install the emulator just execute it;  - You need to set up this, the system will ask you about a google account( if you haven't, go ahead and do one ); - Finally, into the Android emulator go to the Google Shop, search for Clash of Clans and install it. If the tip above is not clear or if you have any doubt, please let me know.

Rastreamento de Pedidos : Correios - PHP , API + XML

RESUMO Esse documento visa ensinar como implantar o rastreamento de mercadorias dos correios em um Website utilizando para isso a linguagem de programação PHP. Caso você queira apenas rastrear um Objeto dos Correios, pode fazer isso através do site Sooho clicando aqui  ou através do site dos Correios . Nota importante: Mediante as alterações de 2017 nos serviços dos correios, eu recomendo fortemente que use o tutorial do seguinte link: http://sooho.com.br/2017/03/24/rastreamento-de-pedidos-correios-php-soap/   Ele lhe dará uma solução de rastreamento definitiva e valida a longo prazo.

Bolo gelado de Maracujá com cobertura de Marshmallow frio e geleia de Brilho

Hoje um amigo na acadêmia pediu-me uma receita de bolo de maracujá, então, para " não deixar esse blog muito monótono " vamos aprender uma receita de bolo gelado de maracujá. =] (Foto ilustrativa retirada do site Anamaria  http://mdemulher.abril.com.br/revistas/anamaria/  ) O Bolo ou Torta de Maracujá (chame-o como quiser) é o que pode ser visto na foto acima. MASSA 06 ovos separados 02 xícaras (chá) de açúcar 03 xícaras (chá) de farinha de trigo ½ xícara (chá) de água 01 xícara (chá) de suco de maracujá 01 colher (sopa) de fermento em pó RECHEIO 01 lata de creme de leite s/ soro gelado ½ lata de leite condensado gelado 1/3 lata de suco de maracujá 01 colher (sopa) de emulsificante ** polpa de Maracujá MARSHMALLOW FRIO 03 Claras 09 colheres (sopa) cheia de açúcar 01 colher (sopa) cheia de emulsificante ** essência de baunilha á gosto GELEIA  DE BRILHO ½ xícara (chá) de água ½ xícara

Delphi - Inserir valor Moeda no TEdit

Estive pesquisando meios de usar um TEdit no Delphi com formatação como a dos Bancos em Moeda, para um Projeto antigo meu. Porém, achei apenas uma postagem falando sobre o assunto. (Link segue nas fontes) Mas, apesar de fazer o que eu queria, o código era um tanto complicado, pois da forma que estava seria necessário refazer o mesmo para todos os TEdits que eu fosse usar para inserir valores monetários além de ter que usar 2 eventos de cada TEdit ( OnkeyPress e OnChange ). Então, baseado nesse código criei uma pequena Procedure para fazer essa formatação de maneira simples. Para isso, basta passar como parâmetro o TEdit que deve ser formatado e o Key do teclado que será passado ao mesmo. Segue código comentado abaixo.

Desbloqueando Nintendo Wii 4.3

Bem, este não é um tutorial de como destravar seu aparelho Wii, visto que existem uma gama imensa de tutoriais na web descrevendo isso em passos simples, este artigo apenas visa mostrar as minhas experiências no destravamento de um novo Nintendo Wii Preto 4.3e. Ao final deste post deixarei as fontes que utilizei para desbloqueio do mesmo. Em agosto de 2011 minha irmã foi à Europa e por lá encontrou um nintendo Wii novo Preto com Motion Plus  super barato que vem por padrão na versão 4.3e. O Grande problema é que ele é bloqueado para região Europeia. A principio eu não queria ficar a cargo de desbloquear o aparelho. E fui até uma loja especializada consultar o valor de desbloqueio, que ficava em R$200,00 ... um preço salgado visto que o aparelho não custa tudo isso. O jeito é tentar desbloquear por conta própria, então fui pesquisar como fazer isso através da internet. Infelizmente - e diferente de Sony e Microsoft - a Nintendo divide seus consoles por Regiões, sendo estas America(

AppCake no lugar do Installous ( Outdated Version )

Uma vez que o Installous foi descontinuado e vive a emitir a todo momento a mensagem " Installous - Outdated Version " , a solução mais simples e pratica é troca-lo por uma app com as mesmas características, no caso o AppCake . Podemos instalar o AppCake através do Cydia . Vou ser rápido quanto a instalação do mesmo neste post visto que a instalação é simples. vamos aos passos: 1 - abra o Cydia e acesse Manage ; 2 - acesse Source toque em Edit e em seguida toque em Add (no canto superior esquerdo da tela); 3 - escreva  http://cydia.iphonecake.com e clique em Add Source ; 4 - Apos a instalação da fonte, volte ao cydia acesse Search e digite AppCake , toque na Aplicação que aparece no resultado e em seguida toque em Install no canto superior direito da tela.