self::TIMEOUT_SECONDS, 'body' => [ 'secret' => $secretKey, 'response' => $token, 'remoteip' => $this->getClientIP(), ], ]); // Manejar error de conexion if (is_wp_error($response)) { error_log('ROI Theme reCAPTCHA API error: ' . $response->get_error_message()); return RecaptchaResult::failure(['connection-error']); } // Verificar codigo HTTP $statusCode = wp_remote_retrieve_response_code($response); if ($statusCode !== 200) { error_log('ROI Theme reCAPTCHA API HTTP error: ' . $statusCode); return RecaptchaResult::failure(['http-error-' . $statusCode]); } // Parsear respuesta JSON $body = wp_remote_retrieve_body($response); $data = json_decode($body, true); if (json_last_error() !== JSON_ERROR_NONE || !is_array($data)) { error_log('ROI Theme reCAPTCHA API invalid JSON: ' . $body); return RecaptchaResult::failure(['invalid-json']); } // Construir resultado return new RecaptchaResult( success: (bool) ($data['success'] ?? false), score: (float) ($data['score'] ?? 0.0), action: (string) ($data['action'] ?? ''), errorCodes: (array) ($data['error-codes'] ?? []), hostname: (string) ($data['hostname'] ?? ''), challengeTs: (string) ($data['challenge_ts'] ?? '') ); } /** * Obtener IP del cliente * * @return string */ private function getClientIP(): string { if (!empty($_SERVER['HTTP_CLIENT_IP'])) { return sanitize_text_field($_SERVER['HTTP_CLIENT_IP']); } if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { return sanitize_text_field(explode(',', $_SERVER['HTTP_X_FORWARDED_FOR'])[0]); } if (!empty($_SERVER['REMOTE_ADDR'])) { return sanitize_text_field($_SERVER['REMOTE_ADDR']); } return ''; } }