背景:多处 SQL 由用户输入拼接——update() 的动态键(mod)直接作列名入 SET 子句;
卡密/分类卡密批量 INSERT 手拼 SQL 值元组(insert_back_row 零转义);DelUse 删除
语句手拼 fid。列名注入与手拼值注入均可被利用篡改/破坏数据。
1. 列名注入(动态 mod 键):
- function/function_core.php 新增 wq_is_db_field($name):仅允许 [A-Za-z0-9_]{1,64}
合法 SQL 标识符,杜绝引号/空格/注释符进入列名
- admin/ajax.php 四处 change* 动态更新加守卫(非法 mod 直接 die「不支持修改的字段」):
* changegrade (sq_level)
* changeuser (sq_user)
* changefid (sq_fidlist)
* changeagent (sq_agent)
- 注:agent 侧 changeuser/changeagent 已有字段白名单(P0-05 已加 password 哈希),无需重复
2. 手拼 INSERT 值元组(creatkey / creatfidkey,admin+agent 双侧):
- 卡密金额 sc_money:强制 is_numeric(),非法直接拒绝(money 会裸拼进 INSERT 与卡密串)
- 分类 fid sc_fid:强制 (int) 整型化后再拼入(防多语句/注释符逃逸)
3. DelUse 删除语句(admin+agent 双侧):
- fid 强制 (int) 整型化;agent 侧 aid 亦 (int) 化
- 注入载荷如 "1 AND 1=1" 被截为 1,SQL 结构不再可被改写
回归(30 项全 PASS,8082 内置服务器):
- 各 change* 正常字段修改成功且 DB 生效;列名注入(price,x / 多语句 DROP 载荷)全部被拒,目标表完好
- creatkey 正常生成、余额正确扣除;money 注入载荷被 is_numeric 拒绝
- creatfidkey 合法 fid 正常生成;注入 fid 在 fid 查找即被拒(int 化后无命中)
- DelUse 注入 fid 被 int 化后正常执行(删 0 行),表结构完好
- 注:(int)"1; DROP..."=1(前导数字保留),(int)"'; DROP..."=0,载荷均无法逃逸 SQL 结构
1265 lines
59 KiB
PHP
1265 lines
59 KiB
PHP
<?php
|
||
/**
|
||
* Created by PhpStorm.
|
||
* User: 温泉
|
||
* Date: 2017-10-19
|
||
* Time: 22:12
|
||
* 测试的
|
||
*/
|
||
include __DIR__ . '/../function/function_core.php';
|
||
if ($_GET['mod'] === 'login') {
|
||
if (!empty($_POST['token'])) {
|
||
if (!$result = $db->select_first_row('sq_agent', '*', array('accesstoken' => $_POST['token']), 'AND')) {
|
||
die(json_encode(array('code' => '-1', 'msg' => '秘钥错误')));
|
||
} else {
|
||
$_SESSION['agent_username'] = $result['username'];
|
||
// P0-05: 会话持有数据库中的"存储值"(新 bcrypt / 旧明文),与重校验 WHERE password=会话 保持一致
|
||
$_SESSION['agent_password'] = $result['password'];
|
||
$_SESSION['agent_id'] = $result['ID'];
|
||
$_SESSION['agent_qq'] = $result['qq'];
|
||
$_SESSION['agent_HTTP_USER_AGENT'] = $_SERVER['HTTP_USER_AGENT'];
|
||
$db->update('sq_agent', array('username' => $_SESSION['agent_username']), 'AND', array('loginip' => get_real_ip(), 'logintime' => time()));
|
||
die(json_encode(array('code' => '1', 'msg' => '登陆成功')));
|
||
}
|
||
}
|
||
|
||
|
||
include __DIR__ . '/../function/VerificationCode.class.php';
|
||
$verification = Verification::check($_POST['token']);
|
||
if ($verification !== true) {
|
||
die(json_encode(array('code' => '-88', 'msg' => '请先进行人机验证')));
|
||
}
|
||
if (empty($_POST['username'])) {
|
||
die(json_encode(array('code' => -1, 'msg' => '请输入您的用户名')));
|
||
}
|
||
if (empty($_POST['password'])) {
|
||
die(json_encode(array('code' => -2, 'msg' => '请输入您的密码')));
|
||
}
|
||
|
||
// P0-05: 按用户名取出后用 PHP 校验(兼容新 bcrypt / 旧明文),成功即写回 bcrypt(惰性迁移),
|
||
// 会话保存"存储值",保证 checklogin 重校验 WHERE password=会话 始终匹配
|
||
$result = $db->select_first_row('sq_agent', '*', array('username' => $_POST['username']), 'AND');
|
||
if (!$result || !wq_verify_password($_POST['password'], $result['password'])) {
|
||
die(json_encode(array('code' => -3, 'msg' => '输入的账号密码错误!' . $db->geterror())));
|
||
} else {
|
||
if ($result['status'] != '1') {
|
||
die(json_encode(array('code' => -4, 'msg' => '代理账号已被冻结,请联系管理员或者上级处理')));
|
||
}
|
||
$newhash = wq_hash_password($_POST['password']);
|
||
$_SESSION['agent_username'] = $_POST['username'];
|
||
$_SESSION['agent_password'] = $newhash;
|
||
$_SESSION['agent_id'] = $result['ID'];
|
||
$_SESSION['agent_qq'] = $result['qq'];
|
||
$_SESSION['agent_HTTP_USER_AGENT'] = $_SERVER['HTTP_USER_AGENT'];
|
||
$db->update('sq_agent', array('ID' => $result['ID']), 'AND', array('password' => $newhash, 'loginip' => get_real_ip(), 'logintime' => time()));
|
||
die(json_encode(array('code' => '1', 'msg' => '登陆成功,正在跳转!')));
|
||
}
|
||
|
||
|
||
} else if ($_GET['mod'] === 'checklogin') {
|
||
|
||
if (empty($_SESSION['agent_username']) || empty($_SESSION['agent_password'])) {
|
||
die(json_encode(array('code' => -1)));
|
||
}
|
||
if (!$result = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username'], 'password' => $_SESSION['agent_password']), 'AND')) {
|
||
die(json_encode(array('code' => -2)));
|
||
}
|
||
if ($_SERVER['HTTP_USER_AGENT'] !== $_SESSION['agent_HTTP_USER_AGENT']) {
|
||
die(json_encode(array('code' => -3)));
|
||
}
|
||
die(json_encode(array('code' => 1, 'username' => $_SESSION['agent_username'], 'qq' => $_SESSION['agent_qq'])));
|
||
} else {
|
||
if (empty($_SESSION['agent_username']) || empty($_SESSION['agent_password']) || empty($_SESSION['agent_id'])) {
|
||
echo '没有登录:code:-1';
|
||
header('Location: login.html');
|
||
die();
|
||
}
|
||
if (!$result = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username'], 'password' => $_SESSION['agent_password']), 'AND')) {
|
||
echo '没有登录:code:-2';
|
||
header('Location: login.html');
|
||
|
||
die();
|
||
}
|
||
if ($_SERVER['HTTP_USER_AGENT'] !== $_SESSION['agent_HTTP_USER_AGENT']) {
|
||
echo '没有登录:code:-3';
|
||
header('Location: login.html');
|
||
die();
|
||
}
|
||
}
|
||
switch ($_GET['mod']) {
|
||
case 'getnotice':
|
||
die($G['config']['agentnotice']);
|
||
break;
|
||
case 'getsysinfo':
|
||
if (!$agentinfo = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username']), 'AND')) {
|
||
die(json_encode(array('code' => -2, 'msg' => '代理信息获取失败')));
|
||
}
|
||
if (!$levelinfo = $db->select_first_row('sq_level', '*', array('ID' => $agentinfo['levelid']), 'AND')) {
|
||
die(json_encode(array('code' => -2, 'msg' => '代理等级信息获取失败!')));
|
||
}
|
||
$backinfo = array();
|
||
$backinfo['level'] = $levelinfo['lname'];
|
||
$backinfo['allspend'] = $agentinfo['allspend'];
|
||
$backinfo['allrecharge'] = $agentinfo['allrecharge'];
|
||
$backinfo['usernum'] = $db->select_count_row('sq_user', array('aid' => $_SESSION['agent_id']));
|
||
$backinfo['money'] = $agentinfo['money'];
|
||
$backinfo['subordinate'] = $db->select_count_row('sq_agent', array('superior' => $_SESSION['agent_id']));
|
||
die(json_encode($backinfo));
|
||
break;
|
||
case 'buy_applist':
|
||
if (!$agentinfo = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username']), 'AND')) {
|
||
die(json_encode(array('code' => -2, 'msg' => '代理信息获取失败')));
|
||
}
|
||
if (!$levelinfo = $db->select_first_row('sq_level', '*', array('ID' => $agentinfo['levelid']), 'AND')) {
|
||
die(json_encode(array('code' => -2, 'msg' => '代理等级信息获取失败!')));
|
||
}
|
||
include __DIR__ . '/../function/function_app.php';
|
||
$where = array();
|
||
$i = '<option value="0">显示所有商品</option>';
|
||
$info = explode(',', $levelinfo['appid']);
|
||
foreach ($info as $aid) {
|
||
$i .= '<option value="' . $aid . '">' . app_idgetname($aid) . '</option>';
|
||
}
|
||
/* if ($levelinfo['appid']!=0){
|
||
$where['ID'] = $levelinfo['appid'];
|
||
}else{
|
||
$i .= '<option value="0">显示所有应用</option>';
|
||
}
|
||
$back = $db->select_all_row('sq_apps','ID,appname',$where,'AND');
|
||
if (count($back) === 0){
|
||
die();
|
||
}
|
||
foreach ($back as $value){
|
||
$i .= '<option value="'.$value['ID'].'">'.$value['appname'].'</option>';
|
||
}*/
|
||
die($i);
|
||
break;
|
||
case 'buy_fidlist':
|
||
include __DIR__ . '/../function/function_app.php';
|
||
|
||
//$where['agentbuy'] = '1';
|
||
if (!$agentinfo = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username']), 'AND')) {
|
||
die(json_encode(array('code' => -2, 'msg' => '代理信息获取失败')));
|
||
}
|
||
if (!$levelinfo = $db->select_first_row('sq_level', '*', array('ID' => $agentinfo['levelid']), 'AND')) {
|
||
die(json_encode(array('code' => -3, 'msg' => '代理等级信息获取失败!')));
|
||
}
|
||
|
||
$applist = explode(',', $levelinfo['appid']);
|
||
|
||
|
||
$backinfo = array();
|
||
$backinfo['code'] = 0;
|
||
if (!empty($_GET['appid']) && $_GET['appid'] != '0') {
|
||
if (!in_array($_GET['appid'], $applist)) {
|
||
die(json_encode(array('code' => -4, 'msg' => '您没有权限查看此应用的商品列表!')));
|
||
}
|
||
|
||
$where = array();
|
||
$where['appid'] = $_GET['appid'];
|
||
$where['agentbuy'] = '1';
|
||
$backinfo['count'] = $db->select_count_row('sq_fidlist', $where, 'AND');
|
||
if (!$result = $db->select_limit_row('sq_fidlist', '*', ($_GET['page'] - 1) * $_GET['limit'], $_GET['limit'], $where, 'AND')) {
|
||
$erro = $db->geterror();
|
||
if (!empty($erro)) {
|
||
die(json_encode(array('code' => -1, 'msg' => $erro)));
|
||
}
|
||
|
||
die(json_encode($backinfo));
|
||
}
|
||
} else {
|
||
$sqlwhere = '';
|
||
foreach ($applist as $aid) {
|
||
if (empty($sqlwhere)) {
|
||
$sqlwhere = 'appid=' . $aid;
|
||
} else {
|
||
$sqlwhere .= ' OR appid=' . $aid;
|
||
}
|
||
}
|
||
$where = 'agentbuy=1 AND (' . $sqlwhere . ')';
|
||
$backinfo['count'] = $db->select_count_row('sq_fidlist', $where, 'AND');
|
||
if (!$result = $db->select_limit_row('sq_fidlist', '*', ($_GET['page'] - 1) * $_GET['limit'], $_GET['limit'], $where, 'AND')) {
|
||
$erro = $db->geterror();
|
||
if (!empty($erro)) {
|
||
die(json_encode(array('code' => -1, 'msg' => $erro)));
|
||
}
|
||
die(json_encode($backinfo));
|
||
}
|
||
}
|
||
|
||
|
||
$backinfo['data'] = array();
|
||
foreach ($result as $item) {
|
||
$linshi = array();
|
||
$linshi['id'] = $item['ID'];
|
||
$appinfo = app_idgetinfo($item['appid']);
|
||
$linshi['fidname'] = $item['fidname'];
|
||
$linshi['appname'] = app_idgetname($item['appid']);
|
||
if ($item['num'] != '-1') {
|
||
if ($appinfo['usetype'] === 'dqsj') {
|
||
$numtip = time_last($item['num'] * 60);
|
||
} else {
|
||
$numtip = $item['num'] . '点';
|
||
}
|
||
} else {
|
||
if ($appinfo['usetype'] === 'dqsj') {
|
||
$numtip = '无期授权';
|
||
} else {
|
||
$numtip = '无限使用';
|
||
}
|
||
}
|
||
$linshi['sqnum'] = $numtip;
|
||
$linshi['agentprice'] = $item['agentprice'];
|
||
$backinfo['data'][] = $linshi;
|
||
}
|
||
die(json_encode($backinfo));
|
||
break;
|
||
case 'getuserlist':
|
||
if (empty($_GET['appid'])) {
|
||
die(json_encode(array('code' => '-2', 'msg' => '请先选择一个应用(如果应用过多,可点击上方下拉选择框后,输入关键词可快速查找应用)')));
|
||
}
|
||
//$where['appid'] = $_GET['appid'];
|
||
if (!empty($_GET['search'])) {
|
||
$where['username'] = $where['password'] = $where['mac'] = $where['rip'] = $where['lip'] = $where['uqq'] = $where['mail'] = $where['balance'] = $where['rqq'] = $_GET['search'];
|
||
//$where['uqq'] = intval($where['uqq'])
|
||
if (!is_numeric($where['uqq'])) {
|
||
unset($where['uqq']);
|
||
}
|
||
if (!is_numeric($where['rqq'])) {
|
||
unset($where['rqq']);
|
||
}
|
||
if (!is_numeric($where['balance'])) {
|
||
unset($where['balance']);
|
||
}
|
||
//echo '11111';
|
||
$whereinfo = 'appid=' . intval($_GET['appid']) . ' AND aid=' . $_SESSION['agent_id'] . ' AND (' . $db->wheretosql($where, 'OR') . ')';
|
||
} else {
|
||
//echo '2222';
|
||
$whereinfo = 'appid=' . intval($_GET['appid']) . ' AND aid=' . $_SESSION['agent_id'];
|
||
}
|
||
//echo $whereinfo;
|
||
$backinfo['code'] = 0;
|
||
$backinfo['count'] = $db->select_count_row('sq_user', $whereinfo, 'AND');
|
||
include __DIR__ . "/../function/function_app.php";
|
||
$appinfo = app_idgetinfo($_GET['appid']);
|
||
if (!$arr = $db->select_limit_row('sq_user', '*', ($_GET['page'] - 1) * $_GET['limit'], $_GET['limit'], $whereinfo, 'AND')) {
|
||
//$backinfo['code'] = -1;
|
||
$backinfo['msg'] = $db->geterror();
|
||
die(json_encode($backinfo));
|
||
}
|
||
|
||
$backinfo['msg'] = '';
|
||
|
||
foreach ($arr as $value) {
|
||
$newinfo = array();
|
||
$newinfo['id'] = $value['ID'];
|
||
$newinfo['username'] = $value['username'];
|
||
$newinfo['password'] = $value['password'];
|
||
$newinfo['mac'] = $value['mac'];
|
||
$newinfo['lip'] = $value['lip'];
|
||
$newinfo['rip'] = $value['rip'];
|
||
$newinfo['uqq'] = $value['uqq'];
|
||
$newinfo['mail'] = $value['mail'];
|
||
$newinfo['rtime'] = Get_Date($value['rtime']);
|
||
$newinfo['ltime'] = Get_Date($value['ltime']);
|
||
if ($appinfo['usetype'] === 'dqsj') {
|
||
if (!empty($value['balance'])) {
|
||
if ($value['balance'] == '-1') {
|
||
$value['balance'] = '永久使用';
|
||
}
|
||
$value['balance'] = Get_Date($value['balance']);
|
||
} else {
|
||
$value['balance'] = '-';
|
||
}
|
||
}
|
||
$newinfo['balance'] = $value['balance'];
|
||
$newinfo['rqq'] = htmlspecialchars($value['rqq']);
|
||
if ((time() - $value['htime']) < $appinfo['onlinesecond']) {
|
||
$online = '在线';
|
||
} else {
|
||
$online = '离线';
|
||
}
|
||
$newinfo['login'] = $online;
|
||
$newinfo['status'] = '<input type="checkbox" value=' . $value['ID'] . ' name="status" lay-skin="switch" lay-text="正常|冻结" id="qzgx"' . ($value['status'] == 1 ? ' checked' : '') . '>';
|
||
|
||
$backinfo['data'][] = $newinfo;
|
||
}
|
||
|
||
//print_r($backinfo);
|
||
die(json_encode($backinfo));
|
||
|
||
break;
|
||
case 'changeuser':
|
||
if (empty($_POST['mod'])) {
|
||
die('模块标识不能为空');
|
||
}
|
||
if (empty($_POST['userid'])) {
|
||
die('用户ID不能为空');
|
||
}
|
||
|
||
if (!in_array($_POST['mod'], array('username', 'password', 'mac', 'rip', 'lip', 'uqq', 'mail', 'rqq', 'status'))) die('不支持修改的字段');
|
||
if ($_POST['mod'] == 'status') {
|
||
$_POST['value'] = textbooltonum($_POST['value']);
|
||
}
|
||
// P0-05: 用户密码以 bcrypt 哈希入库
|
||
if ($_POST['mod'] == 'password') {
|
||
$_POST['value'] = wq_hash_password($_POST['value']);
|
||
}
|
||
if ($_POST['mod'] == 'balance') {
|
||
if ($_POST['value'] == '永久使用') {
|
||
$_POST['value'] = -1;
|
||
} else {
|
||
$value = strtotime($_POST['value']);
|
||
if (!empty($value)) {
|
||
$_POST['value'] = $value;
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
|
||
// P0-05: 用户密码改密以 bcrypt 哈希入库
|
||
if ($_POST['mod'] == 'password') {
|
||
$_POST['value'] = wq_hash_password($_POST['value']);
|
||
}
|
||
|
||
if (!$db->update('sq_user', array('ID' => $_POST['userid'], 'aid' => $_SESSION['agent_id']), 'AND', array($_POST['mod'] => $_POST['value']))) {
|
||
die('修改失败' . $db->geterror());
|
||
} else {
|
||
$db->insert_back_id('sq_log_agent', array('time' => time(), 'aid' => $_SESSION['agent_id'], 'ip' => get_real_ip(), 'msg' => '更改用户ID ' . $_POST['userid'] . ' 的 ' . $_POST['mod'] . ' 值为 ' . $_POST['value']));
|
||
|
||
die('修改成功!');
|
||
}
|
||
break;
|
||
case 'deluser':
|
||
if (empty($_POST['userid'])) {
|
||
die('用户ID不能为空');
|
||
}
|
||
$userinfo = $db->select_first_row('sq_user', '*', array('ID' => $_POST['userid']), 'AND');
|
||
if (!$db->delete('sq_user', array('ID' => $_POST['userid'], 'aid' => $_SESSION['agent_id']), 'AND')) {
|
||
die('删除失败' . $db->geterror());
|
||
} else {
|
||
$db->insert_back_id('sq_log_agent', array('time' => time(), 'aid' => $_SESSION['agent_id'], 'ip' => get_real_ip(), 'msg' => '删除用户 ' . json_encode($userinfo)));
|
||
|
||
die('删除成功!');
|
||
}
|
||
|
||
case 'buy_first':
|
||
|
||
include __DIR__ . "/../function/function_app.php";
|
||
$fidinfo = $db->select_first_row('sq_fidlist', '*', array('ID' => $_GET['fid']), 'AND');
|
||
$appinfo = app_idgetinfo($fidinfo['appid']);
|
||
$show_form = '';
|
||
|
||
if ($appinfo['logintype'] == 'zhmm') {
|
||
$show_form .= '
|
||
<div class="layui-form-item">
|
||
<label for="kt_user" class="layui-form-label">用户名</label>
|
||
<div class="layui-input-block">
|
||
<input class="layui-input" name="kt_user" placeholder="" type="text">
|
||
</div>
|
||
</div>
|
||
<div class="layui-form-item">
|
||
<label for="kt_user" class="layui-form-label">密码</label>
|
||
<div class="layui-input-block">
|
||
<input class="layui-input" name="kt_pass" placeholder="" type="text">
|
||
</div>
|
||
</div>
|
||
';
|
||
$type = 1;
|
||
} else if ($appinfo['logintype'] == 'kmsq') {
|
||
$show_form .= '
|
||
<div class="layui-form-item">
|
||
<label for="kt_user" class="layui-form-label">登陆卡密</label>
|
||
<div class="layui-input-block">
|
||
<input class="layui-input" name="kt_user" placeholder="输入为续费,留空则新开" type="text">
|
||
</div>
|
||
</div>';
|
||
$type = 2;
|
||
} else if ($appinfo['logintype'] == 'jcbd') {
|
||
if ($appinfo['bindqq'] == '1') {
|
||
$show_form .= '
|
||
<div class="layui-form-item">
|
||
<label for="kt_user" class="layui-form-label">机器人QQ</label>
|
||
<div class="layui-input-block">
|
||
<input class="layui-input" name="kt_robotqq" placeholder="" type="text">
|
||
</div>
|
||
</div>
|
||
';
|
||
}
|
||
if ($appinfo['bindmac'] == '1') {
|
||
$show_form .= '<div class="layui-form-item">
|
||
<label for="kt_user" class="layui-form-label">设备码</label>
|
||
<div class="layui-input-block">
|
||
<input class="layui-input" name="kt_mac" placeholder="" type="text">
|
||
</div>
|
||
</div>
|
||
';
|
||
}
|
||
if ($appinfo['bindip'] == '1') {
|
||
$show_form .= '<div class="layui-form-item">
|
||
<label for="kt_ip" class="layui-form-label">用户IP</label>
|
||
<div class="layui-input-block">
|
||
<input class="layui-input" name="kt_ip" placeholder="" type="text">
|
||
</div>
|
||
</div>
|
||
';
|
||
}
|
||
$type = 3;
|
||
}
|
||
include __DIR__ . '/html/buy.page.inc.php';
|
||
die();
|
||
break;
|
||
case 'buy_submit':
|
||
include __DIR__ . '/../function/function_app.php';
|
||
|
||
if (!$fidinfo = $db->select_first_row('sq_fidlist', '*', array('ID' => $_POST['id']), 'AND')) {
|
||
die(json_encode(array('code' => -2, 'msg' => '无法找到该商品,请刷新页面重试')));
|
||
}
|
||
if (!$appinfo = app_idgetinfo($fidinfo['appid'])) {
|
||
die(json_encode(array('code' => -2, 'msg' => '无法找到应用,也许是该应用已下架')));
|
||
}
|
||
if (!$agentinfo = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username']), 'AND')) {
|
||
die(json_encode(array('code' => -2, 'msg' => '代理信息获取失败')));
|
||
}
|
||
$time = time();
|
||
$tradno = $time . rand_str(10, 'num');
|
||
$tips = '交易订单号:' . $tradno . '<br>';
|
||
if (!$levelinfo = $db->select_first_row('sq_level', '*', array('ID' => $agentinfo['levelid']), 'AND')) {
|
||
die(json_encode(array('code' => -2, 'msg' => '代理对应的等级信息获取失败!')));
|
||
}
|
||
$applist = explode(',', $levelinfo['appid']);
|
||
$backinfo = array();
|
||
if (!in_array($fidinfo['appid'], $applist)) {
|
||
die(json_encode(array('code' => -4, 'msg' => '您没有权限开通此商品')));
|
||
}
|
||
$spendmoney = $fidinfo['agentprice'] * $_POST['kt_num'] * $levelinfo['fracture'];
|
||
$tips .= '应付金额:' . $spendmoney . '<br>';
|
||
if ($spendmoney < 0) {
|
||
die(json_encode(array('code' => -7, 'msg' => '错误的支付金额:' . $spendmoney)));
|
||
}
|
||
|
||
if ($appinfo['logintype'] == 'zhmm') {
|
||
if (!$userinfo = $db->select_first_row('sq_user', '*', array('username' => $_POST['kt_user'], 'appid' => $fidinfo['appid']), 'AND')) {
|
||
$tips .= '<font color="green">该用户名尚未注册!</font><br>';
|
||
} else {
|
||
$tips .= '<font color="red">当前用户名已注册!</font><br>';
|
||
}
|
||
$tips .= '用户名:' . $_POST['kt_user'] . '<br>';
|
||
$newtrade = array('name' => $fidinfo['fidname'],
|
||
'tradeno' => $tradno,
|
||
'begintime' => $time,
|
||
'user' => $_POST['kt_user'],
|
||
// P0-05: 订单中的密码直接以 bcrypt 哈希存库(开通落库点 function_auth 有幂等保护,不会二次哈希)
|
||
'pass' => wq_hash_password($_POST['kt_pass']),
|
||
'fid' => $_POST['id'],
|
||
'num' => $_POST['kt_num'],
|
||
'paymoney' => $spendmoney,
|
||
'mail' => $_POST['kt_mail'],
|
||
'paytype' => $_POST['zffs'],
|
||
'onlinepaytype' => $_POST['zxzffs'],
|
||
'kami' => $_POST['kt_key'],
|
||
'uqq' => $_POST['kt_adminqq'],
|
||
'ip' => get_real_ip(),
|
||
'status' => '1',
|
||
'type' => 2,
|
||
'agentid' => $agentinfo['ID']
|
||
);
|
||
} else if ($appinfo['logintype'] == 'kmsq') {
|
||
//卡密方式
|
||
if (empty($_POST['kt_user']) || !$userinfo = $db->select_first_row('sq_user', '*', array('username' => $_POST['kt_user'], 'appid' => $fidinfo['appid']), 'AND')) {
|
||
$_POST['kt_user'] = '';
|
||
$tips .= '开通方式:新开卡密<br>';
|
||
} else {
|
||
$tips .= '开通方式:续费卡密(' . $_POST['kt_user'] . ')<br>';
|
||
}
|
||
$newtrade = array('name' => $fidinfo['fidname'],
|
||
'tradeno' => $tradno,
|
||
'begintime' => $time,
|
||
'user' => $_POST['kt_user'],
|
||
'fid' => $_POST['id'],
|
||
'num' => $_POST['kt_num'],
|
||
'paymoney' => $spendmoney,
|
||
'mail' => $_POST['kt_mail'],
|
||
'paytype' => $_POST['zffs'],
|
||
'onlinepaytype' => $_POST['zxzffs'],
|
||
'kami' => $_POST['kt_key'],
|
||
'uqq' => $_POST['kt_adminqq'],
|
||
'ip' => get_real_ip(),
|
||
'status' => '1',
|
||
'type' => 2,
|
||
'agentid' => $agentinfo['ID']
|
||
);
|
||
|
||
} else if ($appinfo['logintype'] == 'jcbd') {
|
||
//检查绑定
|
||
$tips_ = '';
|
||
if ($appinfo['bindip'] == '1') {
|
||
$check['lip'] = $_POST['kt_ip'];
|
||
if (empty($_POST['kt_ip']) || $_POST['kt_ip'] == 'undefined') {
|
||
die(json_encode(array('code' => -10, 'msg' => '绑定的IP不能为空')));
|
||
}
|
||
$tips_ .= '绑定IP:' . $check['lip'] . '<br>';
|
||
}
|
||
if ($appinfo['bindmac'] == '1') {
|
||
$check['mac'] = $_POST['kt_mac'];
|
||
if (empty($_POST['kt_mac']) || $_POST['kt_mac'] == 'undefined') {
|
||
die(json_encode(array('code' => -10, 'msg' => '绑定的机器不能为空')));
|
||
}
|
||
$tips_ .= '绑定机器:' . $check['mac'] . '<br>';
|
||
|
||
}
|
||
if ($appinfo['bindqq'] == '1') {
|
||
$check['rqq'] = $_POST['kt_robotqq'];
|
||
if (empty($_POST['kt_robotqq']) || $_POST['kt_robotqq'] == 'undefined') {
|
||
die(json_encode(array('code' => -10, 'msg' => '绑定的机器人QQ不能为空')));
|
||
}
|
||
$tips_ .= '绑定QQ:' . $check['rqq'] . '<br>';
|
||
|
||
}
|
||
if (empty($check)) {
|
||
die(json_encode(array('code' => -10, 'msg' => '系统内部错误(应用绑定信息配置异常),请联系管理员解决')));
|
||
}
|
||
$check['appid'] = $appinfo['ID'];
|
||
$newtrade = array('name' => $fidinfo['fidname'],
|
||
'tradeno' => $tradno,
|
||
'begintime' => $time,
|
||
'user' => json_encode($check),
|
||
'fid' => $_POST['id'],
|
||
'num' => $_POST['kt_num'],
|
||
'paymoney' => $spendmoney,
|
||
'mail' => $_POST['kt_mail'],
|
||
'paytype' => $_POST['zffs'],
|
||
'onlinepaytype' => $_POST['zxzffs'],
|
||
'kami' => $_POST['kt_key'],
|
||
'uqq' => $_POST['kt_adminqq'],
|
||
'ip' => get_real_ip(),
|
||
'status' => '1',
|
||
'type' => 2,
|
||
'agentid' => $agentinfo['ID']
|
||
);
|
||
|
||
if (!$userinfo = $db->select_first_row('sq_user', '*', $check, 'AND')) {
|
||
$tips .= '开通方式:新开授权<br>绑定信息如下:<br>' . $tips_ . '<br><br>';
|
||
} else {
|
||
$tips .= '开通方式:续费授权<br>绑定信息如下:<br>' . $tips_ . '<br><br>';
|
||
}
|
||
}
|
||
if (empty($userinfo['balance'])) {
|
||
$userinfo['balance'] = 0;
|
||
}
|
||
$tips .= '正在开通套餐:' . $fidinfo['fidname'] . '<br>';
|
||
if (empty($userinfo['balance']) && $userinfo['balance'] == '-1') {
|
||
die(json_encode(array('code' => 3, 'msg' => '已是永久授权,无法再次开通和续费!')));
|
||
}
|
||
if ($appinfo['usetype'] === 'dqsj') {
|
||
if (empty($userinfo['balance']) || $userinfo['balance'] == 0) {
|
||
$tips .= '当前到期时间:没有授权<br>';
|
||
$userinfo['balance'] = time();
|
||
} else {
|
||
$tips .= '当前到期时间:' . Get_Date($userinfo['balance']) . '<br>';
|
||
}
|
||
if ($fidinfo['num'] != '-1') {
|
||
$tips .= '新增时长:' . time_last($fidinfo['num'] * $_POST['kt_num'] * 60) . '<br>';
|
||
} else {
|
||
$tips .= '购买后您可以无限使用<br>';
|
||
}
|
||
|
||
} else {
|
||
$tips .= '用户剩余点数:' . $userinfo['balance'] . '点<br>';
|
||
if ($fidinfo['num'] != '-1') {
|
||
$tips .= '购买后点数:' . ($userinfo['balance'] + $fidinfo['num'] * $_POST['kt_num']) . '点<br>';
|
||
} else {
|
||
$tips .= '购买后点数:无限制<br>';
|
||
}
|
||
|
||
}
|
||
|
||
if ($_POST['zffs'] == 'zxzf') {
|
||
$tips .= '付款方式:在线支付<br>';
|
||
switch ($_POST['zxzffs']) {
|
||
case 'zfb':
|
||
$tips .= '支付方式:支付宝<br>';
|
||
break;
|
||
case 'wx':
|
||
$tips .= '支付方式:微信<br>';
|
||
break;
|
||
case 'qq':
|
||
$tips .= '支付方式:QQ钱包<br>';
|
||
break;
|
||
default:
|
||
die(json_encode(array('code' => -5, 'msg' => '错误的付款方式')));
|
||
}
|
||
} else if ($_POST['zffs'] == 'czkm') {
|
||
if ($fidinfo['allrechargecard'] != 1) {
|
||
die(json_encode(array('code' => -5, 'msg' => '本套餐不支持使用卡密支付')));
|
||
}
|
||
$tips .= '付款方式:余额卡密<br>';
|
||
$tips .= '正在使用的卡密:' . $_POST['kt_key'] . '<br>';
|
||
} else if ($_POST['zffs'] == 'yezf') {
|
||
$tips .= '付款方式:余额支付<br>';
|
||
if ($agentinfo['money'] < $spendmoney) {
|
||
die(json_encode(array('code' => -5, 'msg' => '您的代理余额不足,请先充值或者选择其他付款方式!')));
|
||
}
|
||
} else {
|
||
die(json_encode(array('code' => -5, 'msg' => '错误的支付方式')));
|
||
}
|
||
$tips .= '注意:请认真核对信息,付款后一律不支持退款!<br>';
|
||
if (!$db->insert_back_id('sq_trade', $newtrade)) {
|
||
die(json_encode(array('code' => -3, 'msg' => '系统错误:' . $db->geterror())));
|
||
} else {
|
||
die(json_encode(array('code' => '1', 'tradeno' => $tradno, 'info' => $tips)));
|
||
}
|
||
break;
|
||
case 'recharge':
|
||
if ($_POST['money'] <= 0) {
|
||
die(json_encode(array('code' => -1, 'msg' => '充值的金额必须为正整数')));
|
||
}
|
||
if (!$agentinfo = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username']), 'AND')) {
|
||
die(json_encode(array('code' => -2, 'msg' => '代理信息获取失败')));
|
||
}
|
||
$time = time();
|
||
$tradno = $time . rand_str(10, 'num');
|
||
$tips = '您的订单已经生成完毕:<br>订单号:' . $tradno . '<br>充值金额:' . $_POST['money'] . '<br>';
|
||
if ($_POST['zffs'] == 'zxzf') {
|
||
$tips .= '付款方式:在线支付<br>';
|
||
switch ($_POST['zxzffs']) {
|
||
case 'zfb':
|
||
$tips .= '支付方式:支付宝<br>';
|
||
break;
|
||
case 'wx':
|
||
$tips .= '支付方式:微信<br>';
|
||
break;
|
||
case 'qq':
|
||
$tips .= '支付方式:QQ钱包<br>';
|
||
break;
|
||
default:
|
||
die(json_encode(array('code' => -5, 'msg' => '错误的付款方式')));
|
||
}
|
||
} else if ($_POST['zffs'] == 'czkm') {
|
||
$tips .= '付款方式:余额卡密<br>';
|
||
$tips .= '正在使用的卡密:' . $_POST['kt_key'] . '<br>';
|
||
} else {
|
||
die(json_encode(array('code' => -5, 'msg' => '错误的支付方式')));
|
||
}
|
||
|
||
if (!$db->insert_back_id('sq_trade', array('name' => '代理' . $_SESSION['agent_username'] . '充值余额' . $_POST['money'] . '元', 'tradeno' => $tradno, 'begintime' => $time, 'user' => $_SESSION['agent_username'], 'status' => '1', 'type' => '1', 'paymoney' => $_POST['money'], 'agentid' => $agentinfo['ID'], 'paytype' => $_POST['zffs'], 'onlinepaytype' => $_POST['zxzffs'], 'kami' => $_POST['kt_key']))) {
|
||
die(json_encode(array('code' => -5, '订单创建失败' . $db->geterror())));
|
||
} else {
|
||
die(json_encode(array('code' => '1', 'tradeno' => $tradno, 'info' => $tips)));
|
||
}
|
||
break;
|
||
case 'getlevallist':
|
||
$back = $db->select_all_row('sq_level', 'ID,lname', array(), 'AND');
|
||
if (count($back) === 0) {
|
||
die();
|
||
}
|
||
$i = '<option value="0">请选择一个级别</option>';
|
||
foreach ($back as $value) {
|
||
$i .= '<option value="' . $value['ID'] . '">' . $value['lname'] . '</option>';
|
||
}
|
||
die($i);
|
||
break;
|
||
|
||
case 'getbuylist':
|
||
|
||
if (!$agentinfo = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username']), 'AND')) {
|
||
die('代理信息获取失败');
|
||
}
|
||
|
||
if (!$agentlevelinfo = $db->select_first_row('sq_level', '*', array('ID' => $agentinfo['levelid']), 'AND')) {
|
||
die('等级信息获取失败');
|
||
}
|
||
|
||
$info = json_decode($agentlevelinfo['subordinate'], true);
|
||
$i = '<option value="0">请选择一个级别</option>';
|
||
foreach ($info as $lid => $could) {
|
||
if ($could) {
|
||
$value = $db->select_first_row('sq_level', 'ID,lname', array('ID' => $lid), 'AND');
|
||
$i .= '<option value="' . $value['ID'] . '">' . $value['lname'] . '</option>';
|
||
}
|
||
|
||
}
|
||
die($i);
|
||
break;
|
||
case 'gettradelist':
|
||
$where = array();
|
||
|
||
if (!empty($_GET['search'])) {
|
||
$where['tradeno'] = $where['name'] = $where['user'] = $where['mail'] = $where['kami'] = $_GET['search'];
|
||
$whereinfo = 'agentid=' . $_SESSION['agent_id'] . ' AND (' . $db->wheretosql($where, 'OR') . ')';
|
||
} else {
|
||
$whereinfo = 'agentid=' . $_SESSION['agent_id'];
|
||
}
|
||
$backinfo['code'] = 0;
|
||
$backinfo['count'] = $db->select_count_row('sq_trade', $whereinfo, 'OR');
|
||
if (!$arr = $db->select_limit_row('sq_trade', '*', ($_GET['page'] - 1) * $_GET['limit'], $_GET['limit'], $whereinfo, 'OR', 'ORDER BY ID DESC')) {
|
||
$backinfo['msg'] = $db->geterror();
|
||
die(json_encode($backinfo));
|
||
}
|
||
foreach ($arr as $key => $value) {
|
||
if ($value['begintime'] == 0) {
|
||
$arr[$key]['begintime'] = '-';
|
||
} else {
|
||
$arr[$key]['begintime'] = Get_Date($value['begintime']);
|
||
}
|
||
if ($value['overtime'] == 0) {
|
||
$arr[$key]['overtime'] = '-';
|
||
} else {
|
||
$arr[$key]['overtime'] = Get_Date($value['overtime']);
|
||
}
|
||
if ($value['paytype'] == 'zxzf') {
|
||
switch ($value['onlinepaytype']) {
|
||
case 'zfb':
|
||
$arr[$key]['paytype'] = '支付宝';
|
||
break;
|
||
case 'wx':
|
||
$arr[$key]['paytype'] = '微信';
|
||
break;
|
||
case 'qq':
|
||
$arr[$key]['paytype'] = 'QQ钱包';
|
||
break;
|
||
default:
|
||
$arr[$key]['paytype'] = '异常?';
|
||
break;
|
||
}
|
||
} else if ($value['paytype'] == 'czkm') {
|
||
$arr[$key]['paytype'] = '余额卡密';
|
||
} else if ($value['paytype'] == 'yezf') {
|
||
$arr[$key]['paytype'] = '代理余额';
|
||
} else {
|
||
$arr[$key]['paytype'] = '异常?';
|
||
}
|
||
if ($value['status'] == 1) {
|
||
$arr[$key]['status'] = '等待付款';
|
||
$button = '<button type="button" class="layui-btn layui-btn-xs layui-btn-normal" onclick="pay(\'' . $value['tradeno'] . '\');">付款</button>';
|
||
} else if ($value['status'] == 2) {
|
||
$arr[$key]['status'] = '等待验证';
|
||
$button = '<button type="button" class="layui-btn layui-btn-xs" onclick="check(\'' . $value['tradeno'] . '\');">验证</button>';
|
||
} elseif ($value['status'] == 3) {
|
||
$button = '';
|
||
$arr[$key]['status'] = '完成';
|
||
} else {
|
||
$arr[$key]['status'] = '异常';
|
||
}
|
||
$arr[$key]['tools'] = $button . '<button type="button" class="layui-btn layui-btn-xs layui-btn-danger" onclick="deltrade(\'' . $value['ID'] . '\');">删除</button>';
|
||
}
|
||
$backinfo['data'] = $arr;
|
||
die(json_encode($backinfo));
|
||
break;
|
||
case 'deltrade':
|
||
if (!$db->delete('sq_trade', array('ID' => $_POST['id'], 'agentid' => $_SESSION['agent_id']), 'AND')) {
|
||
die('订单删除失败或者删除的数量为0' . $db->geterror());
|
||
} else {
|
||
die('订单删除成功!');
|
||
}
|
||
break;
|
||
case 'clearalltradeid':
|
||
$limit = time() - 3600;
|
||
if (!$db->delete('sq_trade', 'beigintime<' . $limit . ' AND agentid=' . $_SESSION['agent_id'], 'AND')) {
|
||
die('订单删除失败' . $db->geterror());
|
||
} else {
|
||
die('订单删除成功!');
|
||
}
|
||
break;
|
||
case 'clearnopay':
|
||
$limit = time() - 3600;
|
||
if (!$db->delete('sq_trade', 'begintime<' . $limit . ' AND status = 1 ' . ' AND agentid=' . $_SESSION['agent_id'], 'AND')) {
|
||
die('订单删除失败' . $db->geterror());
|
||
} else {
|
||
die('订单删除成功!');
|
||
}
|
||
break;
|
||
case 'clearbeenpay':
|
||
$limit = time() - 3600;
|
||
if (!$db->delete('sq_trade', array('status' => 3, 'agentid' => $_SESSION['agent_id']), 'AND')) {
|
||
die('订单删除失败' . $db->geterror());
|
||
} else {
|
||
die('订单删除成功!');
|
||
}
|
||
break;
|
||
case 'updatelevel':
|
||
if ($_POST['leval'] == 0) {
|
||
die('请先选择一个代理等级');
|
||
}
|
||
if (!$levelinfo = $db->select_first_row('sq_level', '*', array('ID' => $_POST['leval']), 'AND')) {
|
||
die('等级信息获取失败,无法继续升级!');
|
||
}
|
||
if (!$agentinfo = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username']), 'AND')) {
|
||
die('代理信息获取失败');
|
||
}
|
||
if ($agentinfo['money'] < $levelinfo['price']) {
|
||
die('您的余额不足,无法升级,请先进行充值!');
|
||
}
|
||
if ($agentinfo['levelid'] == $_POST['leval']) {
|
||
die('您目前的等级已经是这个了,重复开通干嘛 ̄へ ̄');
|
||
}
|
||
$newmoney = $agentinfo['money'] - $levelinfo['price'];
|
||
if (!$db->update('sq_agent', array('username' => $_SESSION['agent_username']), 'AND', array('money' => $newmoney, 'levelid' => $_POST['leval']))) {
|
||
die('系统内部错误,升级失败!');
|
||
} else {
|
||
$db->insert_back_id('sq_log_agent', array('time' => time(), 'aid' => $_SESSION['agent_id'], 'ip' => get_real_ip(), 'msg' => '自助花费余额提升等级为 ' . $levelinfo['lname']));
|
||
die('代理等级提升成功!');
|
||
}
|
||
break;
|
||
case 'buyagent':
|
||
if ($_POST['leval'] == 0) {
|
||
die('请先选择一个代理等级');
|
||
}
|
||
if (empty($_POST['qq'])) {
|
||
die('代理QQ不能为空');
|
||
}
|
||
if (!$levelinfo = $db->select_first_row('sq_level', '*', array('ID' => $_POST['leval']), 'AND')) {
|
||
die('等级信息获取失败,无法继续开通!');
|
||
}
|
||
if (!$agentinfo = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username']), 'AND')) {
|
||
die('代理信息获取失败');
|
||
}
|
||
if ($db->select_first_row('sq_agent', '*', array('username' => $_POST['username']), 'AND') != false) {
|
||
die('该代理账号已经存在,请尝试其他用户名');
|
||
}
|
||
if (!$agentlevelinfo = $db->select_first_row('sq_level', '*', array('ID' => $agentinfo['levelid']), 'AND')) {
|
||
die('等级信息获取失败');
|
||
}
|
||
$buymoney = $agentlevelinfo['discount'] * $levelinfo['price'];
|
||
if ($agentinfo['money'] < $buymoney) {
|
||
die('您的余额不足,无法开通,请先进行充值!');
|
||
}
|
||
$couldbuy = json_decode($agentlevelinfo['subordinate'], true);
|
||
if (@$couldbuy[$_POST['leval']] !== true) {
|
||
die('您无法开通此等级的代理!');
|
||
}
|
||
|
||
$newmoney = $agentinfo['money'] - $buymoney;
|
||
if (!$db->update('sq_agent', array('username' => $_SESSION['agent_username']), 'AND', array('money' => $newmoney))) {
|
||
die('系统内部错误,开通失败!');
|
||
} else {
|
||
if (!$db->insert_back_id('sq_agent', array('username' => $_POST['username'], 'password' => wq_hash_password($_POST['pass']), 'qq' => $_POST['qq'], 'begintime' => time(), 'levelid' => $_POST['leval'], 'status' => '1', 'superior' => $_SESSION['agent_id']))) {
|
||
die('您的余额已扣除但是内部发生错误,下级开通失败,请联系管理员处理!' . $db->geterror());
|
||
} else {
|
||
$db->insert_back_id('sq_log_agent', array('time' => time(), 'aid' => $_SESSION['agent_id'], 'ip' => get_real_ip(), 'msg' => '成功开通下级代理 ' . $_POST['username']));
|
||
die('成功开通下级代理!');
|
||
}
|
||
}
|
||
break;
|
||
case 'getagentlist':
|
||
include __DIR__ . '/../function/function_app.php';
|
||
if (!$result = $db->select_limit_row('sq_agent', '*', ($_GET['page'] - 1) * $_GET['limit'], $_GET['limit'], array('superior' => $_SESSION['agent_id']), 'AND')) {
|
||
$error = $db->geterror();
|
||
if (!empty($error)) {
|
||
$backinfo['code'] = -1;
|
||
$backinfo['msg'] = $db->geterror();
|
||
} else {
|
||
$backinfo['code'] = 0;
|
||
$backinfo['msg'] = '';
|
||
$backinfo['count'] = 0;
|
||
}
|
||
|
||
die(json_encode($backinfo));
|
||
} else {
|
||
$info = '';
|
||
$backinfo['code'] = 0;
|
||
$backinfo['msg'] = '';
|
||
$backinfo['count'] = $db->select_count_row('sq_agent', array('superior' => $_SESSION['agent_id']));
|
||
foreach ($result as $value) {
|
||
if ($value['logintime'] == 0) {
|
||
$value['logintime'] = '-';
|
||
}
|
||
$value['begintime'] = Get_Date($value['begintime']);
|
||
$value['logintime'] = Get_Date($value['logintime']);
|
||
$value['levelname'] = level_idgetname($value['levelid']);
|
||
$value['status'] = '<input type="checkbox" value=' . $value['ID'] . ' name="status" lay-skin="switch" lay-text="正常|冻结" id="qzgx"' . ($value['status'] == 1 ? ' checked' : '') . '>';
|
||
$backinfo['data'][] = $value;
|
||
}
|
||
|
||
|
||
die(json_encode($backinfo));
|
||
}
|
||
break;
|
||
case 'changeagent':
|
||
// if (!$db->update('sq_agent',array('ID'=>$_POST['id']),'AND',array('username'=>$_POST['agent_name'],'password'=>$_POST['agent_pass'],'money'=>$_POST['agent_money'],'levelid'=>$_POST['agent_leval'],'begintime'=>time(),'status'=>'1','loginip'=>'-'))){
|
||
// die('修改失败'.$db->geterror());
|
||
// }else{
|
||
// die('修改成功!');
|
||
// }
|
||
if (empty($_POST['mod'])) {
|
||
die('模块标识不能为空');
|
||
}
|
||
if (empty($_POST['aid'])) {
|
||
die('代理ID不能为空');
|
||
}
|
||
if ($_POST['mod'] != 'username' && $_POST['mod'] != 'password' && $_POST['mod'] != 'qq' && $_POST['mod'] != 'status') die('不支持修改的字段');
|
||
|
||
if ($_POST['mod'] == 'status') $_POST['value'] = textbooltonum($_POST['value']);
|
||
// P0-05: 代理密码以 bcrypt 哈希入库
|
||
if ($_POST['mod'] == 'password') $_POST['value'] = wq_hash_password($_POST['value']);
|
||
if (!$db->update('sq_agent', array('ID' => $_POST['aid'], 'superior' => $_SESSION['agent_id']), 'AND', array($_POST['mod'] => $_POST['value']))) {
|
||
die('修改失败' . $db->geterror());
|
||
} else {
|
||
die('修改成功!');
|
||
}
|
||
break;
|
||
case 'delagent':
|
||
if (empty($_POST['aid'])) {
|
||
die('非法提交');
|
||
}
|
||
if (!$db->delete('sq_agent', array('ID' => $_POST['aid'], 'superior' => $_SESSION['agent_id']), 'AND')) {
|
||
die('删除失败 ' . $db->geterror());
|
||
} else {
|
||
die('删除代理成功');
|
||
}
|
||
break;
|
||
case 'leveltips':
|
||
include __DIR__ . '/../function/function_app.php';
|
||
if (!$levelinfo = $db->select_first_row('sq_level', '*', array('ID' => $_POST['leval']), 'AND')) {
|
||
die('等级信息获取失败');
|
||
}
|
||
if ($levelinfo['appid'] == '0') {
|
||
$appinfo = '全局代理';
|
||
} else {
|
||
$appinfo = app_idgetname($levelinfo['appid']);
|
||
}
|
||
die('<center>代理应用:' . $appinfo . ',等级名称:' . $levelinfo['lname'] . ',升级金额:' . $levelinfo['price'] . ',拿货折率:' . $levelinfo['fracture'] . '<br>注意:升级后当前等级会被释放,而不是同时有两个等级,如果希望有多个等级请联系站长新开代理账号!</center>');
|
||
break;
|
||
case 'addagenttips':
|
||
include __DIR__ . '/../function/function_app.php';
|
||
if (!$agentinfo = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username']), 'AND')) {
|
||
die('代理信息获取失败');
|
||
}
|
||
if (!$agentlevelinfo = $db->select_first_row('sq_level', '*', array('ID' => $agentinfo['levelid']), 'AND')) {
|
||
die('等级信息获取失败');
|
||
}
|
||
if (!$levelinfo = $db->select_first_row('sq_level', '*', array('ID' => $_POST['leval']), 'AND')) {
|
||
die('选择等级信息获取失败');
|
||
}
|
||
|
||
if ($levelinfo['appid'] == '0') {
|
||
$appinfo = '全局代理';
|
||
} else {
|
||
$appinfo = app_idgetname($levelinfo['appid']);
|
||
}
|
||
die('代理应用:' . $appinfo . ',等级名称:' . $levelinfo['lname'] . ',开通金额:' . $levelinfo['price'] . ',拿货折率:' . $levelinfo['fracture'] . '<br>您当前代理等级开通下级折率:' . $agentlevelinfo['discount'] . ',实际支付:<font color="red">' . ($levelinfo['price'] * $agentlevelinfo['discount']) . '元</font>');
|
||
break;
|
||
case 'changepassword':
|
||
if (empty($_POST['oldpass']) || empty($_POST['newpass']) || empty($_POST['renewpass'])) {
|
||
die('请填写完所有数据!');
|
||
}
|
||
if ($_POST['newpass'] != $_POST['renewpass']) {
|
||
die('两次输入的密码一样,无法修改!');
|
||
}
|
||
if (!$agentinfo = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username']), 'AND')) {
|
||
die('代理信息获取失败');
|
||
}
|
||
// P0-05: 兼容校验旧明文 / 新 bcrypt;新密码以 bcrypt 入库
|
||
if (!wq_verify_password($_POST['oldpass'], $agentinfo['password'])) {
|
||
die('输入的原密码错误,无法修改!');
|
||
}
|
||
|
||
if (!$db->update('sq_agent', array('username' => $_SESSION['agent_username']), 'AND', array('password' => wq_hash_password($_POST['newpass'])))) {
|
||
die('密码修改失败,服务器内部发生错误');
|
||
} else {
|
||
die('代理密码修改成功,请使用新密码进行登录!');
|
||
}
|
||
|
||
break;
|
||
case 'fidlist_show':
|
||
include __DIR__ . '/../function/function_app.php';
|
||
//$where['agentbuy'] = '1';
|
||
if (!$agentinfo = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username']), 'AND')) {
|
||
die(json_encode(array('code' => -2, 'msg' => '代理信息获取失败')));
|
||
}
|
||
if (!$levelinfo = $db->select_first_row('sq_level', '*', array('ID' => $agentinfo['levelid']), 'AND')) {
|
||
die(json_encode(array('code' => -3, 'msg' => '代理等级信息获取失败!')));
|
||
}
|
||
$applist = explode(',', $levelinfo['appid']);
|
||
$backinfo = array();
|
||
$backinfo['code'] = 0;
|
||
$i = '<option value="0"></option>';
|
||
foreach ($applist as $appid){
|
||
$backinfo = $db->select_all_row('sq_fidlist','ID,fidname', array('appid'=>$appid,'agentbuy'=>'1'), 'AND');
|
||
$appname = app_idgetname($appid);
|
||
foreach ($backinfo as $fidinfo) {
|
||
$i .= '<option value="' . $fidinfo['ID'] . '">' .$fidinfo['fidname'].'('.$appname.')' . '</option>';
|
||
}
|
||
}
|
||
die($i);
|
||
break;
|
||
case 'gettckeylist':
|
||
$where = array();
|
||
if (!empty($_GET['search'])){
|
||
$where['kami'] = $_GET['search'];
|
||
}
|
||
$where['fid'] = $_GET['fid'];
|
||
$where['aid'] = $_SESSION['agent_id'];
|
||
$backinfo['code'] = 0;
|
||
$backinfo['count'] = $db->select_count_row('sq_fidkey',$where,'AND');
|
||
if(!$arr = $db->select_limit_row('sq_fidkey','*',($_GET['page'] - 1) * $_GET['limit'] , $_GET['limit'], $where, 'AND','ORDER BY ID DESC')){
|
||
$backinfo['msg'] = $db->geterror();
|
||
die(json_encode($backinfo));
|
||
}
|
||
foreach ($arr as $key => $value){
|
||
if ($value['creattime'] == 0){
|
||
$arr[$key]['creattime'] = '-';
|
||
}else{
|
||
$arr[$key]['creattime'] = Get_Date($value['creattime']);
|
||
}
|
||
|
||
if ($value['usetime'] == 0){
|
||
$arr[$key]['usetime'] = '-';
|
||
}else{
|
||
$arr[$key]['usetime'] = Get_Date($value['usetime']);
|
||
}
|
||
|
||
$arr[$key]['status'] = '<input type="checkbox" value='.$value['ID'].' name="status" lay-skin="switch" lay-text="正常|冻结" id="qzgx"'.($value['status'] == 1? ' checked' : '').'>';
|
||
}
|
||
$backinfo['data'] = $arr;
|
||
die(json_encode($backinfo));
|
||
|
||
break;
|
||
case 'creatfidkey':
|
||
$count = $_POST['sc_count'];
|
||
if ($count <= 0){
|
||
die(json_encode(array('code'=>'-1','msg'=>'生成的数量不能为空或者0或者负数')));
|
||
}
|
||
$time = time();
|
||
if ($count <= 0){
|
||
die(json_encode(array('code'=>'-1','msg'=>'卡密金额不能为空或者0或者负数')));
|
||
}
|
||
if (!$fidinfo = $db->select_first_row('sq_fidlist', '*', array('ID' => $_POST['sc_fid']), 'AND')) {
|
||
die(json_encode(array('code' => -2, 'msg' => '无法找到该商品,请刷新页面重试')));
|
||
}
|
||
if (!$agentinfo = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username']), 'AND')) {
|
||
die(json_encode(array('code' => -3, 'msg' => '代理信息获取失败')));
|
||
}
|
||
if (!$levelinfo = $db->select_first_row('sq_level', '*', array('ID' => $agentinfo['levelid']), 'AND')) {
|
||
die(json_encode(array('code' => -2, 'msg' => '代理对应的等级信息获取失败!')));
|
||
}
|
||
$spendmoney = $fidinfo['agentprice'] * $count * $levelinfo['fracture'];
|
||
if ($spendmoney > $agentinfo['money']){
|
||
die(makejson(-10,'代理余额不足'.$spendmoney.',请先进行充值'));
|
||
}
|
||
$newmoney = $agentinfo['money'] - $spendmoney;
|
||
if (!$db->update('sq_agent', array('ID' => $_SESSION['agent_id']), 'AND', array('money' => $newmoney))) {
|
||
die('系统内部错误!');
|
||
}
|
||
|
||
$keylist='';
|
||
// P0-06: sc_fid 裸拼进 INSERT SQL,强制整型(上方 fidinfo 校验保证 fid 有效)
|
||
$scfid = (int)$_POST['sc_fid'];
|
||
for ($x=1; $x<=$_POST['sc_count']; $x++) {
|
||
$key = substr($time,0,6).'-'.rand_str(6).'-'.rand_str(6).'-'.rand_str(6).'-'.rand_str(6).rand_str(6);
|
||
$insarray[] = "'{$key}','{$time}','0','$scfid','1','{$_SESSION['agent_id']}'";
|
||
$keylist .= '<br>'.$key;
|
||
}
|
||
$sign = rand_str(32);
|
||
$_SESSION['cards'][$sign] = str_replace('<br>',"\r\n",$keylist);
|
||
if(!$num = $db->insert_back_row('sq_fidkey',array('kami','creattime','usetime','fid','status','aid'),$insarray)){
|
||
die(json_encode(array('code'=>'-1','msg'=>'数据库错误:'.$db->geterror())));
|
||
}else{
|
||
die(json_encode(array('code'=>'1','sign'=>$sign,'keys'=>'您的卡密如下:'.$keylist)));
|
||
}
|
||
break;
|
||
case 'tckeystatus':
|
||
if(!$db->update('sq_fidkey',array('ID'=>$_POST['keyid'],'aid'=>$_SESSION['agent_id']),'AND',array('status'=>textbooltonum($_POST['status'])))){
|
||
die('更新失败'.$db->geterror());
|
||
}else{
|
||
die('成功');
|
||
}
|
||
break;
|
||
case 'deltckey':
|
||
if (empty($_POST['keyid'])){
|
||
die('非法提交');
|
||
}
|
||
if (!$db->delete('sq_fidkey',array('ID'=>$_POST['keyid'],'aid'=>$_SESSION['agent_id']),'AND')){
|
||
die('删除失败 '.$db->geterror());
|
||
}else{
|
||
die('删除成功!');
|
||
}
|
||
break;
|
||
case 'download':
|
||
if (empty($_SESSION['cards'][$_GET['sign']])){
|
||
die('该Sign不存在或者已过期,无法下载卡密');
|
||
}else{
|
||
$filename = $_GET['sign'].".txt";
|
||
header('Content-Type:text/plain'); //指定下载文件类型
|
||
header('Content-Disposition: attachment; filename="'.$filename.'"'); //指定下载文件的描述
|
||
header('Content-Length:'.strlen($_SESSION['cards'][$_GET['sign']])); //指定下载文件的大小
|
||
die($_SESSION['cards'][$_GET['sign']]);
|
||
}
|
||
break;
|
||
case 'getkeylist':
|
||
$where = array();
|
||
if (!empty($_GET['search'])){
|
||
$where['kami'] = $_GET['search'];
|
||
}
|
||
$where['aid'] = $_SESSION['agent_id'];
|
||
$backinfo['code'] = 0;
|
||
$backinfo['count'] = $db->select_count_row('sq_key',$where,'AND');
|
||
if(!$arr = $db->select_limit_row('sq_key','*',($_GET['page'] - 1) * $_GET['limit'] , $_GET['limit'], $where, 'AND','ORDER BY ID DESC')){
|
||
$backinfo['msg'] = $db->geterror();
|
||
die(json_encode($backinfo));
|
||
}
|
||
foreach ($arr as $key => $value){
|
||
if ($value['creattime'] == 0){
|
||
$arr[$key]['creattime'] = '-';
|
||
}else{
|
||
$arr[$key]['creattime'] = Get_Date($value['creattime']);
|
||
}
|
||
|
||
if ($value['firstusetime'] == 0){
|
||
$arr[$key]['firstusetime'] = '-';
|
||
}else{
|
||
$arr[$key]['firstusetime'] = Get_Date($value['firstusetime']);
|
||
}
|
||
if ($value['lastusetime'] == 0){
|
||
$arr[$key]['lastusetime'] = '-';
|
||
}else{
|
||
$arr[$key]['lastusetime'] = Get_Date($value['lastusetime']);
|
||
}
|
||
$arr[$key]['status'] = '<input type="checkbox" value='.$value['ID'].' name="status" lay-skin="switch" lay-text="正常|冻结" id="qzgx"'.($value['status'] == 1? ' checked' : '').'>';
|
||
}
|
||
$backinfo['data'] = $arr;
|
||
die(json_encode($backinfo));
|
||
break;
|
||
case 'creatkey':
|
||
$count = $_POST['sc_count'];
|
||
if ($count <= 0){
|
||
die(json_encode(array('code'=>'-1','msg'=>'生成的数量不能为空或者0或者负数')));
|
||
}
|
||
$time = time();
|
||
$money = $_POST['sc_money'];
|
||
// P0-06: money 会裸拼进 INSERT SQL 与卡密字符串,强制数字
|
||
if (!is_numeric($money) || $money <= 0){
|
||
die(json_encode(array('code'=>'-1','msg'=>'卡密金额格式错误')));
|
||
}
|
||
$spendmoney = $money * $count;
|
||
if (!$agentinfo = $db->select_first_row('sq_agent', '*', array('username' => $_SESSION['agent_username']), 'AND')) {
|
||
die(json_encode(array('code' => -2, 'msg' => '代理信息获取失败')));
|
||
}
|
||
if ($spendmoney > $agentinfo['money']){
|
||
die(makejson(-10,'代理余额不足'.$spendmoney.',请先进行充值'));
|
||
}
|
||
$newmoney = $agentinfo['money'] - $spendmoney;
|
||
if (!$db->update('sq_agent', array('ID' => $_SESSION['agent_id']), 'AND', array('money' => $newmoney))) {
|
||
die('系统内部错误!');
|
||
}
|
||
|
||
$keylist='';
|
||
for ($x=1; $x<=$_POST['sc_count']; $x++) {
|
||
$key = substr($time,0,6).'-'.rand_str(6).'-'.rand_str(6).'-'.rand_str(6).'-'.rand_str(6).'-'.$money;
|
||
$insarray[] = "'{$key}','{$time}','0','{$money}','{$money}','0','1','{$_SESSION['agent_id']}'";
|
||
$keylist .= '<br>'.$key;
|
||
}
|
||
$sign = rand_str(32);
|
||
$_SESSION['cards'][$sign] = str_replace('<br>',"\r\n",$keylist);
|
||
if(!$num = $db->insert_back_row('sq_key',array('kami','creattime','firstusetime','allmoney','lastmoney','lastusetime','status','aid'),$insarray)){
|
||
die(json_encode(array('code'=>'-1','msg'=>'数据库错误:'.$db->geterror())));
|
||
}else{
|
||
die(json_encode(array('code'=>'1','sign'=>$sign,'keys'=>'您的卡密如下:'.$keylist)));
|
||
}
|
||
break;
|
||
case 'FidKeyOperation':
|
||
switch ($_POST['operation']){
|
||
case 'ExportNoUse':
|
||
$result = $db->select_all_row('sq_fidkey','kami',array('usetime'=>0,'status'=>1,'fid'=>$_POST['fid'],'aid'=>$_SESSION['agent_id']),'AND');
|
||
$keylist = '';
|
||
foreach ($result as $value){
|
||
$keylist .= $value['kami']."\r\n";
|
||
}
|
||
$sign = rand_str(32);
|
||
$_SESSION['cards'][$sign] = $keylist;
|
||
die('您的卡密已就绪,<a href="../ajax.php?mod=download&sign='.$sign.'">点击这里下载卡密</a>');
|
||
break;
|
||
case 'ExportAll':
|
||
$result = $db->select_all_row('sq_fidkey','kami',array('fid'=>$_POST['fid'],'aid'=>$_SESSION['agent_id'],'status'=>1));
|
||
$keylist = '';
|
||
foreach ($result as $value){
|
||
$keylist .= $value['kami']."\r\n";
|
||
}
|
||
$sign = rand_str(32);
|
||
$_SESSION['cards'][$sign] = $keylist;
|
||
die('您的卡密已就绪,<a href="../ajax.php?mod=download&sign='.$sign.'">点击这里下载卡密</a>');
|
||
break;
|
||
case 'DelNoUse':
|
||
$db->delete('sq_fidkey',array('usetime'=>0,'fid'=>$_POST['fid'],'status'=>1,'aid'=>$_SESSION['agent_id']),'AND');
|
||
die('成功删除'.(int)$db->affected_num().'行');
|
||
break;
|
||
case 'DelUse':
|
||
// P0-06: fid 裸拼进 DELETE SQL,强制整型
|
||
$db->delete('sq_fidkey', '`usetime` > 0 AND `fid` = '.(int)$_POST['fid'].' AND `aid` = '.(int)$_SESSION['agent_id'].' AND `status` = 1','AND');
|
||
die('成功删除'.(int)$db->affected_num().'行');
|
||
break;
|
||
case 'DelAll':
|
||
$db->delete('sq_fidkey',array('fid'=>$_POST['fid'],'aid'=>$_SESSION['agent_id']),'AND');
|
||
die('成功删除'.(int)$db->affected_num().'行');
|
||
break;
|
||
}
|
||
break;
|
||
case 'KeyOperation':
|
||
switch ($_POST['operation']){
|
||
case 'ExportNoUse':
|
||
$result = $db->select_all_row('sq_key','kami',array('firstusetime'=>0,'status'=>1,'aid'=>$_SESSION['agent_id']));
|
||
$keylist = '';
|
||
foreach ($result as $value){
|
||
$keylist .= $value['kami']."\r\n";
|
||
}
|
||
$sign = rand_str(32);
|
||
$_SESSION['cards'][$sign] = $keylist;
|
||
die(makejson(1,'success',array('sign'=>$sign)));
|
||
break;
|
||
case 'ExportNoMoney':
|
||
$result = $db->select_all_row('sq_key','kami',array('lastmoney'=>0,'status'=>1,'aid'=>$_SESSION['agent_id']));
|
||
$keylist = '';
|
||
foreach ($result as $value){
|
||
$keylist .= $value['kami']."\r\n";
|
||
}
|
||
$sign = rand_str(32);
|
||
$_SESSION['cards'][$sign] = $keylist;
|
||
die(makejson(1,'success',array('sign'=>$sign)));
|
||
break;
|
||
case 'ExportAll':
|
||
$result = $db->select_all_row('sq_key','kami',array('aid'=>$_SESSION['agent_id']));
|
||
$keylist = '';
|
||
foreach ($result as $value){
|
||
$keylist .= $value['kami']."\r\n";
|
||
}
|
||
$sign = rand_str(32);
|
||
$_SESSION['cards'][$sign] = $keylist;
|
||
die(makejson(1,'success',array('sign'=>$sign)));
|
||
break;
|
||
case 'DelNoMoney':
|
||
$db->delete('sq_key',array('lastmoney'=>0,'aid'=>$_SESSION['agent_id']),'AND');
|
||
|
||
die(makejson(2,'success',array('nums'=>$db->affected_num())));
|
||
break;
|
||
case 'DelNoUse':
|
||
$db->delete('sq_key',array('firstusetime'=>0,'aid'=>$_SESSION['agent_id']),'AND');
|
||
die(makejson(2,'success',array('nums'=>$db->affected_num())));
|
||
break;
|
||
case 'DelAll':
|
||
$db->delete('sq_key',array('aid'=>$_SESSION['agent_id']),'AND');
|
||
die(makejson(2,'success',array('nums'=>$db->affected_num())));
|
||
break;
|
||
default:
|
||
die(makejson(-1,'未知操作:'.$_POST['operation']));
|
||
}
|
||
break;
|
||
case 'keylog':
|
||
if (!$result = $db->select_limit_row('sq_log_kami','*','',0,array('keyid'=>$_POST['keyid'],'aid'=>$_SESSION['agent_id']),'AND',"ORDER BY time DESC")){
|
||
die(makejson(-1,'数据库中没有记录'));
|
||
}
|
||
die(makejson(1,'success',array('items'=>$result)));
|
||
break;
|
||
case 'delkey':
|
||
if (empty($_POST['keyid'])){
|
||
die(makejson(-1,'卡密ID不能为空'));
|
||
}
|
||
if (!$db->delete('sq_key',array('ID'=>$_POST['keyid'],'aid'=>$_SESSION['agent_id']),'AND')){
|
||
die(makejson(-2,'删除失败 '.$db->geterror()));
|
||
}else{
|
||
die(makejson(1,'删除成功!'));
|
||
}
|
||
break;
|
||
}
|
||
die('啊嘞嘞???');
|