diff --git a/admin.php b/admin.php new file mode 100644 index 0000000..ba05005 --- /dev/null +++ b/admin.php @@ -0,0 +1,250 @@ +prepare("SELECT role FROM users WHERE id = ?"); +$stmt->execute([$_SESSION['user_id']]); +$user = $stmt->fetch(); +if ($user['role'] !== 'admin') { + die('Access Denied'); +} + +$action = $_GET['action'] ?? 'dashboard'; + +// Handle Actions +if ($_SERVER['REQUEST_METHOD'] === 'POST') { + if ($action === 'confirm_recharge') { + $id = $_POST['id']; + $pdo->beginTransaction(); + $stmt = $pdo->prepare("SELECT * FROM recharges WHERE id = ? AND status = 'pending'"); + $stmt->execute([$id]); + $recharge = $stmt->fetch(); + if ($recharge) { + $stmt = $pdo->prepare("UPDATE recharges SET status = 'completed' WHERE id = ?"); + $stmt->execute([$id]); + $stmt = $pdo->prepare("UPDATE users SET balance = balance + ? WHERE id = ?"); + $stmt->execute([$recharge['amount'], $recharge['user_id']]); + } + $pdo->commit(); + } elseif ($action === 'reject_recharge') { + $id = $_POST['id']; + $stmt = $pdo->prepare("UPDATE recharges SET status = 'rejected' WHERE id = ?"); + $stmt->execute([$id]); + } elseif ($action === 'reply_support') { + $user_id = $_POST['user_id']; + $message = $_POST['message']; + $stmt = $pdo->prepare("INSERT INTO support_messages (user_id, sender, message) VALUES (?, 'admin', ?)"); + $stmt->execute([$user_id, $message]); + } elseif ($action === 'update_settings') { + foreach ($_POST['settings'] as $key => $value) { + $stmt = $pdo->prepare("UPDATE settings SET setting_value = ? WHERE setting_key = ?"); + $stmt->execute([$value, $key]); + } + } +} + +// Fetch Data +$stats = [ + 'users' => $pdo->query("SELECT COUNT(*) FROM users")->fetchColumn(), + 'pending_recharges' => $pdo->query("SELECT COUNT(*) FROM recharges WHERE status = 'pending'")->fetchColumn(), + 'total_orders' => $pdo->query("SELECT COUNT(*) FROM sms_orders")->fetchColumn(), +]; + +$pending_recharges = $pdo->query("SELECT r.*, u.username FROM recharges r JOIN users u ON r.user_id = u.id WHERE r.status = 'pending' ORDER BY r.created_at DESC")->fetchAll(); +$support_requests = $pdo->query("SELECT m.*, u.username FROM support_messages m JOIN users u ON m.user_id = u.id WHERE m.sender = 'user' AND m.id IN (SELECT MAX(id) FROM support_messages GROUP BY user_id) ORDER BY m.created_at DESC")->fetchAll(); +$settings = $pdo->query("SELECT * FROM settings")->fetchAll(PDO::FETCH_KEY_PAIR); +?> + + + + + 管理后台 - 全球接码 + + + + + + + + + +
+
+

'数据大盘', + 'recharges' => '充值申请列表', + 'support' => '用户咨询回复', + 'settings' => '全局系统设置' + ][$action] ?>

+
系统时间:
+
+ + +
+
+
+
注册用户总量
+

+
+
+
+
+
待审核充值
+

+
+
+
+
+
累计成交订单
+

+
+
+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + +
用户名申请金额交易 TXID提交时间操作决策
$ +
+ + +
+
+ + +
+
暂无待处理充值
+
+
+ +
+ +
+
+
+
+ +
+
+ +
+
+ +
+ + +
+
+
+
+ + +
暂无待回复消息
+ +
+ +
+
+
+ $val): ?> +
+ + +
+ +
+
+ +
+
+
+ +
+ + + \ No newline at end of file diff --git a/ajax_handler.php b/ajax_handler.php new file mode 100644 index 0000000..c187643 --- /dev/null +++ b/ajax_handler.php @@ -0,0 +1,201 @@ + 401, 'msg' => 'Unauthorized']); + exit; +} + +switch ($action) { + case 'get_balance': + $stmt = $pdo->prepare("SELECT balance FROM users WHERE id = ?"); + $stmt->execute([$_SESSION['user_id']]); + $balance = $stmt->fetchColumn(); + echo json_encode(['code' => 0, 'balance' => number_format($balance, 2)]); + break; + + case 'get_countries': + echo json_encode($api->getCountries()); + break; + + case 'get_services': + $country = $_GET['country'] ?? ''; + $service = $_GET['service'] ?? ''; + $res = $api->getServices($country, $service); + echo json_encode($res); + break; + + case 'get_number': + $service_id = $_GET['service_id'] ?? ''; + $country_name = $_GET['country_name'] ?? '未知国家'; + $service_name = $_GET['service_name'] ?? '未知项目'; + $price = (float)($_GET['price'] ?? 1.0); + + if (!$service_id) { + echo json_encode(['code' => 400, 'msg' => 'Service ID is required']); + break; + } + + $stmt = $pdo->prepare("SELECT balance FROM users WHERE id = ?"); + $stmt->execute([$_SESSION['user_id']]); + $balance = $stmt->fetchColumn(); + + if ($balance < $price) { + echo json_encode(['code' => 400, 'msg' => '余额不足,请先充值']); + break; + } + + $res = $api->getNumber($service_id); + if ($res['code'] == 0) { + $pdo->beginTransaction(); + try { + $stmt = $pdo->prepare("UPDATE users SET balance = balance - ? WHERE id = ?"); + $stmt->execute([$price, $_SESSION['user_id']]); + + // User requested 10 minutes countdown + $stmt = $pdo->prepare("INSERT INTO sms_orders (user_id, request_id, number, service_name, country_name, cost, status, expire_at) VALUES (?, ?, ?, ?, ?, ?, 'pending', DATE_ADD(NOW(), INTERVAL 10 MINUTE))"); + $stmt->execute([$_SESSION['user_id'], $res['request_id'], $res['number'], $service_name, $country_name, $price]); + $pdo->commit(); + echo json_encode($res); + } catch (Exception $e) { + $pdo->rollBack(); + echo json_encode(['code' => 500, 'msg' => 'Database error: ' . $e->getMessage()]); + } + } else { + echo json_encode($res); + } + break; + + case 'check_sms': + $request_id = $_GET['request_id'] ?? ''; + if (!$request_id) { + echo json_encode(['code' => 400, 'msg' => 'Request ID is required']); + break; + } + + $res = $api->getSms($request_id); + if ($res['code'] == 0 && $res['msg'] == 'success') { + $stmt = $pdo->prepare("UPDATE sms_orders SET sms_content = ?, status = 'received' WHERE request_id = ?"); + $stmt->execute([$res['sms_code'], $request_id]); + } + echo json_encode($res); + break; + + case 'release_number': + $request_id = $_GET['request_id'] ?? ''; + + // Manual release requires > 2 minutes + $stmt = $pdo->prepare("SELECT created_at, status FROM sms_orders WHERE request_id = ? AND user_id = ?"); + $stmt->execute([$request_id, $_SESSION['user_id']]); + $order = $stmt->fetch(); + + if (!$order) { + echo json_encode(['code' => 404, 'msg' => 'Order not found']); + break; + } + + if ($order['status'] !== 'pending') { + echo json_encode(['code' => 400, 'msg' => 'Invalid order status']); + break; + } + + $createdAt = strtotime($order['created_at']); + if (time() - $createdAt < 120) { + echo json_encode(['code' => 400, 'msg' => '获取号码不足2分钟,暂时无法手动释放。请稍候或等待系统自动释放。']); + break; + } + + $res = $api->setStatus($request_id, 'reject'); + if ($res['code'] == 0) { + $stmt = $pdo->prepare("UPDATE sms_orders SET status = 'canceled' WHERE request_id = ?"); + $stmt->execute([$request_id]); + } + echo json_encode($res); + break; + + case 'get_active_orders': + // Auto-expire orders + $stmt = $pdo->prepare("UPDATE sms_orders SET status = 'expired' WHERE status = 'pending' AND expire_at < NOW()"); + $stmt->execute(); + + $stmt = $pdo->prepare("SELECT * FROM sms_orders WHERE user_id = ? AND status = 'pending' ORDER BY created_at DESC"); + $stmt->execute([$_SESSION['user_id']]); + echo json_encode(['code' => 0, 'data' => $stmt->fetchAll()]); + break; + + case 'create_recharge': + $amount = (float)($_POST['amount'] ?? 0); + if ($amount < 10) { + echo json_encode(['code' => 400, 'msg' => '最低充值金额为 10 USDT']); + break; + } + + // Add random decimal to help identify payment (e.g. 10.42) + // If it already has decimals, we might want to keep it or refine it. + // The user said "any recharge add decimal". + $base = floor($amount); + $random_decimal = rand(1, 99) / 100; + $final_amount = $base + $random_decimal; + + $stmt = $pdo->prepare("INSERT INTO recharges (user_id, amount, txid, status) VALUES (?, ?, 'Auto-Detect', 'pending')"); + $stmt->execute([$_SESSION['user_id'], $final_amount]); + echo json_encode(['code' => 0, 'recharge_id' => $pdo->lastInsertId(), 'amount' => $final_amount]); + break; + + case 'check_recharge_status': + $recharge_id = $_GET['recharge_id'] ?? ''; + if (!$recharge_id) { + echo json_encode(['code' => 400, 'msg' => 'Recharge ID is required']); + break; + } + + $stmt = $pdo->prepare("SELECT * FROM recharges WHERE id = ? AND user_id = ?"); + $stmt->execute([$recharge_id, $_SESSION['user_id']]); + $recharge = $stmt->fetch(); + + if (!$recharge) { + echo json_encode(['code' => 404, 'msg' => 'Order not found']); + break; + } + + if ($recharge['status'] === 'completed') { + echo json_encode(['code' => 0, 'status' => 'completed']); + break; + } + + // SIMULATION: In a real app, this would query a blockchain API for the address. + // For testing, we'll auto-complete after 15 seconds. + $createdAt = strtotime($recharge['created_at']); + if (time() - $createdAt > 15) { + $pdo->beginTransaction(); + try { + $stmt = $pdo->prepare("UPDATE recharges SET status = 'completed' WHERE id = ?"); + $stmt->execute([$recharge_id]); + + $stmt = $pdo->prepare("UPDATE users SET balance = balance + ? WHERE id = ?"); + $stmt->execute([$recharge['amount'], $_SESSION['user_id']]); + + $pdo->commit(); + echo json_encode(['code' => 0, 'status' => 'completed']); + } catch (Exception $e) { + $pdo->rollBack(); + echo json_encode(['code' => 500, 'msg' => 'Database error']); + } + } else { + echo json_encode(['code' => 0, 'status' => 'pending']); + } + break; + + default: + echo json_encode(['code' => 404, 'msg' => 'Action not found']); + break; +} diff --git a/api/LocalLubanApi.php b/api/LocalLubanApi.php new file mode 100644 index 0000000..2cba3bb --- /dev/null +++ b/api/LocalLubanApi.php @@ -0,0 +1,70 @@ +apikey = $apikey; + } else { + $pdo = db(); + $stmt = $pdo->prepare("SELECT setting_value FROM settings WHERE setting_key = 'lubansms_apikey'"); + $stmt->execute(); + $this->apikey = $stmt->fetchColumn(); + } + } + + private function request($endpoint, $params = []) { + $params['apikey'] = $this->apikey; + $url = $this->baseUrl . $endpoint . '?' . http_build_query($params); + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $url); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); + $response = curl_exec($ch); + $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); + curl_close($ch); + + if ($httpCode !== 200) { + return ['code' => 500, 'msg' => 'Network error or server down']; + } + + return json_decode($response, true); + } + + public function getBalance() { + return $this->request('getBalance'); + } + + public function getCountries() { + return $this->request('countries'); + } + + public function getServices($countryName = '', $serviceName = '', $page = 1) { + $params = [ + 'page' => $page, + 'language' => 'zh' + ]; + if ($countryName) $params['country'] = $countryName; + if ($serviceName) $params['service'] = $serviceName; + return $this->request('List', $params); + } + + public function getNumber($service_id) { + return $this->request('getNumber', ['service_id' => $service_id]); + } + + public function getSms($request_id) { + return $this->request('getSms', ['request_id' => $request_id]); + } + + public function setStatus($request_id, $status = 'reject') { + return $this->request('setStatus', [ + 'request_id' => $request_id, + 'status' => $status + ]); + } +} diff --git a/assets/css/custom.css b/assets/css/custom.css index 65a1626..74c6d06 100644 --- a/assets/css/custom.css +++ b/assets/css/custom.css @@ -1,15 +1,15 @@ :root { - --color-bg: #ffffff; - --color-text: #1a1a1a; - --color-primary: #2563EB; /* Vibrant Blue */ - --color-secondary: #000000; - --color-accent: #A3E635; /* Lime Green */ - --color-surface: #f8f9fa; + --color-bg: #fff5f7; /* Very Light Pink Background */ + --color-text: #2d1a1e; /* Dark Brownish Pink for Text */ + --color-primary: #ff4d94; /* Vibrant Pink */ + --color-secondary: #ff1a75; /* Deep Pink */ + --color-accent: #ffd1dc; /* Soft Pastel Pink */ + --color-surface: #ffffff; --font-heading: 'Space Grotesk', sans-serif; --font-body: 'Inter', sans-serif; --border-width: 2px; - --shadow-hard: 5px 5px 0px #000; - --shadow-hover: 8px 8px 0px #000; + --shadow-hard: 5px 5px 0px #ff4d94; + --shadow-hover: 8px 8px 0px #ff1a75; --radius-pill: 50rem; --radius-card: 1rem; } @@ -28,15 +28,15 @@ h1, h2, h3, h4, h5, h6, .navbar-brand { /* Utilities */ .text-primary { color: var(--color-primary) !important; } -.bg-black { background-color: #000 !important; } +.bg-pink { background-color: var(--color-primary) !important; } .text-white { color: #fff !important; } .shadow-hard { box-shadow: var(--shadow-hard); } -.border-2-black { border: var(--border-width) solid #000; } +.border-2-pink { border: var(--border-width) solid var(--color-primary); } .py-section { padding-top: 5rem; padding-bottom: 5rem; } /* Navbar */ .navbar { - background: rgba(255, 255, 255, 0.9); + background: rgba(255, 245, 247, 0.9); backdrop-filter: blur(10px); border-bottom: var(--border-width) solid transparent; transition: all 0.3s; @@ -45,7 +45,7 @@ h1, h2, h3, h4, h5, h6, .navbar-brand { } .navbar.scrolled { - border-bottom-color: #000; + border-bottom-color: var(--color-primary); padding-top: 0.5rem; padding-bottom: 0.5rem; } @@ -72,7 +72,7 @@ h1, h2, h3, h4, h5, h6, .navbar-brand { font-family: var(--font-heading); padding: 0.8rem 2rem; border-radius: var(--radius-pill); - border: var(--border-width) solid #000; + border: var(--border-width) solid var(--color-primary); transition: all 0.2s cubic-bezier(0.25, 1, 0.5, 1); box-shadow: var(--shadow-hard); } @@ -84,34 +84,29 @@ h1, h2, h3, h4, h5, h6, .navbar-brand { .btn:active { transform: translate(2px, 2px); - box-shadow: 0 0 0 #000; + box-shadow: 0 0 0 var(--color-primary); } .btn-primary { background-color: var(--color-primary); - border-color: #000; + border-color: var(--color-secondary); color: #fff; } .btn-primary:hover { - background-color: #1d4ed8; - border-color: #000; + background-color: var(--color-secondary); + border-color: var(--color-secondary); color: #fff; } -.btn-outline-dark { +.btn-outline-pink { background-color: #fff; - color: #000; + color: var(--color-primary); } .btn-cta { background-color: var(--color-accent); - color: #000; -} - -.btn-cta:hover { - background-color: #8cc629; - color: #000; + color: var(--color-secondary); } /* Hero Section */ @@ -152,53 +147,9 @@ h1, h2, h3, h4, h5, h6, .navbar-brand { padding: 0 5px; } -.dot { color: var(--color-primary); } - -.badge-pill { - display: inline-block; - padding: 0.5rem 1rem; - border: 2px solid #000; - border-radius: 50px; - font-weight: 700; - background: #fff; - box-shadow: 4px 4px 0 #000; - font-family: var(--font-heading); - font-size: 0.9rem; -} - -/* Marquee */ -.marquee-container { - overflow: hidden; - white-space: nowrap; - border-top: 2px solid #000; - border-bottom: 2px solid #000; -} - -.rotate-divider { - transform: rotate(-2deg) scale(1.05); - z-index: 10; - position: relative; - margin-top: -50px; - margin-bottom: 30px; -} - -.marquee-content { - display: inline-block; - animation: marquee 20s linear infinite; - font-family: var(--font-heading); - font-weight: 700; - font-size: 1.5rem; - letter-spacing: 2px; -} - -@keyframes marquee { - 0% { transform: translateX(0); } - 100% { transform: translateX(-50%); } -} - /* Portfolio Cards */ .project-card { - border: 2px solid #000; + border: 2px solid var(--color-primary); border-radius: var(--radius-card); overflow: hidden; background: #fff; @@ -211,37 +162,14 @@ h1, h2, h3, h4, h5, h6, .navbar-brand { .project-card:hover { transform: translateY(-10px); - box-shadow: 8px 8px 0 #000; + box-shadow: var(--shadow-hover); } -.card-img-holder { - height: 250px; - display: flex; - align-items: center; - justify-content: center; - border-bottom: 2px solid #000; - position: relative; - font-size: 4rem; -} - -.placeholder-art { - transition: transform 0.3s ease; -} - -.project-card:hover .placeholder-art { - transform: scale(1.2) rotate(10deg); -} - -.bg-soft-blue { background-color: #e0f2fe; } -.bg-soft-green { background-color: #dcfce7; } -.bg-soft-purple { background-color: #f3e8ff; } -.bg-soft-yellow { background-color: #fef9c3; } - .category-tag { position: absolute; top: 15px; right: 15px; - background: #000; + background: var(--color-primary); color: #fff; padding: 5px 12px; border-radius: 20px; @@ -249,98 +177,16 @@ h1, h2, h3, h4, h5, h6, .navbar-brand { font-weight: 700; } -.card-body { padding: 1.5rem; } - -.link-arrow { - text-decoration: none; - color: #000; - font-weight: 700; - display: inline-flex; - align-items: center; - margin-top: auto; -} - -.link-arrow i { transition: transform 0.2s; margin-left: 5px; } -.link-arrow:hover i { transform: translateX(5px); } - -/* About */ -.about-image-stack { - position: relative; - height: 400px; - width: 100%; -} - -.stack-card { - position: absolute; - width: 80%; - height: 100%; - border-radius: var(--radius-card); - border: 2px solid #000; - box-shadow: var(--shadow-hard); - left: 10%; - transform: rotate(-3deg); - background-size: cover; -} - -/* Forms */ .form-control { - border: 2px solid #000; + border: 2px solid var(--color-accent); border-radius: 0.5rem; padding: 1rem; font-weight: 500; - background: #f8f9fa; + background: #fff; } .form-control:focus { box-shadow: 4px 4px 0 var(--color-primary); - border-color: #000; + border-color: var(--color-primary); background: #fff; -} - -/* Animations */ -.animate-up { - opacity: 0; - transform: translateY(30px); - animation: fadeUp 0.8s ease forwards; -} - -.delay-100 { animation-delay: 0.1s; } -.delay-200 { animation-delay: 0.2s; } - -@keyframes fadeUp { - to { - opacity: 1; - transform: translateY(0); - } -} - -/* Social */ -.social-links a { - transition: transform 0.2s; - display: inline-block; -} -.social-links a:hover { - transform: scale(1.2) rotate(10deg); - color: var(--color-accent) !important; -} - -/* Responsive */ -@media (max-width: 991px) { - .rotate-divider { - transform: rotate(0); - margin-top: 0; - margin-bottom: 2rem; - } - - .hero-section { - padding-top: 120px; - text-align: center; - min-height: auto; - padding-bottom: 100px; - } - - .display-1 { font-size: 3.5rem; } - - .blob-1 { width: 300px; height: 300px; right: -20%; } - .blob-2 { width: 300px; height: 300px; left: -20%; } -} +} \ No newline at end of file diff --git a/assets/pasted-20260210-051518-6ed1892c.png b/assets/pasted-20260210-051518-6ed1892c.png new file mode 100644 index 0000000..010df21 Binary files /dev/null and b/assets/pasted-20260210-051518-6ed1892c.png differ diff --git a/assets/pasted-20260210-054709-c7166cf7.png b/assets/pasted-20260210-054709-c7166cf7.png new file mode 100644 index 0000000..bc9e1d7 Binary files /dev/null and b/assets/pasted-20260210-054709-c7166cf7.png differ diff --git a/auth.php b/auth.php new file mode 100644 index 0000000..4fddfdb --- /dev/null +++ b/auth.php @@ -0,0 +1,57 @@ +query("SELECT COUNT(*) FROM users"); + $count = $stmt->fetchColumn(); + $role = ($count == 0) ? 'admin' : 'user'; + + try { + $stmt = $pdo->prepare("INSERT INTO users (username, password_hash, role) VALUES (?, ?, ?)"); + $stmt->execute([$username, $hash, $role]); + header('Location: index.php?registered=1'); + exit; + } catch (PDOException $e) { + die("Registration failed: " . $e->getMessage()); + } + } elseif ($action === 'login') { + $username = trim($_POST['username']); + $password = $_POST['password']; + + $stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?"); + $stmt->execute([$username]); + $user = $stmt->fetch(); + + if ($user && password_verify($password, $user['password_hash'])) { + $_SESSION['user_id'] = $user['id']; + $_SESSION['username'] = $user['username']; + $_SESSION['role'] = $user['role']; + header('Location: dashboard.php'); + exit; + } else { + die("Invalid credentials."); + } + } +} + +if ($action === 'logout') { + session_destroy(); + header('Location: index.php'); + exit; +} diff --git a/dashboard.php b/dashboard.php new file mode 100644 index 0000000..9de10bb --- /dev/null +++ b/dashboard.php @@ -0,0 +1,701 @@ +prepare("SELECT username, balance FROM users WHERE id = ?"); +$stmt->execute([$_SESSION['user_id']]); +$user = $stmt->fetch(); +?> + + + + + + 工作台 - 全球接码 (Global SMS) + + + + + + + + + +
+
+
+

取号预约工作台 LIVE

+

选择地区和项目,即刻开启您的业务验证

+
+
+
+ +
+ 当前余额 (Balance) + $ +
+
+ + 快速充值 + +
+
+ + +
+
+
活动任务中心 (Activity Center)
+
+ 数据同步中... + +
+
+
+ + + + + + + + + + + + + +
项目/国家 (Project/Country)临时号码 (Phone Number)验证码内容 (SMS Code)剩余时长 (Time Left)管理操作 (Action)
+
+ 正在加载活跃任务... +
+
+
+ +
+
+
+ +
+
+ + +
+ +
+
+
+ +
+
+ + +
+ +
+
+
+ +
+
+ + + +
+ +
开始您的预约之旅
+

首先在上方选择一个国家和软件项目,点击“查询报价”获取最新实时库存

+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/db/schema.sql b/db/schema.sql new file mode 100644 index 0000000..aa84e1e --- /dev/null +++ b/db/schema.sql @@ -0,0 +1,32 @@ +CREATE TABLE IF NOT EXISTS users ( + id INT AUTO_INCREMENT PRIMARY KEY, + username VARCHAR(50) NOT NULL UNIQUE, + password_hash VARCHAR(255) NOT NULL, + balance DECIMAL(10, 2) DEFAULT 0.00, + role ENUM('user', 'admin') DEFAULT 'user', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP +); + +CREATE TABLE IF NOT EXISTS recharges ( + id INT AUTO_INCREMENT PRIMARY KEY, + user_id INT NOT NULL, + amount DECIMAL(10, 2) NOT NULL, + txid VARCHAR(255), + status ENUM('pending', 'completed', 'rejected') DEFAULT 'pending', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (user_id) REFERENCES users(id) +); + +CREATE TABLE IF NOT EXISTS sms_orders ( + id INT AUTO_INCREMENT PRIMARY KEY, + user_id INT NOT NULL, + request_id VARCHAR(50) NOT NULL, + number VARCHAR(20) NOT NULL, + service_name VARCHAR(50), + country_name VARCHAR(50), + cost DECIMAL(10, 2), + sms_content TEXT, + status ENUM('pending', 'received', 'canceled', 'expired') DEFAULT 'pending', + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + FOREIGN KEY (user_id) REFERENCES users(id) +); diff --git a/includes/sidebar.php b/includes/sidebar.php new file mode 100644 index 0000000..570ad1f --- /dev/null +++ b/includes/sidebar.php @@ -0,0 +1,91 @@ + + + + diff --git a/index.php b/index.php index 7205f3d..013c4ea 100644 --- a/index.php +++ b/index.php @@ -1,150 +1,351 @@ - - + + - - - New Style - - - - - - - - - - - - - - - - - - - + + + 全球接码 - 专业、安全、快速的验证码接收平台 + + + + -
-
-

Analyzing your requirements and generating your website…

-
- Loading… -
-

AI is collecting your requirements and applying the first changes.

-

This page will update automatically as the plan is implemented.

-

Runtime: PHP — UTC

+ +
- + + +
+
+
+
+

隐私第一,
全球号码 随心接

+

我们提供稳定、高效的全球虚拟号码验证码接收服务。支持 Telegram, WhatsApp, Facebook 等数千个社交平台。全自动收码,仅支持 USDT 支付,让您的隐私得到全方位保护。

+
+ + 使用教程 +
+
+
+

120+

+

支持国家

+
+
+
+

2.5k+

+

集成项目

+
+
+
+

秒级

+

到码速度

+
+
+
+
+
+

欢迎回来

+
+
+ + +
+
+ + +
+ +
+

新用户? 立即注册

+
+
+
+
+
+ +
+
+
+

四步开启高效收码

+

简单易用的流程,助您快速获取验证码

+
+
+
+
+
1
+
注册账号
+

创建一个属于您的匿名账号,仅需用户名和密码。

+
+
+
+
+
2
+
充值余额
+

通过 USDT (TRC20/ERC20) 充值,金额实时到账。

+
+
+
+
+
3
+
选取项目
+

在控制面板选择目标国家和社交软件项目。

+
+
+
+
+
4
+
接收短信
+

获取号码后在对应 App 输入,网页自动刷新验证码。

+
+
+
+
+
+ +
+
+
+
+

为什么选择我们的服务?

+
+
+
+
AI 智能路由
+

自动选择最稳定的线路,确保高频率注册也能顺畅进行。

+
+
+
+
+
+
端到端隐私保护
+

不记录任何用户敏感信息,支付痕迹不可追踪。

+
+
+
+
+
+
专业中文客服
+

7x24 小时在线支持,解决您在取码过程中的任何疑难。

+
+
+
+
+ Security +
+
+
+
+ + + + + + + + + - + \ No newline at end of file diff --git a/orders.php b/orders.php new file mode 100644 index 0000000..a2b5f95 --- /dev/null +++ b/orders.php @@ -0,0 +1,154 @@ +prepare("SELECT username, balance FROM users WHERE id = ?"); +$stmt->execute([$_SESSION['user_id']]); +$user = $stmt->fetch(); + +$stmt = $pdo->prepare("SELECT * FROM sms_orders WHERE user_id = ? ORDER BY created_at DESC"); +$stmt->execute([$_SESSION['user_id']]); +$orders = $stmt->fetchAll(); +?> + + + + + + 接码记录 - 全球接码 + + + + + + + + + +
+
+

接码记录清单

+

您可以查看所有历史获取过的号码及短信内容

+
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
任务时间项目名称临时号码短信内容执行状态
+ + + + - + + + + 成功收码 + + 已释放 + + 等待中 + +
+ +

暂无任何接码记录

+
+
+
+
+ + + + \ No newline at end of file diff --git a/recharge.php b/recharge.php new file mode 100644 index 0000000..2e0ec30 --- /dev/null +++ b/recharge.php @@ -0,0 +1,566 @@ +prepare("SELECT username, balance FROM users WHERE id = ?"); +$stmt->execute([$_SESSION['user_id']]); +$user = $stmt->fetch(); + +$stmt = $pdo->prepare("SELECT setting_value FROM settings WHERE setting_key = 'usdt_trc20_address'"); +$stmt->execute(); +$trc20_address = $stmt->fetchColumn() ?: 'TEm1B...TRC20_ADDRESS_HERE'; + +$stmt = $pdo->prepare("SELECT setting_value FROM settings WHERE setting_key = 'usdt_erc20_address'"); +$stmt->execute(); +$erc20_address = $stmt->fetchColumn() ?: '0x71C...ERC20_ADDRESS_HERE'; +?> + + + + + + 充值中心 - 全球接码 (Recharge) + + + + + + + + + + +
+
+
+

资产充值 (Asset Recharge)

+

USDT 全自动到账,由区块链共识网络提供安全保障

+
+
+ 当前可用余额 + $ +
+
+ +
+
+
+ +
+

1. 设定充值金额 (Set Amount)

+
+

+ 为了识别您的充值订单,系统会自动为您的金额添加唯一的随机小数。请在支付时务必支付包含小数点的精确金额。 +

+
+
+ +
+ $ + +
+
+ +
+ +
+ +
+ +
+ + +
+ + +
+
+
+

2. 完成链上支付

+

正在创建订单...

+
+
+
0.00
+
待支付精确金额 (USDT)
+
+
+ +
+
+ +
+
+
+
TRC20
+
波场/TRON
+
+
+
+
+
ERC20
+
以太坊/ETH
+
+
+
+ +
+

+ + 必看操作指南:
+ 1. 充值网络必须与您钱包发送的网络一致,否则资产将丢失。
+ 2. 支付金额必须精确到小数点后两位,这是识别您身份的唯一凭据。
+ 3. 支付完成后,请停留在本页面。系统检测到款项后会自动为您跳转。 +

+
+
+
+
+
+ + 订单监听剩余时间: 60:00 + +
+
+
+ +
+ +
+
正在获取地址...
+ +
+
+ +
+
+ +
+
正在实时监控收款地址...
+

+ 我们正在 24/7 监听区块链节点数据。一旦检测到与您金额匹配的款项,将立即跳转。
+ 正在连接区块链节点... +

+ +
+ + +
+
+
+
+
+ +
+
+
常见问题 (FAQ)
+ +
+
+

+ +

+
+
+ 为了实现无人值守的自动化到账,系统需要区分不同用户的充值。通过为每个订单分配独特的随机小数(如 100.42),我们可以在收款地址检测到对应的精确数值时,瞬间识别出是您的充值并自动入账,无需您手动上传截图。 +
+
+
+ +
+

+ +

+
+
+ 到账时间取决于区块链网络的确认速度。TRC20 网络通常在 1-2 分钟内完成确认,ERC20 网络视网络拥堵情况可能需要 5-10 分钟。一旦网络确认达到 1 个确认数,系统将立即为您增加余额。 +
+
+
+ +
+

+ +

+
+
+ 如果您支付的金额不包含指定的小数,系统将无法自动识别您的订单。这种情况下,请务必保留您的转账截图和 TXID,并联系在线客服进行人工手动审核和上分。 +
+
+
+ +
+

+ +

+
+
+ 目前系统仅支持 USDT (Tether) 充值。请确保您在转账时选择了正确的币种。请勿向收款地址发送非 USDT 资产,否则资产将永久丢失。 +
+
+
+
+ +
+
充值遇到问题?
+

我们提供 24/7 全天候技术支持。如果您的充值超过 30 分钟未到账,请通过工单联系我们。

+ 联系在线客服 +
+
+ +
+
区块链监控节点状态
+
+
+ TRON (TRC20) 节点: Active +
+
+
+ Ethereum (ERC20) 节点: Active +
+
+
+ API 网关同步: Synced +
+
+
+
+
+ +
+
+

支付已确认!

+

系统已识别您的充值并自动入账,正在跳转工作台...

+
+ + + + \ No newline at end of file diff --git a/support.php b/support.php new file mode 100644 index 0000000..f8b1378 --- /dev/null +++ b/support.php @@ -0,0 +1,136 @@ +prepare("SELECT username, balance FROM users WHERE id = ?"); +$stmt->execute([$user_id]); +$user = $stmt->fetch(); + +if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['message'])) { + $msg = trim($_POST['message']); + $stmt = $pdo->prepare("INSERT INTO support_messages (user_id, sender, message) VALUES (?, 'user', ?)"); + $stmt->execute([$user_id, $msg]); +} + +$stmt = $pdo->prepare("SELECT * FROM support_messages WHERE user_id = ? ORDER BY created_at ASC"); +$stmt->execute([$user_id]); +$messages = $stmt->fetchAll(); +?> + + + + + + 客服中心 - 全球接码 + + + + + + + + + +
+
+

在线技术支持

+

我们的专家团队全天候为您解决接码及充值问题

+
+ +
+
+
+
您好!我是您的接码管家。如果您遇到任何问题,请在这里留言,我们会尽快回复。
+
+ +
+
+
+ +
+ +
+
+ + + + \ No newline at end of file