/** * @param \PhpSigep\Model\RastrearObjeto $params * @return \PhpSigep\Services\Result<\PhpSigep\Model\RastrearObjetoResultado[]> * @throws Exception\RastrearObjeto\TipoResultadoInvalidoException * @throws Exception\RastrearObjeto\TipoInvalidoException */ public function execute(\PhpSigep\Model\RastrearObjeto $params) { switch ($params->getTipo()) { case \PhpSigep\Model\RastrearObjeto::TIPO_LISTA_DE_OBJETOS: $tipo = 'L'; break; case \PhpSigep\Model\RastrearObjeto::TIPO_INTERVALO_DE_OBJETOS: $tipo = 'F'; break; default: throw new \PhpSigep\Services\Real\Exception\RastrearObjeto\TipoInvalidoException("Tipo '" . $params->getTipo() . "' não é valido"); break; } switch ($params->getTipoResultado()) { case \PhpSigep\Model\RastrearObjeto::TIPO_RESULTADO_APENAS_O_ULTIMO_EVENTO: $tipoResultado = 'U'; break; case \PhpSigep\Model\RastrearObjeto::TIPO_RESULTADO_TODOS_OS_EVENTOS: $tipoResultado = 'T'; break; default: throw new \PhpSigep\Services\Real\Exception\RastrearObjeto\TipoResultadoInvalidoException("Tipo de resultado '" . $params->getTipo() . "' não é valido"); break; } $post = array('usuario' => $params->getAccessData()->getUsuario(), 'senha' => $params->getAccessData()->getSenha(), 'tipo' => $tipo, 'Resultado' => $tipoResultado, 'objetos' => implode('', array_map(function (\PhpSigep\Model\Etiqueta $etiqueta) { return $etiqueta->getEtiquetaComDv(); }, $params->getEtiquetas()))); $postContent = http_build_query($post); $ch = curl_init(); curl_setopt_array($ch, array(CURLOPT_URL => 'http://websro.correios.com.br/sro_bin/sroii_xml.eventos', CURLOPT_POST => true, CURLOPT_RETURNTRANSFER => true, CURLOPT_POSTFIELDS => $postContent, CURLOPT_SSL_VERIFYPEER => false)); // "usuario=ECT &senha=SRO &tipo=L&Resultado=T&objetos=SQ458226057BRRA132678652BRSX142052885BR" // "Usuario=sigep&Senha=n5f9t8&Tipo=L&Resultado=T&Objetos=SQ458226057BR" $curlResult = curl_exec($ch); $curlErrno = curl_errno($ch); $curlErr = curl_error($ch); curl_close($ch); $result = new Result(); if ($curlErrno) { $result->setErrorMsg("Erro de comunicação com o Correios ao tentar buscar os dados de rastreamento. Detalhes: \"{$curlErrno} - {$curlErr}\"."); $result->setErrorCode($curlErrno); } else { if (!$curlResult) { $result->setErrorMsg("Resposta do Correios veio vazia"); } else { try { $eventos = $this->_parseResult($curlResult); $result->setResult($eventos); } catch (RastrearObjetoException $e) { $result->setErrorCode(0); $result->setErrorMsg($e->getMessage()); } } } return $result; }
/** * @param \PhpSigep\Model\RastrearObjeto $params * @return \PhpSigep\Services\Result<\PhpSigep\Model\RastrearObjetoResultado[]> * @throws Exception\RastrearObjeto\TipoResultadoInvalidoException * @throws Exception\RastrearObjeto\TipoInvalidoException */ public function execute(\PhpSigep\Model\RastrearObjeto $params) { switch ($params->getTipo()) { case \PhpSigep\Model\RastrearObjeto::TIPO_LISTA_DE_OBJETOS: $tipo = 'L'; break; case \PhpSigep\Model\RastrearObjeto::TIPO_INTERVALO_DE_OBJETOS: $tipo = 'F'; break; default: throw new \PhpSigep\Services\Real\Exception\RastrearObjeto\TipoInvalidoException("Tipo '" . $params->getTipo() . "' não é valido"); break; } switch ($params->getTipoResultado()) { case \PhpSigep\Model\RastrearObjeto::TIPO_RESULTADO_APENAS_O_ULTIMO_EVENTO: $tipoResultado = 'U'; break; case \PhpSigep\Model\RastrearObjeto::TIPO_RESULTADO_TODOS_OS_EVENTOS: $tipoResultado = 'T'; break; default: throw new \PhpSigep\Services\Real\Exception\RastrearObjeto\TipoResultadoInvalidoException("Tipo de resultado '" . $params->getTipo() . "' não é valido"); break; } $soapArgs = array('usuario' => $params->getAccessData()->getUsuario(), 'senha' => $params->getAccessData()->getSenha(), 'tipo' => $tipo, 'resultado' => $tipoResultado, 'lingua' => $params->getIdioma(), 'objetos' => implode('', array_map(function (\PhpSigep\Model\Etiqueta $etiqueta) { return $etiqueta->getEtiquetaComDv(); }, $params->getEtiquetas()))); $result = new Result(); try { $soapReturn = SoapClientFactory::getRastreioObjetos()->buscaEventos($soapArgs); if ($soapReturn && is_object($soapReturn) && $soapReturn->return) { try { if (!is_array($soapReturn->return->objeto)) { $soapReturn->return->objeto = array($soapReturn->return->objeto); } $resultado = array(); foreach ($soapReturn->return->objeto as $objeto) { // Verifica se ocorreu algum erro ao consultar a etiqueta if (isset($objeto->erro)) { throw new RastrearObjetoException(SoapClientFactory::convertEncoding('(' . $objeto->numero . ') ' . $objeto->erro)); } $eventos = new RastrearObjetoResultado(); $eventos->setEtiqueta(new Etiqueta(array('etiquetaComDv' => $objeto->numero))); $ev = $objeto->evento; $evento = new RastrearObjetoEvento(); $evento->setTipo($ev->tipo); $evento->setStatus($ev->status); $evento->setDataHora(\DateTime::createFromFormat('d/m/Y H:i', $ev->data . ' ' . $ev->hora)); $evento->setDescricao(SoapClientFactory::convertEncoding($ev->descricao)); $evento->setDetalhe(isset($ev->detalhe) ? $ev->detalhe : ''); $evento->setLocal($ev->local); $evento->setCodigo($ev->codigo); $evento->setCidade($ev->cidade); $evento->setUf($ev->uf); // Sempre adiciona o recebedor ao resultado, mesmo ele sendo exibdo apenas quanto 'tipo' = BDE e 'status' = 01 $evento->setRecebedor(isset($ev->recebedor) && !empty($ev->recebedor) ? trim($ev->recebedor) : ''); // Adiciona o evento ao resultado $eventos->addEvento($evento); $resultado[] = $eventos; } $result->setResult($resultado); } catch (RastrearObjetoException $e) { $result->setErrorCode(0); $result->setErrorMsg("Erro de comunicação com o Correios ao tentar buscar os dados de rastreamento. Detalhes: " . $e->getMessage()); } } else { $result->setErrorCode(0); $result->setErrorMsg('A resposta do Correios não está no formato esperado. Resposta recebida: "' . $soapReturn . '"'); } } catch (\Exception $e) { if ($e instanceof \SoapFault) { $result->setIsSoapFault(true); $result->setErrorCode($e->getCode()); $result->setErrorMsg(SoapClientFactory::convertEncoding($e->getMessage())); } else { $result->setErrorCode($e->getCode()); $result->setErrorMsg($e->getMessage()); } } return $result; }