apiKey = $apiKey; } public function verifyPayment($invoiceNumber, $amount, $paymentMethod, $proofText, $proofImageBase64 = '') { $prompt = "You are a financial verifier. The user claims they transferred $amount via $paymentMethod for invoice $invoiceNumber. "; if (!empty($proofText)) { $prompt .= "Here is their proof text: '$proofText'. "; } $prompt .= "Does the provided proof clearly indicate a successful transfer of $amount? Respond ONLY with a valid JSON object: {\"verified\": true/false, \"reason\": \"your reasoning\"}."; $parts = [["text" => $prompt]]; if (!empty($proofImageBase64)) { $parts[] = [ "inline_data" => [ "mime_type" => "image/jpeg", "data" => $proofImageBase64 ] ]; } $reqData = [ "contents" => [ [ "parts" => $parts ] ] ]; $url = $this->baseUrl . $this->model . ":generateContent?key=" . $this->apiKey; $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/json']); curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($reqData)); $response = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($httpCode !== 200) { error_log("Gemini API Error: " . $response); throw new Exception("AI Verification service unavailable. Details: " . $response); } $resData = json_decode($response, true); $aiText = $resData['candidates'][0]['content']['parts'][0]['text'] ?? ''; // Clean AI Text (remove markdown json block if exists) $aiText = preg_replace('/```json|```/', '', $aiText); $aiResult = json_decode(trim($aiText), true); if ($aiResult && isset($aiResult['verified'])) { return $aiResult; } throw new Exception("Invalid response format from Gemini: " . $aiText); } } ?>