Phần thưởng vote

Voting Check

Cách bạn thưởng người chơi sau khi họ vote thành công cho listing trên JoinGameServers.

Đường thiết lập: Dashboard → Sửa server → Phần thưởng vote (và Chi tiết Minecraft cho Votifier).

01

Cách hoạt động

  1. Người chơi mở link vote của bạn, tốt nhất kèm ?p=USERNAME để form được điền sẵn.

  2. Họ gửi vote. Chúng tôi áp dụng cooldown 24 giờ theo IP (và theo tài khoản đã đăng nhập). Nếu có cấu hình phần thưởng, tên người dùng / tham số là bắt buộc.

  3. Chúng tôi thông báo hệ thống phần thưởng của bạn: HTTP GET tới postback URL và/hoặc gói Votifier tới host Minecraft — dùng cùng tham số và IP của người vote.

  4. Bạn trao phần thưởng. Lỗi giao trên phía bạn được ghi log tại đây nhưng không xóa vote.

Chọn phương thức

HTTP Postback

Phù hợp nhất cho website, launcher và game không phải Minecraft. Với Minecraft đây là lựa chọn thay thế tùy chọn cho Votifier (hoặc bổ sung nếu bạn cũng thưởng trên website).

  • Hoạt động với mọi game trên danh sách này
  • Bạn kiểm soát điểm, cooldown, logging
  • Cần endpoint HTTPS công khai
Postback PHP →
Tốt nhất cho Minecraft

Minecraft Votifier

Ưu tiên cho Minecraft. Tốt nhất cho crate, key và plugin listener trong game. Chúng tôi mở kết nối TCP tới port Votifier của bạn.

  • Chỉ listing Minecraft
  • RSA classic hoặc token NuVotifier v2
  • Cần port mở + allowlist firewall
Minecraft Votifier →

Với Minecraft, dùng Votifier trước. HTTP postback là tùy chọn (hoặc bổ sung). Mỗi kênh đã bật chạy độc lập sau khi vote.

Bắt đầu nhanh

  1. Đăng nhập và mở Dashboard.
  2. Sửa listing server đã được duyệt.
  3. Đặt Postback URL và/hoặc bật Votifier trong Chi tiết Minecraft.
  4. Sao chép link vote khuyến khích từ form sửa (kết thúc bằng ?p=USERNAME).
  5. Đặt link đó lên website hoặc Discord; thay USERNAME theo từng người chơi.
  6. Vote thử và xác nhận phần thưởng đã tới.
02

Postback PHP

Sau vote thành công chúng tôi gọi URL của bạn với tham số người chơi và IP của họ. Script của bạn đánh dấu tài khoản đã vote và trao điểm hoặc vật phẩm.

Whitelist IP outbound công khai của website này trong firewall và script postback. Từ chối mọi nguồn khác. Ưu tiên HTTPS.

1. Đặt Postback URL

Dashboard → Sửa server → Phần thưởng vote → Postback URL.

https://YOURDOMAIN/postback.php
  • Tên file tùy ý — dùng path nào stack của bạn thích.
  • Chỉ chấp nhận URL http/https công khai. Localhost, IP LAN riêng tư và URL kèm thông tin đăng nhập bị từ chối (bảo vệ SSRF).
  • Chúng tôi theo một số redirect nhỏ và timeout sau vài giây để vote vẫn nhanh.

2. Tạo link vote khuyến khích

Thêm tham số để nhận diện từng người chơi khi họ vào trang vote.

/GAME/server/SLUG/vote?p=PARAMETER
Thành phần Quy tắc
PARAMETER / p_resp Chỉ chữ, số, _, - · tối đa 32 ký tự · tên người dùng, id tài khoản, hoặc id bạn theo dõi
ip IPv4 hoặc IPv6 của người vote như danh sách này thấy (có hỗ trợ proxy khi bật)
Query điền sẵn ?p= hoặc ?username=

3. Những gì chúng tôi gọi sau vote

Chỉ khi thành công. Nếu người chơi chưa hoàn tất vote hợp lệ, chúng tôi không gửi request.

https://YOURDOMAIN/postback.php?p_resp=PARAMETER&ip=USERIP
Link khuyến khích Callback của chúng tôi
/minecraft-server/server/your-server-slug/vote?p=1234 …/postback.php?p_resp=1234&ip=123.123.123.123
/minecraft-server/server/your-server-slug/vote?p=Razor …/postback.php?p_resp=Razor&ip=123.123.123.123

Khi chúng tôi gọi postback với p_resp=Razor, người chơi Razor đã vote. Giá trị ip là địa chỉ họ dùng trên danh sách này.

Script của bạn nên làm gì

  • Xác minh request đến từ IP công khai của danh sách này.
  • Làm sạch p_resp và ip (đừng tin input thô).
  • Xác nhận tài khoản / nhân vật tồn tại trong database.
  • Áp dụng cooldown phần thưởng riêng nếu bạn cần chặt hơn 24 giờ.
  • Trao điểm, coin hoặc vật phẩm; ghi log sự kiện; trả HTTP 200.

Ví dụ postback.php

Host trên site phần thưởng của bạn, không nhất thiết trên danh sách vote này. Đặt VOTE_LIST_IP thành IP outbound công khai của website này trước khi lên live.

<?php
/**
 * Example vote postback receiver for YOUR game website / CMS.
 *
 * Configure this URL on your listing under Dashboard → Edit server → Vote Rewards.
 * This list will call it ONLY after a successful vote:
 *
 *   https://yoursite.com/postback.php?p_resp=PARAMETER&ip=USERIP
 *
 * PARAMETER is the username / account id the player entered on the vote form
 * (or the value from ?p= on your incentive voting link).
 *
 * Docs: /voting-check
 */

define('DEBUG', 0); // set to 1 to write _postback.log
define('LOG_FILE', __DIR__ . '/_postback.log');

/**
 * Only accept callbacks from the vote list's public IP.
 * Leave empty to skip the allowlist (not recommended in production).
 *
 * Example: define('VOTE_LIST_IP', '203.0.113.10');
 */
define('VOTE_LIST_IP', '');

$ipRequest = $_SERVER['HTTP_CF_CONNECTING_IP']
    ?? (isset($_SERVER['HTTP_X_FORWARDED_FOR'])
        ? trim(explode(',', (string) $_SERVER['HTTP_X_FORWARDED_FOR'])[0])
        : null)
    ?? $_SERVER['REMOTE_ADDR']
    ?? '';
$ipRequest = trim((string) $ipRequest);

if (VOTE_LIST_IP !== '' && $ipRequest !== VOTE_LIST_IP) {
    if (DEBUG) {
        error_log(date('[Y-m-d H:i] ') . "[Invalid] Request from {$ipRequest}" . PHP_EOL, 3, LOG_FILE);
    }
    http_response_code(403);
    exit('Forbidden');
}

if (DEBUG) {
    error_log(date('[Y-m-d H:i] ') . "[OK] Valid callback: {$ipRequest}" . PHP_EOL, 3, LOG_FILE);
}

// Clean parameters from the vote list (letters, numbers, underscore, hyphen).
$p = preg_replace('/[^A-Za-z0-9_\-]+/', '', (string) ($_GET['p_resp'] ?? '')) ?? '';
$userIp = preg_replace('/[^0-9a-fA-F:\.]+/', '', (string) ($_GET['ip'] ?? '')) ?? '';

if ($p === '') {
    http_response_code(400);
    exit('Missing p_resp');
}

if (DEBUG) {
    error_log(date('[Y-m-d H:i] ') . "[GET] Parameters [p_resp]={$p} [ip]={$userIp}" . PHP_EOL, 3, LOG_FILE);
}

// ---------------------------------------------------------------------------
// Connect to your database, verify account $p exists, enforce your own
// cooldown if needed, then grant vote points / items to $p (voted from $userIp).
// We send p_resp + ip ONLY when that player successfully voted on the list.
// ---------------------------------------------------------------------------

http_response_code(200);
echo 'OK';
03

Minecraft Votifier

Chúng tôi có thể đẩy vote thẳng vào Minecraft server của bạn. Plugin listener sau đó chạy lệnh thưởng của bạn.

Firewall: cho phép TCP inbound từ IP công khai của website này tới port Votifier (mặc định 8192). Đừng mở port ra cả internet nếu có thể tránh.

  1. Người chơi nhập tên Minecraft trên trang vote của chúng tôi (hoặc vào qua ?p=Steve).

  2. Vote thành công trên danh sách này.

  3. Chúng tôi kết nối tới host/port Votifier của bạn và gửi gói vote.

  4. Listener của bạn trao crate, key, tiền, v.v.

Bật Votifier trong Chi tiết Minecraft, chọn NuVotifier v2 hoặc Classic, rồi nhập host, port và token hoặc khóa công khai RSA.

Cài NuVotifier (RSA classic và protocol v2) hoặc Votifier classic, kèm listener cho version Minecraft của bạn (GAListener, SuperbVote, hoặc listener tùy chỉnh).

Classic / v1: dán toàn bộ file public.key. Host và port lấy từ config.yml. Giữ debug: true khi kết nối danh sách này, rồi tắt sau.

host: YOUR_PUBLIC_IP
port: 8192
debug: true

Gói nhận diện danh sách này là: JoinGameServers

04

NuVotifier v2

Protocol v2 thay RSA bằng token dùng chung và challenge một lần. Map token với tên service của danh sách này, hoặc dùng token mặc định.

tokens:
  default: REPLACE_WITH_DEFAULT_TOKEN
  "JoinGameServers": REPLACE_WITH_LIST_TOKEN

Định dạng wire: TCP connect → đọc greeting VOTIFIER 2 <challenge> → payload JSON (username, serviceName, timestamp ms, address, challenge) → Base64(HMAC-SHA256(payload, token)) → magic 0x733A + length + JSON {signature, payload}. Mong đợi {"status":"ok"}.

Triệu chứng Nguyên nhân có thể
Không phải server NuVotifier v2 Greeting không có challenge — dùng Classic, hoặc nâng cấp NuVotifier và bật v2.
Chữ ký / service không hợp lệ Sai token, hoặc tên service chưa map. Thêm tên service của danh sách hoặc dùng mặc định.
Kết nối thất bại / timeout Sai host/port, Votifier offline, hoặc firewall chặn IP của danh sách này.
Không phản hồi Proxy/plugin can thiệp; bật debug NuVotifier và thử lại.
05

Checklist kiểm thử

  1. Lưu cài đặt listing không có lỗi xác thực.
  2. Mở link khuyến khích — trường tên người dùng phải điền sẵn từ ?p=.
  3. Vote một lần. Bạn sẽ thấy trạng thái thành công. Vote lần hai trong 24 giờ phải bị chặn.
  4. Kiểm tra postback: bật DEBUG trên receiver; xác nhận p_resp và ip tới.
  5. Kiểm tra Votifier: với debug true, console Minecraft nên hiện vote đến cho tên của bạn và tên service của danh sách này.
  6. Xác nhận phần thưởng trong game hoặc trên site. Nếu không, sửa listener — vote trên danh sách vẫn được tính.

Các lần giao được ghi trong vote_reward_logs (ok / fail / skipped). Callback thất bại không bao giờ rollback vote trên danh sách này.

06

FAQ & khắc phục sự cố

Không. Khách có thể vote. Tài khoản đã đăng nhập chia sẻ cùng quy tắc cooldown 24 giờ để chống lạm dụng.

Nếu bạn cấu hình postback URL hoặc Votifier, chúng tôi cần tham số để biết thưởng cho ai. Không cấu hình phần thưởng thì tên người dùng vẫn tùy chọn.

Có. Cả hai chạy sau vote thành công. Lỗi độc lập với nhau.

Phải là URL http(s) công khai. Localhost, .local, IP riêng tư (vd. 10.*, 192.168.*) và URL kèm thông tin đăng nhập đều bị chặn.

Xác nhận vote đã thành công trên danh sách này. Kiểm tra log postback hoặc debug NuVotifier. Xác minh allowlist firewall và tên khớp tài khoản trong game. Cooldown danh sách là 24 giờ; cooldown thưởng của bạn có thể khác.

Chỉ A–Z, a–z, 0–9, _ và -. Ký tự khác bị loại. Giữ tham số ≤ 32 ký tự.