202 lines
7.5 KiB
PHP
202 lines
7.5 KiB
PHP
<?php
|
||
session_start();
|
||
require_once __DIR__ . '/db/config.php';
|
||
require_once __DIR__ . '/api/LocalLubanApi.php';
|
||
|
||
$pdo = db();
|
||
$api = new LubanSMS();
|
||
|
||
$action = $_GET['action'] ?? '';
|
||
|
||
header('Content-Type: application/json');
|
||
|
||
if (!isset($_SESSION['user_id']) && $action !== 'login') {
|
||
echo json_encode(['code' => 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;
|
||
}
|