// Verificación server-side del token de Cloudflare Turnstile. export async function verifyTurnstile(token: string, ip?: string): Promise { const secret = process.env.TURNSTILE_SECRET_KEY if (!secret) return true // captcha desactivado si no hay secreto if (!token) return false try { const body = new URLSearchParams({ secret, response: token }) if (ip) body.set('remoteip', ip) const res = await fetch('https://challenges.cloudflare.com/turnstile/v0/siteverify', { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, body: body.toString(), }) const data: { success?: boolean } = await res.json() return Boolean(data.success) } catch { return false // fail-closed } }