siteKey() !== '' && (string) config('services.turnstile.secret_key', '') !== ''; } public function siteKey(): string { return (string) config('services.turnstile.site_key', ''); } public function inputName(): string { return 'cf-turnstile-response'; } public function scriptUrl(): string { return (string) config('services.turnstile.script_url', 'https://challenges.cloudflare.com/turnstile/v0/api.js'); } public function verify(string $token, ?string $ip = null): bool { if (! $this->isEnabled()) { return true; } if (trim($token) === '') { return false; } try { $response = Http::asForm() ->timeout((int) config('services.turnstile.timeout', 5)) ->post((string) config('services.turnstile.verify_url', 'https://challenges.cloudflare.com/turnstile/v0/siteverify'), [ 'secret' => (string) config('services.turnstile.secret_key', ''), 'response' => $token, 'remoteip' => $ip, ]); if ($response->failed()) { return false; } return (bool) data_get($response->json(), 'success', false); } catch (\Throwable $exception) { Log::warning('turnstile verification request failed', [ 'message' => $exception->getMessage(), ]); return false; } } }