El mayor portal de MU Online de Brasil — desde 2003
Tutorial Intermedio Web

Cómo crear un sistema Vote4Coins (Gtop100, XtremeTop) en MU Online

Monta un sistema Vote4Coins completo para tu servidor de MU Online, recompensando a los jugadores que votan en listas como Gtop100 y XtremeTop vía callback (postback) seguro, con anti-fraude, cooldown y acreditación automática de monedas.

BR Bruno · Actualizado el 10 jul 2025 · ⏱ 12 de lectura
Respuesta rápida

Las listas de votación como Gtop100 y XtremeTop son uno de los motores de crecimiento orgánico más baratos que un servidor de MU Online puede tener. Cuantos más votos acumulas, más alto apareces en el ranking, y más jugadores nuevos descubren el servidor sin gastar un centavo en anuncios. El problem

Las listas de votación como Gtop100 y XtremeTop son uno de los motores de crecimiento orgánico más baratos que un servidor de MU Online puede tener. Cuantos más votos acumulas, más alto apareces en el ranking, y más jugadores nuevos descubren el servidor sin gastar un centavo en anuncios. El problema es que nadie vota gratis por mucho tiempo — por eso existe el Vote4Coins: un sistema que cambia votos por monedas del juego. En este tutorial de nivel intermedio vas a construir ese sistema desde cero, con foco en lo que realmente importa: acreditar solo los votos confirmados por la lista, a través del callback (postback), y blindar todo contra el fraude.

El error clásico de quien empieza es acreditar la recompensa en el momento en que el jugador hace clic en el botón "Votar". Eso es una invitación al fraude: el jugador hace clic, gana la moneda, cierra la pestaña sin completar el voto, y lo repite. La forma correcta es entender que existen dos momentos distintos — la redirección (el jugador va a la lista) y el callback (la lista confirma a tu servidor que el voto fue válido). La recompensa vive en el segundo momento. Todos los nombres de campos, parámetros y tablas aquí son ejemplos y varían según la versión de la distribución y por lista; consulta siempre la documentación actual de cada sitio y el schema de tu base de datos.

Requisitos previos

  • Sitio en PHP 7.4+ (idealmente 8.x) con acceso a la base de datos del sitio y del juego.
  • Cuenta de administrador registrada en cada lista que vas a usar (Gtop100, XtremeTop, TopG, XtremeTop100, etc.).
  • Tu servidor ya registrado en esas listas, con el Site ID / ID del servidor y la clave secreta (a veces llamada "postback key", "callback key" o "incentive hash") a mano.
  • Sistema de login en el sitio que identifique la cuenta del juego del jugador (para saber quién recibe la recompensa).
  • HTTPS activo — muchas listas exigen una URL de callback segura.
  • Noción de cómo acreditar moneda en la base de datos del juego (WCoin, créditos VIP, puntos de eventos — varía según la versión).

Cómo funciona el flujo de votación con callback

Antes de programar, entiende el camino completo de un voto premiado. Son seis etapas, y cada una tiene un papel claro.

  1. El jugador logueado hace clic en "Votar en Gtop100" en tu sitio.
  2. Tu backend registra un voto pendiente y redirige al jugador a la URL de la lista, incrustando un identificador (generalmente la IP o un pingUsername con el login del jugador).
  3. El jugador resuelve el CAPTCHA y confirma el voto en la lista.
  4. La lista valida el voto (IP única en el período, CAPTCHA correcto) y hace una petición HTTP a tu callback informando que el voto fue exitoso.
  5. Tu callback valida el origen y la clave secreta, encuentra al jugador por el identificador y acredita la recompensa de forma idempotente.
  6. El jugador vuelve al sitio y ve el saldo actualizado; el cooldown comienza a contar.
EtapaQuién ejecuta¿Se confía para acreditar?
Clic en "Votar"JugadorNo
RedirecciónTu backendNo
Confirmación en la listaJugador + listaNo (todavía)
Callback/postbackServidor de la listaSí, tras validar
AcreditaciónTu backend

Modelando las tablas de votos y recompensas

Crea en la base de datos del sitio una tabla para rastrear cada voto. Controla el cooldown y la idempotencia del callback.

CREATE TABLE votes (
    id          BIGINT AUTO_INCREMENT PRIMARY KEY,
    account     VARCHAR(20) NOT NULL,        -- cuenta del juego
    site        VARCHAR(30) NOT NULL,        -- 'gtop100', 'xtremetop', ...
    ip          VARCHAR(45) NOT NULL,
    status      ENUM('pending','confirmed') DEFAULT 'pending',
    reward      INT NOT NULL DEFAULT 0,
    created_at  DATETIME DEFAULT CURRENT_TIMESTAMP,
    confirmed_at DATETIME NULL,
    INDEX idx_cooldown (account, site, created_at),
    INDEX idx_ip (ip, site, created_at)
);

Una segunda tabla de configuración ayuda a mantener las recompensas y cooldowns por lista sin tocar el código:

CREATE TABLE vote_sites (
    site        VARCHAR(30) PRIMARY KEY,
    display_name VARCHAR(60) NOT NULL,
    reward      INT NOT NULL,         -- ej.: 200 WCoin por voto
    cooldown_h  INT NOT NULL DEFAULT 12,
    secret_key  VARCHAR(120) NOT NULL,
    vote_url    VARCHAR(255) NOT NULL
);

Paso a paso: redirección del voto

Cuando el jugador hace clic en votar, registras el pendiente y lo envías a la lista. El identificador enviado depende de la lista: algunas usan la IP del jugador para casar el callback; otras aceptan un pingUsername con el login. Ejemplo genérico:

<?php
session_start();
$account = $_SESSION['account'] ?? null;
if (!$account) { header('Location: /login'); exit; }

$site = $_GET['site'] ?? '';
$cfg  = buscarVoteSite($site);              // lee de vote_sites
if (!$cfg) { http_response_code(404); exit; }

// comprobar cooldown antes de dejar votar de nuevo
if (emCooldown($account, $site, $cfg['cooldown_h'])) {
    header('Location: /votar?erro=cooldown'); exit;
}

// registra voto pendiente
registrarVotoPendente($account, $site, $_SERVER['REMOTE_ADDR'], $cfg['reward']);

// redirige a la lista (URL y parámetros VARÍAN por lista)
$url = str_replace('{USER}', urlencode($account), $cfg['vote_url']);
header("Location: {$url}");

El vote_url para Gtop100, por ejemplo, suele seguir el patrón de página del servidor con un parámetro de incentivo (pingUsername). En XtremeTop, el emparejamiento normalmente es por IP. Consulta la documentación de cada lista para los parámetros exactos — cambian con el tiempo.

Paso a paso: el callback (postback)

Este es el corazón del sistema. La lista hace una petición a tu callback cuando el voto es válido. El formato varía bastante:

  • Gtop100 normalmente envía un POST con campos como Successful (1 = éxito, 0 = fallo), pingUsername (el identificador que mandaste), pingIP y un VoteID, además de una verificación por clave.
  • XtremeTop100 suele hacer un GET simple a tu callback pasando la IP del votante, y debes casar esa IP con el voto pendiente más reciente.

El patrón de código, sin embargo, es siempre el mismo: valida, casa, acredita idempotente, responde.

<?php
// callback de Gtop100 (ejemplo — los campos varían)
$sucesso = $_POST['Successful'] ?? '0';
$user    = $_POST['pingUsername'] ?? '';
$ip      = $_POST['pingIP'] ?? $_SERVER['REMOTE_ADDR'];

// 1. validar origen: clave secreta y/o IP del servidor de la lista
if (!validarChaveSecreta('gtop100', $_POST)) {
    http_response_code(403); exit('invalid');
}

if ($sucesso === '1') {
    // 2. encontrar el voto pendiente de aquel jugador/lista
    $voto = buscarVotoPendente($user, 'gtop100');
    if ($voto) {
        creditarVoto($voto['id']);   // idempotente
    }
}
echo 'ok';   // muchas listas esperan una respuesta específica

Fíjate en que el callback no confía en el navegador del jugador — la petición viene del servidor de la lista. Aun así, valida la clave secreta y, si es posible, restringe por rango de IP de la lista, porque un atacante puede intentar llamar a tu callback directamente para forjar votos.

Acreditación idempotente de la recompensa

La función de acreditación debe garantizar que el mismo voto pendiente no se convierta en moneda dos veces. Usa la transición de estado como traba:

<?php
function creditarVoto(int $voteId): void
{
    global $siteDb, $gameDb;

    // traba: solo acredita si todavía está en 'pending'
    $upd = $siteDb->prepare(
        "UPDATE votes SET status='confirmed', confirmed_at=NOW()
         WHERE id=? AND status='pending'"
    );
    $upd->execute([$voteId]);
    if ($upd->rowCount() === 0) return;   // ya acreditado

    $v = /* buscar account y reward del voto */;

    // acredita en la base de datos del JUEGO (tabla/columna VARÍAN por versión)
    $gameDb->prepare(
        "UPDATE MEMB_INFO SET WCoin = WCoin + ? WHERE memb___id = ?"
    )->execute([$v['reward'], $v['account']]);
}

Si el callback se reenvía (algunas listas lo repiten en caso de timeout), el WHERE status='pending' garantiza un crédito único. La columna WCoin en MEMB_INFO es el caso típico de Season 6; tu versión puede usar Cash, una tabla de puntos propia o un sistema de créditos VIP. Varía según la versión — confírmalo antes.

Anti-fraude: cooldown, IP y clave secreta

Vote4Coins es un imán de abuso. Refuerza tres barreras:

  1. Cooldown por cuenta y lista: respeta el intervalo oficial de la lista (12 o 24 h). Bloquea un nuevo voto pendiente antes de ese plazo.
  2. Control por IP: registra la IP y limita los votos por IP en el período, dificultando las multi-cuentas del mismo jugador.
  3. Validación del callback: clave secreta obligatoria y, cuando sea posible, verificación de la IP de origen del servidor de la lista. Nunca aceptes un callback solo porque "parece" correcto.
<?php
function emCooldown(string $acc, string $site, int $horas): bool {
    global $siteDb;
    $q = $siteDb->prepare(
        "SELECT 1 FROM votes
         WHERE account=? AND site=? AND status='confirmed'
           AND created_at > (NOW() - INTERVAL ? HOUR) LIMIT 1"
    );
    $q->execute([$acc, $site, $horas]);
    return (bool)$q->fetch();
}

Página de votación para el jugador

En el panel, muestra cada lista con un botón "Votar" y el tiempo restante de cooldown. Un ejemplo de estructura para renderizar dinámicamente:

const sites = [
  { site: "gtop100",   nome: "Gtop100",    reward: 200, cooldownRestante: 0 },
  { site: "xtremetop", nome: "XtremeTop100", reward: 150, cooldownRestante: 3600 },
];
// deshabilita el botón mientras cooldownRestante > 0 y muestra un contador regresivo

Deja claro al jugador cuánto gana por voto y el intervalo — la transparencia reduce los tickets de soporte. Si estás montando toda la estructura del servidor, el Vote4Coins es solo uno de los módulos web; consulta la guía general de cómo crear un servidor de MU Online para entender dónde encaja.

Errores comunes y soluciones

SíntomaCausa probableSolución
El jugador votó pero no recibióCallback no configurado o URL equivocada en la listaRegistra la URL de postback correcta en el panel de la lista
Recompensa acreditada sin votarAcreditó en el clic, no en el callbackAcredita solo en el callback confirmado (Successful=1)
Voto acreditado por duplicadoFalta de idempotenciaUsa UPDATE ... WHERE status='pending' como traba
Callback rechazado (403)Clave secreta divergenteReconfirma la secret key en el panel de la lista y en vote_sites
El jugador vota varias veces seguidasCooldown no aplicadoComprueba el cooldown por cuenta e IP antes de la redirección
Callback forjado por tercerosSin validación de origenValida la clave secreta y restringe la IP de origen de la lista

Seguridad y buenas prácticas

  • Nunca expongas la secret key de la lista en el front-end o en Git.
  • Trata el callback como entrada no confiable hasta validar la clave y el origen.
  • Registra logs de los callbacks recibidos (payload + IP) para auditar fraudes.
  • Casar por pingUsername es más confiable que casar por IP pura, cuando la lista lo permite.
  • Si un jugador reclama por un voto no pagado, comprueba primero si la lista realmente envió el callback — muchas veces el CAPTCHA falló de su lado.
  • Limita la recompensa total diaria por cuenta para contener el abuso incluso con múltiples listas.

Lista de verificación de lanzamiento

  • Servidor registrado en cada lista con Site ID y secret key guardados
  • Tablas votes y vote_sites creadas
  • URL de callback configurada en cada lista, con HTTPS
  • Validación de clave secreta implementada en cada handler
  • Acreditación idempotente probada (callback duplicado no paga dos veces)
  • Cooldown por cuenta y por IP funcionando
  • Nombre real de la tabla/columna de moneda de la game DB confirmado para tu versión
  • Página de votación con contador de cooldown
  • Logs de callback habilitados para auditoría
  • Prueba de punta a punta con un voto real en cada lista

Con este sistema transformas a cada jugador activo en un difusor diario del servidor, subes en los rankings de forma orgánica y además das una recompensa justa a cambio — todo de forma automática, segura y a prueba de quien intenta burlar el clic de votar.

Preguntas frecuentes

¿Qué es Vote4Coins en MU Online?

Es un sistema que recompensa a los jugadores con monedas del juego (WCoin, créditos o puntos) siempre que votan por tu servidor en sitios de ranking como Gtop100 y XtremeTop, aumentando su posición en las listas y la difusión.

¿Cómo avisa el sitio de votación que el voto fue válido?

A través de un callback (también llamado postback o pingback): cuando el voto se confirma, la lista hace una petición HTTP a una URL de tu sitio, informando el identificador del jugador. Solo en ese momento debe acreditarse la recompensa.

¿Por qué no debo acreditar en cuanto el jugador hace clic en votar?

Porque el clic no garantiza un voto válido. El jugador puede cerrar la página, el CAPTCHA puede fallar o puede votar desde una IP ya usada. Solo el callback confirmado por la lista garantiza que el voto contó.

¿Cómo impido que un jugador vote varias veces seguidas?

Combina el cooldown oficial de la lista (generalmente 12 o 24 horas) con un registro propio de votos por cuenta y por IP, además de validar el callback por la clave secreta y por la IP de origen de la lista.

¿Puedo usar más de una lista de votación al mismo tiempo?

Sí, y es recomendado. Cada lista tiene su propio callback y cooldown. Basta con crear un handler por lista y una tabla unificada de votos para controlar recompensas y evitar duplicidad.

BR
Editor de eventos, mapas e ítems

Bruno es especialista en eventos, mapas, bosses y economía de ítems de MU Online. Documenta cada detalle basándose en el juego real.

Sigue leyendo

Artículos relacionados