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;
Muito bom cara, parabéns e obrigado :)
ResponderExcluirCara 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 ?
ResponderExcluirOlá 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
ExcluirA 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!
sim é só a pessoa fazer um foreach antes do que ele vai passar do código dos correios...
Excluircara 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 ?
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):
Excluirecho "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;
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.
ExcluirEssa é 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.
Excluir1. 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.
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:
Excluirtraz evento, destino e local...
tem idéia de como fazer isso ?
Osians vc tem e-mail ou skype pra eu t mostrar um exemplo que eu estou fazendo? se tiver me passa fazendo favor...
Excluiremail: sans.pds@gmail.com
Excluirskype: sans.pds
no skype aparece wandeco sans ... é isso mesmo ?
ExcluirSim é isso mesmo. Acredito que têm 1 ou 2 com o mesmo nome, ambos são meus, mas 1 está inativo. Adicione-os.
Excluirok, adicionei os dois, e ja mandei a solicitaçõa, vc nõa entra muito no skype né ?..
Excluireu 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...
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.
ResponderExcluirSegue 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;
?>