Initial commit: Proyecto Portal ePromos completo con documentación unificada y seguridad base
This commit is contained in:
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
require_once __DIR__ . '/../admin/db.php';
|
||||
|
||||
$rasca_id = (int)($_GET['rasca_id'] ?? 0);
|
||||
if ($rasca_id <= 0) { echo json_encode(['error'=>'rasca_id inválido']); exit; }
|
||||
|
||||
$stmt = $conn->prepare("SELECT rasca_id,nombre,banner_1,banner_2,banner_3,banner_4,background_image,fullscreen_icon,fg_image,bg_image FROM rasca_config WHERE rasca_id=?");
|
||||
$stmt->bind_param("i", $rasca_id);
|
||||
$stmt->execute();
|
||||
$cfg = $stmt->get_result()->fetch_assoc();
|
||||
|
||||
if(!$cfg){
|
||||
// Fallbacks por defecto
|
||||
$cfg = [
|
||||
'rasca_id'=>$rasca_id,'nombre'=>'Rasca',
|
||||
'banner_1'=>'/ruleta/img/BANNER-1.png','banner_2'=>'/ruleta/img/BANNER-2.png',
|
||||
'banner_3'=>'/ruleta/img/BANNER-3.png','banner_4'=>'/ruleta/img/BANNER-4.png',
|
||||
'background_image'=>null,'fullscreen_icon'=>'/ruleta/img/fullscreen-icon.png',
|
||||
'fg_image'=>null,'bg_image'=>null
|
||||
];
|
||||
}
|
||||
|
||||
echo json_encode($cfg, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
@@ -0,0 +1,100 @@
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
require_once __DIR__ . '/../admin/db.php';
|
||||
|
||||
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
|
||||
|
||||
try {
|
||||
// JSON o form
|
||||
$raw = file_get_contents('php://input');
|
||||
$data = json_decode($raw, true);
|
||||
if (!is_array($data)) $data = $_POST;
|
||||
|
||||
$rasca_id = isset($data['rasca_id']) ? (int)$data['rasca_id'] : 0;
|
||||
$porcentaje = isset($data['percent']) ? (float)$data['percent'] : null; // opcional
|
||||
|
||||
if ($rasca_id <= 0) { echo json_encode(['ok'=>false,'error'=>'rasca_id inválido']); exit; }
|
||||
|
||||
// Premios activos con stock (NULL = ilimitado)
|
||||
$sql = "SELECT id, nombre, probabilidad, stock, activo, imagen_url
|
||||
FROM rasca_premios
|
||||
WHERE rasca_id=? AND activo=1
|
||||
AND (stock IS NULL OR stock > 0)
|
||||
AND probabilidad > 0";
|
||||
$st = $conn->prepare($sql);
|
||||
$st->bind_param('i', $rasca_id);
|
||||
$st->execute();
|
||||
$st->bind_result($id, $nombre, $prob, $stock, $activo, $img);
|
||||
|
||||
$premios = []; $total = 0.0;
|
||||
while ($st->fetch()) {
|
||||
$prob = (float)$prob;
|
||||
$premios[] = [
|
||||
'id' => (int)$id,
|
||||
'nombre' => $nombre,
|
||||
'prob' => $prob,
|
||||
'stock' => is_null($stock) ? null : (int)$stock,
|
||||
'imagen_url' => $img ?: null
|
||||
];
|
||||
$total += max(0.0, $prob);
|
||||
}
|
||||
$st->close();
|
||||
|
||||
$ip = $_SERVER['HTTP_X_FORWARDED_FOR'] ?? $_SERVER['REMOTE_ADDR'] ?? null;
|
||||
$ua = $_SERVER['HTTP_USER_AGENT'] ?? null;
|
||||
|
||||
if (!$premios) {
|
||||
// Sin premios disponibles: registra jugada sin premio
|
||||
$conn->prepare("INSERT INTO jugadas_rasca (rasca_id, ip_address, user_agent, porcentaje, premio_id)
|
||||
VALUES (?,?,?,?,NULL)")
|
||||
->bind_param('issd', $rasca_id, $ip, $ua, $porcentaje)
|
||||
->execute();
|
||||
echo json_encode(['ok'=>true,'sin_premio'=>true,'mensaje'=>'No hay premios activos o con stock']);
|
||||
exit;
|
||||
}
|
||||
if ($total <= 0) { echo json_encode(['ok'=>false,'error'=>'Probabilidades inválidas']); exit; }
|
||||
|
||||
// Selección ponderada
|
||||
$rnd = mt_rand() / mt_getrandmax() * $total;
|
||||
$acc = 0.0; $pick = null;
|
||||
foreach ($premios as $p) { $acc += max(0.0, $p['prob']); if ($rnd <= $acc) { $pick = $p; break; } }
|
||||
if ($pick === null) $pick = $premios[0];
|
||||
|
||||
// Transacción: descontar stock (si aplica) y registrar jugada
|
||||
$conn->begin_transaction();
|
||||
|
||||
if ($pick['stock'] !== null) {
|
||||
$upd = $conn->prepare("UPDATE rasca_premios SET stock = stock - 1 WHERE id=? AND stock > 0");
|
||||
$upd->bind_param('i', $pick['id']);
|
||||
$upd->execute();
|
||||
if ($upd->affected_rows === 0) {
|
||||
$conn->rollback();
|
||||
// stock se agotó en carrera; registra jugada sin premio
|
||||
$conn->prepare("INSERT INTO jugadas_rasca (rasca_id, ip_address, user_agent, porcentaje, premio_id)
|
||||
VALUES (?,?,?,?,NULL)")
|
||||
->bind_param('issd', $rasca_id, $ip, $ua, $porcentaje)
|
||||
->execute();
|
||||
echo json_encode(['ok'=>true,'sin_premio'=>true,'mensaje'=>'Stock agotado']);
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
$ins = $conn->prepare("INSERT INTO jugadas_rasca (rasca_id, ip_address, user_agent, porcentaje, premio_id)
|
||||
VALUES (?,?,?,?,?)");
|
||||
$ins->bind_param('issdi', $rasca_id, $ip, $ua, $porcentaje, $pick['id']);
|
||||
$ins->execute();
|
||||
|
||||
$conn->commit();
|
||||
|
||||
echo json_encode([
|
||||
'ok' => true,
|
||||
'premio' => $pick['nombre'],
|
||||
'premio_id' => $pick['id'],
|
||||
'imagen_url' => $pick['imagen_url']
|
||||
], JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
|
||||
|
||||
} catch (Throwable $e) {
|
||||
@mysqli_rollback($conn);
|
||||
echo json_encode(['ok'=>false,'error'=>'No hay articulos en stock.']);
|
||||
//echo json_encode(['ok'=>false,'error'=>'Sorteo falló: '.$e->getMessage()]);
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
<?php
|
||||
declare(strict_types=1);
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
require_once __DIR__ . '/../admin/db.php';
|
||||
|
||||
$id = (int)($_GET['ruleta_id'] ?? 1);
|
||||
|
||||
$stmt = $conn->prepare("SELECT
|
||||
imagen_ruleta, imagen_puntero,
|
||||
banner_1, banner_2, banner_3, banner_4,
|
||||
background_image, fullscreen_icon
|
||||
FROM ruletas WHERE id=? LIMIT 1");
|
||||
$stmt->bind_param("i", $id);
|
||||
$stmt->execute();
|
||||
$res = $stmt->get_result();
|
||||
|
||||
if (!$row = $res->fetch_assoc()) {
|
||||
http_response_code(404);
|
||||
echo json_encode(['error' => 'Ruleta no encontrada']);
|
||||
exit;
|
||||
}
|
||||
|
||||
function norm(?string $p): ?string {
|
||||
if (!$p) return null;
|
||||
$p = str_replace('\\', '/', $p);
|
||||
if ($p[0] !== '/') $p = '/' . ltrim($p, '/');
|
||||
return $p;
|
||||
}
|
||||
$docroot = rtrim($_SERVER['DOCUMENT_ROOT'] ?? '', '/');
|
||||
|
||||
$fields = [
|
||||
'imagen_ruleta','imagen_puntero',
|
||||
'banner_1','banner_2','banner_3','banner_4',
|
||||
'background_image','fullscreen_icon'
|
||||
];
|
||||
$out = [];
|
||||
foreach ($fields as $f) {
|
||||
$v = norm($row[$f] ?? null);
|
||||
$out[$f] = ($v && file_exists($docroot . $v)) ? $v : null;
|
||||
}
|
||||
|
||||
echo json_encode($out);
|
||||
@@ -0,0 +1,58 @@
|
||||
<?php
|
||||
// api/seleccionar_premio.php - DB-driven selection
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
require_once __DIR__ . '/../admin/db.php';
|
||||
|
||||
$payload = json_decode(file_get_contents('php://input'), true) ?: [];
|
||||
$ruleta_id = isset($payload['ruleta_id']) ? (int)$payload['ruleta_id'] : (int)($_GET['ruleta_id'] ?? 1);
|
||||
$user_agent = $payload['user_agent'] ?? ($_SERVER['HTTP_USER_AGENT'] ?? '');
|
||||
$ip_address = $payload['ip_address'] ?? ($_SERVER['REMOTE_ADDR'] ?? '');
|
||||
|
||||
// Leer premios disponibles
|
||||
$stmt = $conn->prepare("SELECT id, nombre, cantidad, probabilidad, inicio_angulo, fin_angulo FROM premios WHERE ruleta_id=? AND cantidad > 0");
|
||||
$stmt->bind_param("i", $ruleta_id);
|
||||
$stmt->execute();
|
||||
$res = $stmt->get_result();
|
||||
$premios = [];
|
||||
$totalProb = 0.0;
|
||||
while ($row = $res->fetch_assoc()) {
|
||||
$row['probabilidad'] = (float)$row['probabilidad'];
|
||||
$totalProb += $row['probabilidad'];
|
||||
$premios[] = $row;
|
||||
}
|
||||
$stmt->close();
|
||||
|
||||
if (!$premios || $totalProb <= 0) {
|
||||
http_response_code(422);
|
||||
echo json_encode(['error'=>'No hay premios configurados o probabilidades en cero']);
|
||||
exit;
|
||||
}
|
||||
|
||||
// Sorteo ponderado
|
||||
$pick = mt_rand() / mt_getrandmax() * $totalProb;
|
||||
$acc = 0.0;
|
||||
$ganador = null;
|
||||
foreach ($premios as $p) {
|
||||
$acc += $p['probabilidad'];
|
||||
if ($pick <= $acc) { $ganador = $p; break; }
|
||||
}
|
||||
if (!$ganador) $ganador = end($premios);
|
||||
|
||||
// Guardar jugada
|
||||
$stmt = $conn->prepare("INSERT INTO jugadas (ruleta_id, premio_id, ip_address, user_agent) VALUES (?,?,?,?)");
|
||||
$stmt->bind_param("iiss", $ruleta_id, $ganador['id'], $ip_address, $user_agent);
|
||||
$stmt->execute();
|
||||
$stmt->close();
|
||||
|
||||
// Descontar inventario
|
||||
$stmt = $conn->prepare("UPDATE premios SET cantidad = cantidad - 1 WHERE id=? AND cantidad > 0");
|
||||
$stmt->bind_param("i", $ganador['id']);
|
||||
$stmt->execute();
|
||||
$stmt->close();
|
||||
|
||||
echo json_encode([
|
||||
'ok' => true,
|
||||
'nombre' => $ganador['nombre'],
|
||||
'inicio' => (float)$ganador['inicio_angulo'],
|
||||
'fin' => (float)$ganador['fin_angulo']
|
||||
]);
|
||||
@@ -0,0 +1,78 @@
|
||||
<?php
|
||||
$servername = "208.109.71.144";
|
||||
$username = "ruletaadmin1990";
|
||||
$password = "Nd;GfPL#}*5s";
|
||||
$dbname = "ruleta_db";
|
||||
|
||||
// Crear la conexión
|
||||
$conn = new mysqli($servername, $username, $password, $dbname);
|
||||
|
||||
// Verificar la conexión
|
||||
if ($conn->connect_error) {
|
||||
die(json_encode(["error" => "Conexión fallida: " . $conn->connect_error]));
|
||||
}
|
||||
|
||||
// Obtener la IP del cliente en el servidor
|
||||
$ip_address = $_SERVER['REMOTE_ADDR'];
|
||||
|
||||
// Recibir el user_agent desde el frontend
|
||||
$data = json_decode(file_get_contents("php://input"), true);
|
||||
$user_agent = $data['user_agent'] ?? null;
|
||||
|
||||
// Establecer las variables de sesión en MariaDB
|
||||
$conn->query("SET @user_agent = '$user_agent'");
|
||||
$conn->query("SET @ip_address = '$ip_address'");
|
||||
|
||||
|
||||
// Consultar los premios con cantidad mayor que 0
|
||||
$sql = "SELECT id, nombre, probabilidad, cantidad, inicio, final FROM premios3 WHERE cantidad > 0";
|
||||
$result = $conn->query($sql);
|
||||
|
||||
$premios = array();
|
||||
$totalProbabilidad = 0;
|
||||
|
||||
if ($result->num_rows > 0) {
|
||||
// Calcular el total de probabilidades
|
||||
while($row = $result->fetch_assoc()) {
|
||||
$premios[] = $row;
|
||||
$totalProbabilidad += $row['probabilidad'];
|
||||
}
|
||||
|
||||
// Generar un número aleatorio entre 0 y el total de probabilidades
|
||||
$random = mt_rand(0, $totalProbabilidad * 1000) / 1000; // Se multiplica por 1000 para trabajar con 3 decimales
|
||||
$suma = 0;
|
||||
|
||||
// Seleccionar el premio basado en la probabilidad acumulada
|
||||
foreach ($premios as $premio) {
|
||||
$suma += $premio['probabilidad'];
|
||||
if ($random <= $suma) {
|
||||
// copiar esta parte Establecer las variables de sesión en MariaDB
|
||||
$conn->query("SET @user_agent = '$user_agent'");
|
||||
$conn->query("SET @ip_address = '$ip_address'");
|
||||
// Actualizar la cantidad del premio seleccionado
|
||||
$stmt = $conn->prepare("UPDATE premios3 SET cantidad = cantidad - 1 WHERE id = ?");
|
||||
if ($stmt) {
|
||||
$stmt->bind_param("i", $premio['id']);
|
||||
$stmt->execute();
|
||||
$stmt->close();
|
||||
|
||||
// Devolver el premio seleccionado con sus rangos de ángulo
|
||||
echo json_encode([
|
||||
'id' => $premio['id'],
|
||||
'nombre' => $premio['nombre'],
|
||||
'inicio' => $premio['inicio'],
|
||||
'final' => $premio['final']
|
||||
]);
|
||||
exit(); // Salir inmediatamente después de devolver el premio seleccionado
|
||||
} else {
|
||||
echo json_encode(["error" => "Error en la preparación de la actualización"]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
echo json_encode(["error" => "No hay premios disponibles"]);
|
||||
}
|
||||
|
||||
$conn->close();
|
||||
?>
|
||||
Reference in New Issue
Block a user