From 868df18001bceb9d0eb4c69c4f4134143369d04f Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Sat, 14 Feb 2026 02:30:12 +0000 Subject: [PATCH] Autosave: 20260214-023012 --- admin/chat_iframe.php | 209 ++++++--- admin/orders.php | 76 ++-- admin/withdrawals.php | 98 ++-- api/check_order_status.php | 14 +- assets/pasted-20260214-020643-a75405ce.png | Bin 0 -> 14319 bytes assets/pasted-20260214-021651-5f5ff45e.png | Bin 0 -> 14268 bytes chat.php | 210 +++++++-- chat_iframe.php | 59 ++- deposit.php | 257 ++++++++--- header.php | 32 -- matching.php | 42 +- profile.php | 493 +++++++++++++-------- withdraw.php | 318 ++++++------- 13 files changed, 1173 insertions(+), 635 deletions(-) create mode 100644 assets/pasted-20260214-020643-a75405ce.png create mode 100644 assets/pasted-20260214-021651-5f5ff45e.png diff --git a/admin/chat_iframe.php b/admin/chat_iframe.php index 59ec7c0..c95b84d 100644 --- a/admin/chat_iframe.php +++ b/admin/chat_iframe.php @@ -5,39 +5,84 @@ require_once '../includes/currency_helper.php'; $pdo = db(); $user_id = $_GET['user_id'] ?? null; -if (!$user_id) die("User ID required"); +if (!$user_id) die("需要用户 ID"); -// Mark as read +// 标记为已读 $pdo->prepare("UPDATE messages SET is_read = 1 WHERE user_id = ? AND sender = 'user'")->execute([$user_id]); -// Handle Message Sending +// 处理消息发送 if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['message'])) { $msg = $_POST['message']; $pdo->prepare("INSERT INTO messages (user_id, sender, message, type) VALUES (?, 'admin', ?, 'text')")->execute([$user_id, $msg]); exit; } -// Handle Recharge Actions +// 处理充值/提现操作 if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['action'])) { $oid = $_POST['order_id']; - if ($_POST['action'] == 'match') { + if ($_POST['action'] == 'match_deposit') { $bank = $_POST['bank_name'] ?? ''; $name = $_POST['account_name'] ?? ''; $number = $_POST['account_number'] ?? ''; $remarks = $_POST['remarks'] ?? ''; $info = "🏦 银行名称:$bank\n👤 收款姓名:$name\n💳 收款账号:$number\n📝 备注说明:$remarks"; $pdo->prepare("UPDATE fiat_orders SET status = 'matched', bank_account_info = ? WHERE id = ?")->execute([$info, $oid]); + // 发送消息给用户 $pdo->prepare("INSERT INTO messages (user_id, sender, message) VALUES (?, 'admin', ?)")->execute([$user_id, $info]); - $pdo->prepare("INSERT INTO messages (user_id, sender, message) VALUES (?, 'admin', ?)")->execute([$user_id, "✅ 匹配成功!收款账户已下发。"]); + $pdo->prepare("INSERT INTO messages (user_id, sender, message) VALUES (?, 'admin', ?)")->execute([$user_id, "✅ 匹配成功!收款账户已下发,请在转账后上传凭证。"]); + echo ""; + exit; + } elseif ($_POST['action'] == 'send_withdraw_format') { + $format = "📋 请提供以下提现收款信息:\n\n1. 银行/钱包名称:\n2. 收款人姓名:\n3. 账号/地址:\n4. 支行/网络:"; + $pdo->prepare("UPDATE fiat_orders SET status = 'matched', bank_account_info = ? WHERE id = ?")->execute([$format, $oid]); + $pdo->prepare("INSERT INTO messages (user_id, sender, message) VALUES (?, 'admin', ?)")->execute([$user_id, $format]); + $pdo->prepare("INSERT INTO messages (user_id, sender, message) VALUES (?, 'admin', ?)")->execute([$user_id, "✅ 请按上述格式回复您的收款详情。"]); + echo ""; + exit; } elseif ($_POST['action'] == 'complete') { - $stmt = $pdo->prepare("SELECT amount, currency FROM fiat_orders WHERE id = ?"); + $stmt = $pdo->prepare("SELECT order_type, usdt_amount, currency FROM fiat_orders WHERE id = ?"); $stmt->execute([$oid]); $order = $stmt->fetch(); - $pdo->prepare("UPDATE users SET balance = balance + ? WHERE id = ?")->execute([$order['amount'], $user_id]); - $pdo->prepare("UPDATE fiat_orders SET status = 'completed' WHERE id = ?")->execute([$oid]); - $pdo->prepare("INSERT INTO messages (user_id, sender, message) VALUES (?, 'admin', ?)")->execute([$user_id, "🎉 充值已确认到账!"]); + + $pdo->beginTransaction(); + try { + if ($order['order_type'] === 'deposit') { + // 充值:增加余额 + $pdo->prepare("UPDATE users SET balance = balance + ? WHERE id = ?")->execute([$order['usdt_amount'], $user_id]); + $msg = "🎉 您的充值已确认到账!"; + } else { + // 提现:余额已在发起时扣除,这里仅标记完成 + $msg = "🎉 您的提现申请已处理完成,请查收!"; + } + $pdo->prepare("UPDATE fiat_orders SET status = 'completed' WHERE id = ?")->execute([$oid]); + $pdo->prepare("INSERT INTO messages (user_id, sender, message) VALUES (?, 'admin', ?)")->execute([$user_id, $msg]); + $pdo->commit(); + } catch (Exception $e) { + $pdo->rollBack(); + die($e->getMessage()); + } + echo ""; + exit; } elseif ($_POST['action'] == 'reject') { - $pdo->prepare("UPDATE fiat_orders SET status = 'rejected' WHERE id = ?")->execute([$oid]); + $stmt = $pdo->prepare("SELECT order_type, usdt_amount FROM fiat_orders WHERE id = ?"); + $stmt->execute([$oid]); + $order = $stmt->fetch(); + + $pdo->beginTransaction(); + try { + if ($order['order_type'] === 'withdrawal') { + // 提现拒绝:退还余额 + $pdo->prepare("UPDATE users SET balance = balance + ? WHERE id = ?")->execute([$order['usdt_amount'], $user_id]); + } + $pdo->prepare("UPDATE fiat_orders SET status = 'rejected' WHERE id = ?")->execute([$oid]); + $pdo->prepare("INSERT INTO messages (user_id, sender, message) VALUES (?, 'admin', ?)")->execute([$user_id, "❌ 您的申请已被拒绝,如有疑问请咨询客服。"]); + $pdo->commit(); + } catch (Exception $e) { + $pdo->rollBack(); + die($e->getMessage()); + } + echo ""; + exit; } } @@ -45,7 +90,7 @@ $user = $pdo->prepare("SELECT * FROM users WHERE id = ?"); $user->execute([$user_id]); $userData = $user->fetch(); -$orders = $pdo->prepare("SELECT * FROM fiat_orders WHERE user_id = ? AND status IN ('matching', 'submitting', 'matched') ORDER BY id DESC"); +$orders = $pdo->prepare("SELECT * FROM fiat_orders WHERE user_id = ? AND status IN ('matching', 'matched', 'paid') ORDER BY id DESC"); $orders->execute([$user_id]); $pending_orders = $orders->fetchAll(); ?> @@ -55,82 +100,123 @@ $pending_orders = $orders->fetchAll();
- (UID: ) - Balance: USDT + (UID: ) + 余额: USDT
-
+
+
待处理申请 (ACTIVE REQUESTS)
-
- - +
+
+ : + USDT +
+
+ -
- - - - - - -
- -
- - View Proof - -
+ + + + +
+ + + + + +
+
+ +
+ + + +
+ + +
+
- +
-
+ - +
- +
- +
- +
- +
+ + \ No newline at end of file diff --git a/admin/orders.php b/admin/orders.php index 137e202..9f943ec 100644 --- a/admin/orders.php +++ b/admin/orders.php @@ -16,7 +16,7 @@ if (isset($_POST['action'])) { $orderStmt->execute([$id]); $order = $orderStmt->fetch(); if ($order) { - $msg = "您的充值订单 #$id 匹配成功。请刷新支付页面查看收款账户详情并按要求完成转账。"; + $msg = "📢 您的充值订单 #$id 匹配成功.\n收款账户信息:\n$info\n请按要求完成转账并上传凭证。"; $pdo->prepare("INSERT INTO messages (user_id, sender, message) VALUES (?, 'admin', ?)")->execute([$order['user_id'], $msg]); } } elseif ($_POST['action'] == 'complete') { @@ -24,7 +24,7 @@ if (isset($_POST['action'])) { $orderStmt->execute([$id]); $order = $orderStmt->fetch(); if ($order) { - $credit_amount = $order['usdt_amount'] > 0 ? $order['usdt_amount'] : $order['amount']; + $credit_amount = $order['usdt_amount']; $pdo->beginTransaction(); try { @@ -34,7 +34,7 @@ if (isset($_POST['action'])) { // Update transaction status $pdo->prepare("UPDATE transactions SET status = 'completed' WHERE user_id = ? AND type = 'deposit' AND description LIKE ?")->execute([$order['user_id'], "%#$id%"]); - $msg = "您的充值 " . $credit_amount . " USDT 已确认到账。"; + $msg = "🎉 您的充值 " . $credit_amount . " USDT 已确认到账。"; $pdo->prepare("INSERT INTO messages (user_id, sender, message) VALUES (?, 'admin', ?)")->execute([$order['user_id'], $msg]); $pdo->commit(); @@ -51,22 +51,15 @@ if (isset($_POST['action'])) { if ($order) { // Update transaction status $pdo->prepare("UPDATE transactions SET status = 'rejected' WHERE user_id = ? AND type = 'deposit' AND description LIKE ?")->execute([$order['user_id'], "%#$id%"]); + $pdo->prepare("INSERT INTO messages (user_id, sender, message) VALUES (?, 'admin', ?)")->execute([$order['user_id'], "❌ 您的充值申请 #$id 已被拒绝,请咨询客服。"]); } } } -$all_deposits = $pdo->query("SELECT o.*, u.username, u.uid FROM fiat_orders o JOIN users u ON o.user_id = u.id ORDER BY o.id DESC")->fetchAll(); - -usort($all_deposits, function($a, $b) { - $priority = ['matching' => 3, 'submitting' => 2, 'pending' => 2, 'matched' => 1, 'completed' => 0]; - $pA = $priority[$a['status']] ?? 0; - $pB = $priority[$b['status']] ?? 0; - if ($pA != $pB) return $pB - $pA; - return $b['id'] - $a['id']; -}); +$all_deposits = $pdo->query("SELECT o.*, u.username, u.uid FROM fiat_orders o JOIN users u ON o.user_id = u.id WHERE o.order_type = 'deposit' ORDER BY o.id DESC")->fetchAll(); $unread_msgs = $pdo->query("SELECT COUNT(*) FROM messages WHERE sender = 'user' AND is_read = 0")->fetchColumn(); -$pending_orders_count = $pdo->query("SELECT COUNT(*) FROM fiat_orders WHERE status IN ('matching', 'submitting')")->fetchColumn(); +$pending_orders_count = $pdo->query("SELECT COUNT(*) FROM fiat_orders WHERE status IN ('matching', 'paid')")->fetchColumn(); ?> @@ -87,9 +80,10 @@ $pending_orders_count = $pdo->query("SELECT COUNT(*) FROM fiat_orders WHERE stat .table th, .table td { padding: 12px; text-align: left; border-bottom: 1px solid var(--border); font-size: 0.85rem; } .status-badge { padding: 3px 8px; border-radius: 4px; font-size: 0.75rem; font-weight: bold; } .matching { background: rgba(255, 60, 0, 0.2); color: #ff3c00; border: 1px solid #ff3c00; } - .submitting { background: rgba(0, 192, 135, 0.2); color: #00c087; border: 1px solid #00c087; } + .paid { background: rgba(0, 192, 135, 0.2); color: #00c087; border: 1px solid #00c087; } .matched { background: rgba(55, 122, 255, 0.1); color: #377aff; } .completed { background: rgba(0, 192, 135, 0.1); color: #00c087; opacity: 0.6; } + .rejected { background: rgba(246, 70, 93, 0.1); color: #f6465d; } .btn-primary { background: var(--primary); color: black; border: none; padding: 8px 15px; border-radius: 6px; font-weight: bold; cursor: pointer; } @@ -122,7 +116,8 @@ $pending_orders_count = $pdo->query("SELECT COUNT(*) FROM fiat_orders WHERE stat - + # (UID: ) @@ -130,34 +125,57 @@ $pending_orders_count = $pdo->query("SELECT COUNT(*) FROM fiat_orders WHERE stat - + 查看凭证 - + 未上传 - + - + + + - +
- -
- - - -
- + +
+
+ + + +
+
+ + + +
+
+ - +
- \ No newline at end of file + diff --git a/admin/withdrawals.php b/admin/withdrawals.php index bfd1279..e81f3b3 100644 --- a/admin/withdrawals.php +++ b/admin/withdrawals.php @@ -9,70 +9,60 @@ $error_msg = ""; // Handle Actions if (isset($_POST['action'])) { $id = $_POST['order_id']; + $table = 'fiat_orders'; if ($_POST['action'] == 'complete') { - $pdo->prepare("UPDATE orders SET status = 'completed' WHERE id = ?")->execute([$id]); + $pdo->prepare("UPDATE $table SET status = 'completed' WHERE id = ?")->execute([$id]); - $orderStmt = $pdo->prepare("SELECT user_id, amount, currency, type FROM orders WHERE id = ?"); + $orderStmt = $pdo->prepare("SELECT user_id, usdt_amount FROM $table WHERE id = ?"); $orderStmt->execute([$id]); $order = $orderStmt->fetch(); if ($order) { // Update transaction status - $pdo->prepare("UPDATE transactions SET status = 'completed' WHERE user_id = ? AND type = 'withdraw' AND description LIKE ?")->execute([$order['user_id'], "%#$id%"]); + $pdo->prepare("UPDATE transactions SET status = 'completed' WHERE user_id = ? AND type = 'withdrawal' AND description LIKE ?")->execute([$order['user_id'], "%#$id%"]); - $msg = "您的提现 " . $order['amount'] . " USDT 已汇出,请查收。"; + $msg = "🎉 您的提现 " . $order['usdt_amount'] . " USDT 已汇出,请查收。"; $pdo->prepare("INSERT INTO messages (user_id, sender, message) VALUES (?, 'admin', ?)")->execute([$order['user_id'], $msg]); } $success_msg = "确认成功,提现已处理。"; } elseif ($_POST['action'] == 'reject') { - $remark = !empty($_POST['remark']) ? $_POST['remark'] : '违反规定'; + $remark = !empty($_POST['remark']) ? $_POST['remark'] : '审核不通过'; - $orderStmt = $pdo->prepare("SELECT user_id, amount FROM orders WHERE id = ?"); + $orderStmt = $pdo->prepare("SELECT user_id, usdt_amount FROM $table WHERE id = ?"); $orderStmt->execute([$id]); $order = $orderStmt->fetch(); if ($order) { $pdo->beginTransaction(); try { - // Return balance - $pdo->prepare("UPDATE users SET balance = balance + ? WHERE id = ?")->execute([$order['amount'], $order['user_id']]); - $pdo->prepare("UPDATE orders SET status = 'rejected' WHERE id = ?")->execute([$id]); + // 退还余额 + $pdo->prepare("UPDATE users SET balance = balance + ? WHERE id = ?")->execute([$order['usdt_amount'], $order['user_id']]); + $pdo->prepare("UPDATE $table SET status = 'rejected' WHERE id = ?")->execute([$id]); - // Log return to transactions + // 记录退还到交易记录 $pdo->prepare("INSERT INTO transactions (user_id, type, amount, currency, status, description) VALUES (?, 'withdraw_return', ?, 'USDT', 'completed', ?)")->execute([ - $order['user_id'], $order['amount'], "Withdrawal #$id Rejected: $remark" + $order['user_id'], $order['usdt_amount'], "提现申请 #$id 被拒绝退回: $remark" ]); - // Update original transaction status - $pdo->prepare("UPDATE transactions SET status = 'rejected' WHERE user_id = ? AND type = 'withdraw' AND description LIKE ?")->execute([$order['user_id'], "%#$id%"]); + // 更新原交易状态 + $pdo->prepare("UPDATE transactions SET status = 'rejected' WHERE user_id = ? AND type = 'withdrawal' AND description LIKE ?")->execute([$order['user_id'], "%#$id%"]); - $msg = "您的提现申请 #$id 已被拒绝,资金已退回您的余额。原因: " . $remark; + $msg = "❌ 您的提现申请 #$id 已被拒绝,资金已退回。原因: " . $remark; $pdo->prepare("INSERT INTO messages (user_id, sender, message) VALUES (?, 'admin', ?)")->execute([$order['user_id'], $msg]); $pdo->commit(); - $success_msg = "拒绝成功"; + $success_msg = "已成功驳回提现申请。"; } catch (Exception $e) { $pdo->rollBack(); $error_msg = "操作失败: " . $e->getMessage(); } - } else { - $error_msg = "订单不存在。"; - } - } elseif ($_POST['action'] == 'send_format') { - $orderStmt = $pdo->prepare("SELECT user_id FROM orders WHERE id = ?"); - $orderStmt->execute([$id]); - $order = $orderStmt->fetch(); - if ($order) { - $format = "【出款格式】\n提现单号: #$id\n请确认您的收货地址及相关信息准确无误。管理员正在进行最后审核。"; - $pdo->prepare("INSERT INTO messages (user_id, sender, message) VALUES (?, 'admin', ?)")->execute([$order['user_id'], $format]); - $success_msg = "出款格式已发送。"; } } } -$withdrawals = $pdo->query("SELECT o.*, u.username, u.uid FROM orders o JOIN users u ON o.user_id = u.id WHERE o.type IN ('usdt', 'fiat') ORDER BY o.id DESC")->fetchAll(); +$withdrawals = $pdo->query("SELECT o.*, u.username, u.uid FROM fiat_orders o JOIN users u ON o.user_id = u.id WHERE o.order_type = 'withdrawal' ORDER BY o.id DESC")->fetchAll(); $unread_msgs = $pdo->query("SELECT COUNT(*) FROM messages WHERE sender = 'user' AND is_read = 0")->fetchColumn(); -$pending_orders_count = $pdo->query("SELECT COUNT(*) FROM fiat_orders WHERE status IN ('matching', 'submitting')")->fetchColumn(); +$pending_orders_count = $pdo->query("SELECT COUNT(*) FROM fiat_orders WHERE status IN ('matching', 'paid')")->fetchColumn(); $pending_kyc = $pdo->query("SELECT COUNT(*) FROM users WHERE kyc_status = 1")->fetchColumn(); ?> @@ -97,7 +87,8 @@ $pending_kyc = $pdo->query("SELECT COUNT(*) FROM users WHERE kyc_status = 1")->f .table th { background: #fafafa; color: #707a8a; font-weight: 600; } .status-badge { padding: 4px 10px; border-radius: 6px; font-size: 0.75rem; font-weight: bold; } - .pending { background: #fff9e6; color: #f0b90b; } + .matching { background: rgba(255, 60, 0, 0.2); color: #ff3c00; border: 1px solid #ff3c00; } + .paid { background: rgba(0, 192, 135, 0.2); color: #00c087; border: 1px solid #00c087; } .completed { background: #e6fff1; color: #03ad5d; } .rejected { background: #fff1f0; color: #f6465d; } @@ -108,7 +99,6 @@ $pending_kyc = $pdo->query("SELECT COUNT(*) FROM users WHERE kyc_status = 1")->f .btn { padding: 8px 15px; border: none; border-radius: 6px; cursor: pointer; font-size: 0.85rem; font-weight: 600; transition: 0.2s; } .btn-success { background: #03ad5d; color: white; } .btn-danger { background: #f6465d; color: white; } - .btn-info { background: #4facfe; color: white; } .btn:hover { opacity: 0.9; } input[type="text"] { padding: 8px; border: 1px solid var(--border); border-radius: 6px; font-size: 0.85rem; outline: none; width: 120px; } @@ -151,55 +141,55 @@ $pending_kyc = $pdo->query("SELECT COUNT(*) FROM users WHERE kyc_status = 1")->f ID 用户 - 金额 (USDT) - 类型 - 详情 + 提现币种 + 金额 + 折算 USDT 状态 操作 - + # - () + (UID: ) + - - - + + + + - +
-
- - - -
- +
- +
- + -- - + - +
- + \ No newline at end of file diff --git a/api/check_order_status.php b/api/check_order_status.php index d53e349..c8c125f 100644 --- a/api/check_order_status.php +++ b/api/check_order_status.php @@ -1,26 +1,24 @@ 'unauthorized']); + echo json_encode(['success' => false, 'error' => 'Unauthorized']); exit; } $user_id = $_SESSION['user_id']; $pdo = db(); -$stmt = $pdo->prepare("SELECT status, bank_account_info FROM fiat_orders WHERE user_id = ? AND status IN ('matching', 'matched', 'submitting') ORDER BY id DESC LIMIT 1"); +// Check for active orders (including 'paid' which means waiting for admin approval) +$stmt = $pdo->prepare("SELECT id, order_type, status, bank_account_info FROM fiat_orders WHERE user_id = ? AND status IN ('matching', 'matched', 'paid') ORDER BY id DESC LIMIT 1"); $stmt->execute([$user_id]); $order = $stmt->fetch(); if ($order) { - echo json_encode([ - 'status' => $order['status'], - 'account_info' => $order['bank_account_info'] - ]); + echo json_encode(['success' => true, 'order' => $order]); } else { - echo json_encode(['status' => 'none']); + echo json_encode(['success' => true, 'order' => null]); } diff --git a/assets/pasted-20260214-020643-a75405ce.png b/assets/pasted-20260214-020643-a75405ce.png new file mode 100644 index 0000000000000000000000000000000000000000..500a7f9b2c8e01dd759a74e376983eecdd796e4a GIT binary patch literal 14319 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
xK#RM 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 Z4Uzkv85+{xPX;6qx#vpHN+peh{tw44Zf^hp literal 0 HcmV?d00001 diff --git a/assets/pasted-20260214-021651-5f5ff45e.png b/assets/pasted-20260214-021651-5f5ff45e.png new file mode 100644 index 0000000000000000000000000000000000000000..b749806a15ebc4b750473fa4a0e774a7c2b6289c GIT binary patch literal 14268 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 literal 0 HcmV?d00001 diff --git a/chat.php b/chat.php index 7ebbfba..aff0495 100644 --- a/chat.php +++ b/chat.php @@ -13,18 +13,32 @@ $stmt = $pdo->prepare("SELECT uid, username FROM users WHERE id = ?"); $stmt->execute([$user_id]); $user = $stmt->fetch(); -// Get user IP -$user_ip = $_SERVER['REMOTE_ADDR']; -if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { - $user_ip = $_SERVER['HTTP_X_FORWARDED_FOR']; +// Check if there's an active deposit/withdrawal process +$stmt = $pdo->prepare("SELECT * FROM fiat_orders WHERE user_id = ? AND status IN ('matching', 'matched', 'paid') ORDER BY id DESC LIMIT 1"); +$stmt->execute([$user_id]); +$active_order = $stmt->fetch(); + +$is_locked = (bool)$active_order; + +// Action to complete transfer/submission +if (isset($_GET['action']) && $_GET['action'] === 'complete_order' && $active_order) { + $stmt = $pdo->prepare("UPDATE fiat_orders SET status = 'paid' WHERE id = ?"); + $stmt->execute([$active_order['id']]); + + $type_text = ($active_order['order_type'] === 'deposit') ? "充值" : "提现"; + $msg = "✅ 用户已点击确认,$type_text 申请等待审核中。"; + $stmt = $pdo->prepare("INSERT INTO messages (user_id, sender, message) VALUES (?, 'user', ?)"); + $stmt->execute([$user_id, $msg]); + + header("Location: chat.php"); + exit; } // Fetch greeting message $stmt = $pdo->prepare("SELECT value FROM settings WHERE name = 'chat_greeting'"); $stmt->execute(); -$greeting = $stmt->fetchColumn() ?: 'Hello! Welcome to NovaEx official support. How can we help you today?'; +$greeting = $stmt->fetchColumn() ?: '您好!欢迎咨询 NovaEx 官方客服,请问有什么可以帮您?如果是充值咨询,请提供您的充值金额和币种。'; -// Handle POST request via AJAX if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['message'])) { $msg = trim($_POST['message']); if ($msg !== '') { @@ -43,48 +57,104 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['message'])) { #chat-box { flex: 1; overflow-y: auto; padding: 25px; display: flex; flex-direction: column; gap: 20px; background: #161a1e; scroll-behavior: smooth; } .msg-container { display: flex; flex-direction: column; transition: all 0.3s ease; } - .msg-content { max-width: 75%; padding: 12px 18px; border-radius: 18px; font-size: 14px; line-height: 1.6; } + .msg-content { max-width: 75%; padding: 12px 18px; border-radius: 18px; font-size: 14px; line-height: 1.6; position: relative; } + + .locked-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.85); backdrop-filter: blur(5px); z-index: 9999; display: flex; align-items: center; justify-content: center; } + .locked-modal { background: #1e2329; width: 90%; max-width: 500px; border-radius: 24px; padding: 40px; text-align: center; border: 1px solid var(--primary-color); } + + .account-modal { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); width: 90%; max-width: 450px; background: #1e2329; border-radius: 24px; border: 1px solid var(--primary-color); z-index: 10001; padding: 30px; box-shadow: 0 20px 50px rgba(0,0,0,0.8); display: none; } + .modal-backdrop { position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0,0,0,0.8); z-index: 10000; display: none; } + + .status-bar { background: rgba(240,185,11,0.1); border: 1px solid var(--primary-color); padding: 15px 25px; border-radius: 12px; margin-bottom: 15px; display: flex; align-items: center; justify-content: space-between; color: var(--primary-color); } + + #image-upload-btn:hover { background: #3b424d !important; color: #fcd535 !important; } + #image-upload-btn:disabled { opacity: 0.5; cursor: not-allowed; } -
-
+ + + + +
+ +
+
+ +
+
+
+
+
+ +
+ + + + + + + +
+
+ + +
-
+
-

NovaEx Support

+

官方客服中心

- Online + 24/7 全天候在线
UID:
-
IP:
+ 退出
- -
Connecting to support...
+
正在连接客服...
- - -
@@ -92,11 +162,31 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['message'])) {
+ + + + \ No newline at end of file diff --git a/chat_iframe.php b/chat_iframe.php index d417f8d..33c70f2 100644 --- a/chat_iframe.php +++ b/chat_iframe.php @@ -27,13 +27,18 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['message'])) { @@ -41,13 +46,19 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['message'])) {
+ + - +
\ No newline at end of file diff --git a/deposit.php b/deposit.php index 465c325..b2d9c65 100644 --- a/deposit.php +++ b/deposit.php @@ -6,84 +6,227 @@ require_once 'db/config.php'; require_once 'includes/currency_helper.php'; $db = db(); -$stmt = $db->prepare("SELECT id FROM fiat_orders WHERE user_id = ? AND status IN ('matching', 'matched', 'submitting') ORDER BY id DESC LIMIT 1"); +// 检查是否有正在进行的订单,如果有则跳转到聊天 +$stmt = $db->prepare("SELECT id FROM fiat_orders WHERE user_id = ? AND status IN ('matching', 'matched', 'paid') ORDER BY id DESC LIMIT 1"); $stmt->execute([$_SESSION['user_id']]); if ($stmt->fetch()) { header("Location: chat.php"); exit; } $fiat_rates = get_fiat_rates(); $fiat_currencies_info = [ - 'USD' => 'US Dollar', 'EUR' => 'Euro', 'GBP' => 'British Pound', 'CNY' => 'Chinese Yuan', 'HKD' => 'Hong Kong Dollar', 'JPY' => 'Japanese Yen', 'KRW' => 'Korean Won', 'SGD' => 'Singapore Dollar', 'TWD' => 'Taiwan Dollar', 'THB' => 'Thai Baht', 'VND' => 'Vietnamese Dong', 'IDR' => 'Indonesian Rupiah', 'MYR' => 'Malaysian Ringgit', + 'USD' => ['name' => '美元', 'flag' => '🇺🇸'], + 'EUR' => ['name' => '欧元', 'flag' => '🇪🇺'], + 'GBP' => ['name' => '英镑', 'flag' => '🇬🇧'], + 'CNY' => ['name' => '人民币', 'flag' => '🇨🇳'], + 'HKD' => ['name' => '港币', 'flag' => '🇭🇰'], + 'JPY' => ['name' => '日元', 'flag' => '🇯🇵'], + 'KRW' => ['name' => '韩元', 'flag' => '🇰🇷'], + 'SGD' => ['name' => '新加坡元', 'flag' => '🇸🇬'], + 'TWD' => ['name' => '台币', 'flag' => '🇹🇼'], + 'THB' => ['name' => '泰铢', 'flag' => '🇹🇭'], + 'VND' => ['name' => '越南盾', 'flag' => '🇻🇳'], + 'IDR' => ['name' => '印尼盾', 'flag' => '🇮🇩'], + 'MYR' => ['name' => '马来西亚林吉特', 'flag' => '🇲🇾'], ]; ?> -
-
- -
-

-

+ + +
+
+
+ 个人中心 +

充值

+

通过多种通道安全地为您的账户充值

-
-
-
-
-

-
-
-
-
-
-

USDT

-
+
+ +
+
安全保障
+
所有交易均经过加密处理,24/7 全天候监控。您的资金受到我们的安全资产基金保护。
-
-
- -
-
- +
+
+
+

1. 选择充值方式

+
+
+
+
法币充值
+
银行转账 / 全球 OTC
+
+
+
+
USDT 充值
+
USDT (TRC20, ERC20, BEP20)
+
-
- -
-
- - -
- -
- +
+ + + + \ No newline at end of file diff --git a/header.php b/header.php index b1b7518..18f9fa7 100644 --- a/header.php +++ b/header.php @@ -99,9 +99,6 @@ $site_logo = $settings['site_logo'] ?? null; #mobileMenuBtn { display: block !important; margin-right: 15px; } } - /* Payout Popup */ - #payout-popup { position: fixed; top: 50%; left: 50%; transform: translate(-50%, -50%); background: var(--card-bg); border: 1px solid var(--border-color); padding: 30px; border-radius: 20px; z-index: 3000; display: none; width: 90%; max-width: 400px; box-shadow: 0 30px 60px rgba(0,0,0,0.8); } - .dropdown-content { display: none; position: absolute; background-color: var(--card-bg); min-width: 200px; box-shadow: 0 15px 40px rgba(0,0,0,0.6); z-index: 1001; border: 1px solid var(--border-color); border-radius: 12px; top: 100%; right: 0; overflow: hidden; } .dropdown:hover .dropdown-content { display: block; } .dropdown-content a { color: white; padding: 14px 20px; text-decoration: none; display: flex; align-items: center; gap: 12px; font-size: 14px; transition: background 0.2s; } @@ -110,15 +107,6 @@ $site_logo = $settings['site_logo'] ?? null; -
-
- -

-
-
- -
- @@ -268,24 +256,4 @@ $site_logo = $settings['site_logo'] ?? null; const chat = document.getElementById('cs-chat-window'); chat.style.display = chat.style.display === 'flex' ? 'none' : 'flex'; } - - - setInterval(async () => { - try { - const resp = await fetch('api/get_messages.php'); - const res = await resp.json(); - if (res.success && res.data) { - const payoutMsg = res.data.find(m => m.message.includes('【出款格式】')); - if (payoutMsg) { - const popup = document.getElementById('payout-popup'); - const content = document.getElementById('payout-content'); - if (popup.style.display !== 'block') { - content.innerText = payoutMsg.message; - popup.style.display = 'block'; - } - } - } - } catch (e) {} - }, 5000); - \ No newline at end of file diff --git a/matching.php b/matching.php index 1e98f4e..173a611 100644 --- a/matching.php +++ b/matching.php @@ -13,30 +13,52 @@ $pdo = db(); if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['amount'])) { $amount = (float)$_POST['amount']; - $type = $_POST['type'] ?? 'fiat'; + $order_type = $_POST['order_type'] ?? 'deposit'; // 'deposit' or 'withdrawal' + $type = $_POST['type'] ?? 'fiat'; // 'fiat' or 'usdt' $currency = $_POST['currency'] ?? 'USDT'; $network = $_POST['network'] ?? ''; $fiat_rates = get_fiat_rates(); $rate = $fiat_rates[$currency] ?? 1.0; - $usdt_amount = ($rate > 0) ? ($amount / $rate) : $amount; + + if ($order_type === 'deposit') { + $usdt_amount = ($rate > 0) ? ($amount / $rate) : $amount; + } else { + // Withdrawal: amount is already in USDT (usually) + $usdt_amount = $amount; + + // For withdrawal, we check balance first + $stmt = $pdo->prepare("SELECT balance FROM users WHERE id = ?"); + $stmt->execute([$user_id]); + $balance = (float)$stmt->fetchColumn(); + + if ($balance < $usdt_amount) { + die("余额不足"); + } + + // Deduct balance immediately for withdrawal + $stmt = $pdo->prepare("UPDATE users SET balance = balance - ? WHERE id = ?"); + $stmt->execute([$usdt_amount, $user_id]); + } $expires_at = date('Y-m-d H:i:s', strtotime('+30 minutes')); $pdo->beginTransaction(); try { // Create order with status 'matching' - $stmt = $pdo->prepare("INSERT INTO fiat_orders (user_id, amount, usdt_amount, exchange_rate, currency, status, expires_at, created_at) VALUES (?, ?, ?, ?, ?, 'matching', ?, CURRENT_TIMESTAMP)"); - $stmt->execute([$user_id, $amount, $usdt_amount, $rate, $currency, $expires_at]); + $stmt = $pdo->prepare("INSERT INTO fiat_orders (user_id, order_type, amount, usdt_amount, exchange_rate, currency, status, expires_at, created_at) VALUES (?, ?, ?, ?, ?, ?, 'matching', ?, CURRENT_TIMESTAMP)"); + $stmt->execute([$user_id, $order_type, $amount, $usdt_amount, $rate, $currency, $expires_at]); $order_id = $pdo->lastInsertId(); // Log to transactions table - $stmt = $pdo->prepare("INSERT INTO transactions (user_id, type, amount, currency, status, description) VALUES (?, 'deposit', ?, 'USDT', 'pending', ?)"); - $stmt->execute([$user_id, $usdt_amount, "Deposit Request #$order_id ($amount $currency)"]); + $desc = ($order_type === 'deposit') ? "充值申请 #$order_id ($amount $currency)" : "提现申请 #$order_id ($amount $currency)"; + $stmt = $pdo->prepare("INSERT INTO transactions (user_id, type, amount, currency, status, description) VALUES (?, ?, ?, 'USDT', 'pending', ?)"); + $stmt->execute([$user_id, $order_type, ($order_type === 'deposit' ? $usdt_amount : -$usdt_amount), $desc]); - // Explicit notification message for admin/chat + // Notification message for admin/chat + $type_text = ($order_type === 'deposit') ? "充值" : "提现"; $method_info = ($type === 'usdt') ? "USDT ($network)" : "法币 ($currency)"; - $msg = "升匆 用户发起充值,金额 $amount $currency\n订单号: #$order_id\n方式: $method_info"; + $msg = "📢 用户发起 $type_text 请求\n金额: $amount $currency\n订单号: #$order_id\n方式: $method_info"; $stmt = $pdo->prepare("INSERT INTO messages (user_id, sender, message) VALUES (?, 'user', ?)"); $stmt->execute([$user_id, $msg]); @@ -49,6 +71,6 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['amount'])) { die("Error: " . $e->getMessage()); } } else { - header("Location: deposit.php"); + header("Location: index.php"); exit; -} +} \ No newline at end of file diff --git a/profile.php b/profile.php index bebd00d..426c578 100644 --- a/profile.php +++ b/profile.php @@ -15,169 +15,302 @@ $user = $stmt->fetch(); $kyc_status = $user['kyc_status'] ?? 0; $kyc_labels = [ - 0 => __('kyc_none', '未认证'), - 1 => __('kyc_pending', '审核中'), - 2 => __('kyc_approved', '已认证'), - 3 => __('kyc_rejected', '未通过'), + 0 => '未认证', + 1 => '审核中', + 2 => '已认证', + 3 => '未通过', ]; $kyc_colors = [0 => '#888', 1 => '#f0b90b', 2 => 'var(--success-color)', 3 => 'var(--danger-color)']; ?> -
+
- -
- -
-
- -
-
-
+ +
+
+
diff --git a/withdraw.php b/withdraw.php index 977f97c..fd064b6 100644 --- a/withdraw.php +++ b/withdraw.php @@ -14,199 +14,175 @@ $stmt = $db->prepare("SELECT * FROM users WHERE id = ?"); $stmt->execute([$_SESSION['user_id']]); $user = $stmt->fetch(); +// Check for active orders +$stmt = $db->prepare("SELECT id FROM fiat_orders WHERE user_id = ? AND status IN ('matching', 'matched', 'paid') ORDER BY id DESC LIMIT 1"); +$stmt->execute([$_SESSION['user_id']]); +if ($stmt->fetch()) { header("Location: chat.php"); exit; } + $fiat_rates = get_fiat_rates(); $fiat_currencies_info = [ - 'USD' => 'US Dollar', 'EUR' => 'Euro', 'GBP' => 'British Pound', 'CNY' => 'Chinese Yuan', 'HKD' => 'Hong Kong Dollar', 'JPY' => 'Japanese Yen', 'KRW' => 'Korean Won', 'SGD' => 'Singapore Dollar', 'TWD' => 'Taiwan Dollar', 'THB' => 'Thai Baht', 'VND' => 'Vietnamese Dong', 'IDR' => 'Indonesian Rupiah', 'MYR' => 'Malaysian Ringgit', + 'USD' => ['name' => '美元', 'flag' => '🇺🇸'], + 'EUR' => ['name' => '欧元', 'flag' => '🇪🇺'], + 'GBP' => ['name' => '英镑', 'flag' => '🇬🇧'], + 'CNY' => ['name' => '人民币', 'flag' => '🇨🇳'], + 'HKD' => ['name' => '港币', 'flag' => '🇭🇰'], + 'JPY' => ['name' => '日元', 'flag' => '🇯🇵'], + 'KRW' => ['name' => '韩元', 'flag' => '🇰🇷'], + 'SGD' => ['name' => '新加坡元', 'flag' => '🇸🇬'], + 'TWD' => ['name' => '台币', 'flag' => '🇹🇼'], + 'THB' => ['name' => '泰铢', 'flag' => '🇹🇭'], + 'VND' => ['name' => '越南盾', 'flag' => '🇻🇳'], + 'IDR' => ['name' => '印尼盾', 'flag' => '🇮🇩'], + 'MYR' => ['name' => '马来西亚林吉特', 'flag' => '🇲🇾'], ]; $error = ''; - -if ($_SERVER['REQUEST_METHOD'] === 'POST') { - $type = $_POST['type'] ?? 'usdt'; - $amount = (float)($_POST['amount'] ?? 0); - $currency = $_POST['currency'] ?? 'USDT'; - $trading_pass = $_POST['trading_password'] ?? ''; - $address = $_POST['address'] ?? ''; - $network = $_POST['network'] ?? ''; - $bank_info = $_POST['bank_info'] ?? ''; - - if ($trading_pass !== $user['trading_password']) { - $error = "Incorrect trading password / 交易密码错误"; - } elseif ($amount > $user['balance']) { - $error = "Insufficient balance / 余额不足"; - } elseif ($amount < 10) { - $error = "Minimum withdrawal amount is 10 USDT / 最低提现金额为 10 USDT"; - } else { - $db->beginTransaction(); - try { - // Deduct balance (Freeze/Pre-deduct as per standard practice, Reject will return it) - $stmt = $db->prepare("UPDATE users SET balance = balance - ? WHERE id = ?"); - $stmt->execute([$amount, $_SESSION['user_id']]); - - // Log withdrawal order - $info = ($type === 'usdt') ? "USDT Network: $network, Address: $address" : "Fiat Currency: $currency, Bank Info: $bank_info"; - - // Calculate fiat amount if fiat type - $fiat_amount = $amount; - if ($type === 'fiat' && isset($fiat_rates[$currency])) { - $fiat_amount = $amount * $fiat_rates[$currency]; - } - - $stmt = $db->prepare("INSERT INTO orders (user_id, type, amount, currency, account_info, status) VALUES (?, ?, ?, ?, ?, 'pending')"); - $stmt->execute([$_SESSION['user_id'], $type, $amount, $currency, $info]); - $order_id = $db->lastInsertId(); - - // Log to transactions table - $stmt = $db->prepare("INSERT INTO transactions (user_id, type, amount, currency, status, description) VALUES (?, 'withdraw', ?, 'USDT', 'pending', ?)"); - $stmt->execute([$_SESSION['user_id'], -$amount, "Withdrawal Request #$order_id" . ($type === 'fiat' ? " ($fiat_amount $currency)" : "")]); - - // Insert notification message for chat - $method_info = ($type === 'usdt') ? "USDT ($network)" : "法币 ($currency)"; - $msg = "👈 用户申请提现,金额 $amount USDT\n订单号: #$order_id\n方式: $method_info\n详情: $info\n请及时处理。"; - $stmt = $db->prepare("INSERT INTO messages (user_id, sender, message) VALUES (?, 'user', ?)"); - $stmt->execute([$_SESSION['user_id'], $msg]); - - $db->commit(); - echo ""; - exit; - } catch (Exception $e) { - $db->rollBack(); - $error = "System error, please try again later / 系统错误,请稍后再试: " . $e->getMessage(); - } - } -} ?> -
-
- - + -
-

-

+
+
+
+ 个人中心 +

提现

+

安全地将您的资产提取至个人账户

-
- +
+ +
-
-
-
-
- -
-
-

-

-
-
-
- -
-
-
- -
-
-

-

Blockchain Transfer

-
-
-
-
- -
-
- - -
+