Files
wenquanauth/agent/ajax.php
T
youpaishidifu 24264cf320 加固-06(P0-05): 密码全部以 bcrypt 哈希入库,旧格式(明文/MD5)兼容并惰性迁移
背景:sq_user/sq_agent 密码明文入库、sq_admin 存 MD5;订单表 sq_trade.pass 明文在途;
找回密码 API 会把明文密码直接发邮件;日志记录明文密码。数据库泄露 = 全部账号密码泄露。

1. function/function_core.php 新增 3 个 helper(updateset 之后):
   - wq_is_hashed_password($v):判断存储值是否为新 bcrypt 哈希(60 长度 $2y$ 前缀)
   - wq_hash_password($plain):password_hash(PASSWORD_BCRYPT)
   - wq_verify_password($plain,$stored,$legacy):兼容 新 bcrypt / 旧明文(sq_user/sq_agent) / 旧 md5(sq_admin),
     哈希比对一律 hash_equals,恒定时间比较防时序侧信道

2. 所有落库点改为 bcrypt:
   - 用户开户漏斗 function/function_auth.php auth_add 入口幂等补哈希(上游已哈希则原样保留)
   - 代理开通漏斗 function/trade.inc.php type=4 代理落库前幂等补哈希
   - 下单点订单密码哈希入库:ajax.php(320/388/781)、agent/ajax.php(439) —— 订单表不再有明文在途密码
   - admin/ajax.php:addagent、addadmin、changeagent(mod=password)、changepassword 新密码
   - agent/ajax.php:开下级代理、changeuser(mod=password)、changeagent(mod=password)、changepassword 新密码
   - api.php:ChangePassword 写库
   - api/Communication.php 与 function/communication.php:用户登录校验成功后,旧明文惰性升级为 bcrypt

3. 所有校验点改为取行 + PHP 校验(不再 WHERE password=明文):
   - admin 登录(旧 MD5 兼容,成功即写回 bcrypt,session 与 DB 存同一新哈希保住 re-check 机制)
   - agent 密码登录(旧明文兼容,惰性迁移);agent token 登录 session 改存 DB 存储值
   - 根 ajax.php 续费 kt 密码校验(379/773)、卡密找回密码(1002)
   - api.php GetUserInfo 内联校验、getuserinfo() 校验(均带惰性迁移)

4. 找回密码改造(api.php RetrievePassword):
   密码已不可逆,原"邮件下发原密码"改为"重置为一次性随机新密码(bin2hex(random_bytes(6)))+ 哈希落库 + 仅邮件投递一次"

5. 日志/回传去明文:
   - admin 登录失败日志不再记录明文密码(改记账号)
   - admin getagentinfo 不再回传密码值(掩码 ********,经确认 UI 无回写风险)

6. 表结构:sq_admin.password varchar(33) -> varchar(255)(bcrypt 60 字符装不下)
   - wenquan_auth.sql 同步更新(新装库直接可用)
   - 已有库需执行:ALTER TABLE sq_admin MODIFY password varchar(255) NOT NULL;(本次本地库已执行)

回归(40 项全 PASS,8082 内置服务器 + 8081 nginx 双通道冒烟):
- API(c=api) 旧明文用户登录成功即升级 bcrypt;再登录幂等不错哈希;错密码 -205 被拒
- admin 旧 MD5 登录即迁移 bcrypt;再登录/错密码/日志无明文/checklogin 会话重校验均通过
- admin 新增管理员、改密(旧密码失效/新密码生效/恢复基线)
- admin 新增代理直接 bcrypt;getagentinfo 掩码;changeagent 改密哈希入库
- 旧明文代理登录即迁移 bcrypt;checklogin 通过;代理改密旧失效新生效
- admin 手工开通(funnel)明文 POST 直接存 bcrypt;API 登录新开通用户成功
- 注:测试应用 free 必须为 0(free=1 时 Login 入口直接放行,属产品设计,不走密码校验)

已知行为变化(记录):用户/代理列表按"密码"关键词搜索不再命中(存储已哈希,搜索本身即泄露向量,收紧);
列表中密码列显示 60 位哈希串而非明文;改密会使该账号现有会话失效需重新登录(与旧行为一致)。

api.php 为 2024 树中的旧入口(已被 api/Communication.php 取代),仍按同口径同步修了 4 处密码点防复活踩坑。
2026-10-10 12:25:52 +08:00

1261 lines
58 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?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='';
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','{$_POST['sc_fid']}','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'];
if ($money <= 0){
die(json_encode(array('code'=>'-1','msg'=>'卡密金额不能为空或者0或者负数')));
}
$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':
$db->delete('sq_fidkey', '`usetime` > 0 AND `fid` = '.$_POST['fid'].' AND `aid` = '.$_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('啊嘞嘞???');