Files
html/api/chatbot-conversion-track.php
opus adb423e380
Some checks failed
WEVAL NonReg / nonreg (push) Has been cancelled
auto-commit via WEVIA vault_git intent 2026-04-19T17:24:01+00:00
2026-04-19 19:24:02 +02:00

45 lines
1.9 KiB
PHP

<?php
// WEVAL — Chatbot→Sales Conversion Tracking Endpoint
// Non-blocking insert + JSON response
header('Content-Type: application/json');
header('Access-Control-Allow-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; }
$input = json_decode(file_get_contents('php://input'), true) ?: [];
$event = $input['event'] ?? '';
$session_id = $input['session_id'] ?? ('anon-' . substr(md5(($_SERVER['REMOTE_ADDR']??'') . date('Ymd')), 0, 16));
$vertical = $input['vertical'] ?? null;
$source = $input['source'] ?? null;
$data = $input['data'] ?? null;
$url = $input['url'] ?? ($_SERVER['HTTP_REFERER'] ?? null);
$referrer = $input['referrer'] ?? null;
if (empty($event)) {
http_response_code(400);
echo json_encode(['ok' => false, 'error' => 'event required']);
exit;
}
$ip = $_SERVER['HTTP_CF_CONNECTING_IP'] ?? ($_SERVER['HTTP_X_FORWARDED_FOR'] ?? ($_SERVER['REMOTE_ADDR'] ?? null));
if ($ip && strpos($ip, ',') !== false) $ip = trim(explode(',', $ip)[0]);
$ua = substr($_SERVER['HTTP_USER_AGENT'] ?? '', 0, 500);
try {
$pdo = new PDO('pgsql:host=10.1.0.3;port=5432;dbname=adx_system', 'admin', 'admin123', [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_TIMEOUT => 3
]);
$stmt = $pdo->prepare('INSERT INTO chatbot_conversions (session_id, event, vertical, source, data, url, referrer, ip, user_agent) VALUES (?, ?, ?, ?, ?::jsonb, ?, ?, ?, ?)');
$stmt->execute([
$session_id, $event, $vertical, $source,
$data ? json_encode($data) : null,
$url, $referrer, $ip, $ua
]);
echo json_encode(['ok' => true, 'session_id' => $session_id, 'event' => $event]);
} catch (Exception $e) {
error_log('[chatbot-conv-track] ' . $e->getMessage());
echo json_encode(['ok' => false, 'error' => 'store_failed']);
}