?
| Current Path : /home/webyoo/www/elysee/site/sss/nnn/api/ |
| Current File : /home/webyoo/www/elysee/site/sss/nnn/api/contact.php |
<?php
/**
* api/contact.php — Reçoit le formulaire de contact, envoie un mail au cabinet.
*
* Hébergement : pose ce fichier dans /api/ à la racine de ton site PHP.
* (à côté du dossier `out/` exporté par Next.js).
*
* Sécurité : validation côté serveur, anti-CSRF basique (origin), anti-spam
* par champ honeypot, rate-limit léger par IP via fichier temp.
*/
declare(strict_types=1);
// --- CONFIG ---------------------------------------------------------------
const TO_EMAIL = 'contact@elysee-finance.fr'; // ⚠️ adresse de réception
const FROM_EMAIL = 'noreply@elysee-finance.fr'; // doit appartenir au domaine
const FROM_NAME = 'Site Élysée Finance';
const ALLOWED_ORIGINS = [
'https://elysee-finance.fr',
'https://www.elysee-finance.fr',
'http://localhost:3000', // dev Next.js
];
// -------------------------------------------------------------------------
header('Content-Type: application/json; charset=utf-8');
// CORS — autoriser uniquement les origines connues
$origin = $_SERVER['HTTP_ORIGIN'] ?? '';
if (in_array($origin, ALLOWED_ORIGINS, true)) {
header('Access-Control-Allow-Origin: ' . $origin);
header('Access-Control-Allow-Methods: POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type');
}
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(204); exit; }
if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
http_response_code(405);
echo json_encode(['ok' => false, 'error' => 'Méthode non autorisée']);
exit;
}
// Lit le JSON envoyé par le front (ou fallback sur form-data)
$raw = file_get_contents('php://input');
$data = json_decode($raw, true);
if (!is_array($data)) $data = $_POST;
// Honeypot anti-spam (champ caché jamais rempli par un humain)
if (!empty($data['website'])) {
echo json_encode(['ok' => true]); // on fait croire au bot que c'est passé
exit;
}
// Rate-limit : 1 envoi / 30s / IP
$ip = $_SERVER['REMOTE_ADDR'] ?? 'unknown';
$lockFile = sys_get_temp_dir() . '/elysee_rl_' . md5($ip);
if (file_exists($lockFile) && (time() - filemtime($lockFile)) < 30) {
http_response_code(429);
echo json_encode(['ok' => false, 'error' => 'Trop de requêtes. Réessayez dans quelques secondes.']);
exit;
}
touch($lockFile);
// Helpers
function clean(string $s): string {
return trim(strip_tags(str_replace(["\r", "\n"], ' ', $s)));
}
function err(string $m, int $code = 400): void {
http_response_code($code);
echo json_encode(['ok' => false, 'error' => $m]);
exit;
}
// Validation
$civilite = clean((string)($data['civilite'] ?? ''));
$nom = clean((string)($data['nom'] ?? ''));
$prenom = clean((string)($data['prenom'] ?? ''));
$email = clean((string)($data['email'] ?? ''));
$tel = clean((string)($data['tel'] ?? ''));
$sujet = clean((string)($data['sujet'] ?? ''));
$montant = clean((string)($data['montant'] ?? ''));
$message = trim((string)($data['message'] ?? '')); // garde les retours-ligne
if ($nom === '' || $prenom === '') err('Nom et prénom requis');
if (!filter_var($email, FILTER_VALIDATE_EMAIL)) err('E-mail invalide');
if (!preg_match('/^[\d\s().+\-]{8,}$/', $tel)) err('Téléphone invalide');
if (mb_strlen($message) < 10) err('Message trop court');
if (mb_strlen($message) > 5000) err('Message trop long');
// Construction de l'email
$subject = '[Site Élysée Finance] Nouvelle demande — ' . $sujet;
$body = "Nouvelle demande reçue depuis le site\n";
$body .= "─────────────────────────────────────\n\n";
$body .= "Civilité : $civilite\n";
$body .= "Nom : $nom\n";
$body .= "Prénom : $prenom\n";
$body .= "E-mail : $email\n";
$body .= "Téléphone : $tel\n";
$body .= "Sujet : $sujet\n";
$body .= "Montant : " . ($montant ?: '—') . "\n\n";
$body .= "Message :\n$message\n\n";
$body .= "─────────────────────────────────────\n";
$body .= "IP : $ip\n";
$body .= "Date : " . date('d/m/Y H:i:s') . "\n";
$headers = [
'From' => FROM_NAME . ' <' . FROM_EMAIL . '>',
'Reply-To' => "$prenom $nom <$email>",
'Content-Type' => 'text/plain; charset=UTF-8',
'X-Mailer' => 'PHP/' . phpversion(),
];
$headersStr = '';
foreach ($headers as $k => $v) $headersStr .= "$k: $v\r\n";
// Envoi
$ok = mail(TO_EMAIL, '=?UTF-8?B?' . base64_encode($subject) . '?=', $body, $headersStr);
if (!$ok) err("Échec de l'envoi de l'e-mail. Merci de nous appeler.", 500);
echo json_encode(['ok' => true, 'message' => 'Demande envoyée']);