/** * AutoGest Pro v6.0 - Função de consulta de placas CORRIGIDA * @author Alceujrab * @version 6.0 * @date 2025-07-04 11:02:41 */ // Endpoint direto para consulta via API Brasil function consultarPlacaAPI() { // Obter os dados enviados $data = json_decode(file_get_contents('php://input'), true); $placa = $data['placa'] ?? ''; if (empty($placa)) { echo json_encode([ 'success' => false, 'message' => 'Placa não informada' ]); return; } // Configurações da API $bearerToken = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwczovL2dhdGV3YXkuYXBpYnJhc2lsLmlvL2FwaS92Mi9hdXRoL2xvZ2luIiwiaWF0IjoxNzUxNTg4MzUxLCJleHAiOjE3ODMxMjQzNTEsIm5iZiI6MTc1MTU4ODM1MSwianRpIjoiTlpxQ1duTnNYS1o0RlRkOCIsInN1YiI6IjE1OTQxIiwicHJ2IjoiMjNiZDVjODk0OWY2MDBhZGIzOWU3MDFjNDAwODcyZGI3YTU5NzZmNyJ9.mw5oAkELdx7vlmepbs-01OIOTVQPq0Pk3_SvbZSwBd0'; // Diferentes endpoints para tentar $endpoints = [ 'https://gateway.apibrasil.io/api/v2/vehicles/base/000/dados', 'https://gateway.apibrasil.io/api/v2/vehicles/dados', 'https://gateway.apibrasil.io/api/v2/vehicles' ]; // Limpar a placa $placa = strtoupper(preg_replace('/[^A-Z0-9]/', '', $placa)); // Preparar dados para a requisição $requestData = [ 'placa' => $placa, 'homolog' => false ]; // Registra no log error_log("API Brasil - Consultando placa: $placa"); $lastError = ''; $lastResponse = ''; // Tentar cada endpoint foreach ($endpoints as $apiUrl) { error_log("API Brasil - Tentando endpoint: $apiUrl"); // Inicializar cURL $curl = curl_init(); // Configurar opções do cURL curl_setopt_array($curl, [ CURLOPT_URL => $apiUrl, CURLOPT_RETURNTRANSFER => true, CURLOPT_ENCODING => "", CURLOPT_MAXREDIRS => 10, CURLOPT_TIMEOUT => 30, CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_HTTPHEADER => [ "Content-Type: application/json", "Authorization: Bearer " . $bearerToken, "Accept: application/json" ], CURLOPT_POSTFIELDS => json_encode($requestData), CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYHOST => false ]); // Executar a requisição $response = curl_exec($curl); $err = curl_error($curl); $httpCode = curl_getinfo($curl, CURLINFO_HTTP_CODE); // Fechar conexão cURL curl_close($curl); // Se houver erro de cURL if ($err) { $lastError = "Erro cURL: " . $err; error_log("API Brasil - $lastError"); continue; } // Log da resposta error_log("API Brasil - HTTP Code: $httpCode"); error_log("API Brasil - Response: " . substr($response, 0, 500)); // Se não for código 200, tentar próximo endpoint if ($httpCode !== 200) { $lastError = "HTTP $httpCode"; $lastResponse = $response; continue; } // Decodificar a resposta $apiResponse = json_decode($response, true); if (json_last_error() !== JSON_ERROR_NONE) { $lastError = "Erro JSON: " . json_last_error_msg(); error_log("API Brasil - $lastError"); continue; } // Verificar se há erro na resposta if (isset($apiResponse['error']) && $apiResponse['error']) { $lastError = $apiResponse['message'] ?? 'Erro desconhecido da API'; error_log("API Brasil - Erro da API: $lastError"); // Se for erro de token ou créditos, parar de tentar if (strpos($lastError, 'token') !== false || strpos($lastError, 'crédito') !== false) { break; } continue; } // Tentar encontrar os dados do veículo em diferentes estruturas $veiculoData = null; // Estrutura 1: data.dadosVeiculo if (isset($apiResponse['data']['dadosVeiculo'])) { $veiculoData = $apiResponse['data']['dadosVeiculo']; } // Estrutura 2: data direto else if (isset($apiResponse['data']) && isset($apiResponse['data']['marca'])) { $veiculoData = $apiResponse['data']; } // Estrutura 3: response.data else if (isset($apiResponse['response']['data'])) { $veiculoData = $apiResponse['response']['data']; } if ($veiculoData) { // Formatar os dados para o formato esperado pelo frontend $veiculo = [ 'marca' => $veiculoData['marca'] ?? $veiculoData['Marca'] ?? 'Não informado', 'modelo' => $veiculoData['modelo'] ?? $veiculoData['Modelo'] ?? 'Não informado', 'anoFab' => $veiculoData['anoFabricacao'] ?? $veiculoData['AnoFabricacao'] ?? $veiculoData['ano_fabricacao'] ?? date('Y'), 'anoMod' => $veiculoData['anoModelo'] ?? $veiculoData['AnoModelo'] ?? $veiculoData['ano_modelo'] ?? date('Y'), 'cor' => $veiculoData['cor'] ?? $veiculoData['Cor'] ?? 'Não informado', 'combustivel' => $veiculoData['combustivel'] ?? $veiculoData['Combustivel'] ?? 'Flex', 'chassi' => $veiculoData['chassi'] ?? $veiculoData['Chassi'] ?? '', 'renavam' => $veiculoData['renavam'] ?? $veiculoData['Renavam'] ?? '', 'placa' => $veiculoData['placa'] ?? $veiculoData['Placa'] ?? $placa ]; error_log("API Brasil - Placa $placa consultada com sucesso"); // Retornar os dados formatados echo json_encode([ 'success' => true, 'message' => 'Veículo encontrado', 'data' => $veiculo, 'source' => 'API Brasil' ]); return; } } // Se chegou aqui, nenhum endpoint funcionou error_log("API Brasil - Falha em todos os endpoints. Último erro: $lastError"); // Mensagem de erro mais específica $errorMessage = 'Por favor, digite os dados do veículo manualmente. '; if (strpos($lastError, 'token') !== false) { $errorMessage .= 'Problema de autenticação com a API.'; } else if (strpos($lastError, 'crédito') !== false) { $errorMessage .= 'Créditos insuficientes na API.'; } else if ($httpCode === 404) { $errorMessage .= 'Placa não encontrada na base de dados.'; } else if ($httpCode === 429) { $errorMessage .= 'Limite de requisições excedido.'; } else { $errorMessage .= $lastError; } echo json_encode([ 'success' => false, 'message' => $errorMessage, 'api_error' => true, 'debug' => [ 'last_error' => $lastError, 'http_code' => $httpCode, 'response_preview' => substr($lastResponse, 0, 200) ] ]); }