apiUrl = config('services.repuve_federal.soap_url'); $this->username = config('services.repuve_federal.username'); $this->password = config('services.repuve_federal.password'); } public function consultarPadron(string $niv) { $arg2 = $niv . '|||||||'; $soapBody = << {$this->username} {$this->password} {$arg2} XML; $ch = curl_init($this->apiUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $soapBody); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: text/xml; charset=utf-8', 'SOAPAction: "doConsPadron"', 'Content-Length: ' . strlen($soapBody), ]); // Ejecutar la solicitud $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); $error = curl_error($ch); curl_close($ch); if ($error) { throw new Exception("Error en la petición SOAP: {$error}"); } if ($httpCode !== 200) { throw new Exception("Error al consultar REPUVE: Código HTTP {$httpCode}"); } return $this->parseVehicleResponse($response, $niv); } private function parseVehicleResponse(string $soapResponse, string $niv): array { preg_match('/(.*?)<\/return>/s', $soapResponse, $matches); if (!isset($matches[1])) { throw new Exception("No se pudo extraer la respuesta del SOAP"); } $contenido = trim($matches[1]); // Verificar si hay error if (str_starts_with($contenido, 'ERROR:')) { $errorMessage = str_replace('ERROR:', '', $contenido); return [ 'has_error' => true, 'error_code' => 'REPUVE_ERROR', 'error_message' => $errorMessage, 'timestamp' => now()->toDateTimeString(), 'niv' => $niv, 'repuve_response' => null, ]; } // Si empieza con OK:, parsear los datos if (str_starts_with($contenido, 'OK:')) { $datos = str_replace('OK:', '', $contenido); $valores = explode('|', $datos); $campos = [ 'marca', 'submarca', 'tipo_vehiculo', 'fecha_expedicion', 'oficina', 'niv', 'placa', 'motor', 'modelo', 'color', 'version', 'entidad', 'marca_padron', 'submarca_padron', 'tipo_uso_padron', 'tipo_vehiculo_padron', 'estatus_registro', 'aduana', 'nombre_aduana', 'patente', 'pedimento', 'fecha_pedimento', 'clave_importador', 'folio_ci', 'identificador_ci', 'observaciones' ]; $jsonResponse = []; foreach ($campos as $i => $campo) { $jsonResponse[$campo] = $valores[$i] ?? null; } return [ 'has_error' => false, 'error_code' => null, 'error_message' => null, 'timestamp' => now()->toDateTimeString(), 'niv' => $niv, 'repuve_response' => $jsonResponse, ]; } throw new Exception("Formato de respuesta desconocido: {$contenido}"); } /** * Verifica si un vehículo está reportado como robado */ public function verificarRobo(string $niv): bool { try { $resultado = $this->consultarPadron($niv); if ($resultado['has_error']) { return false; } $estatus = $resultado['repuve_response']['estatus_registro'] ?? null; return in_array(strtoupper($estatus), ['ROBADO', 'ROBO']); } catch (Exception $e) { logger()->error("Error al verificar robo en REPUVE: " . $e->getMessage()); return false; } } }