Initial commit: Proyecto Portal ePromos completo con documentación unificada y seguridad base

This commit is contained in:
Isaac Aracena
2026-05-09 12:46:24 -04:00
commit c44f1a69f1
65 changed files with 7223 additions and 0 deletions
+24
View File
@@ -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);
+100
View File
@@ -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()]);
}
+42
View File
@@ -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);
+58
View File
@@ -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']
]);
+78
View File
@@ -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();
?>