commit 09a14bf0a3ba6069bdb4c2ce5086255aa65b3be1
Author: 李志强 <357099073@qq.com>
Date: Fri Nov 28 10:08:12 2025 +0800
first commit
diff --git a/.htaccess b/.htaccess
new file mode 100644
index 0000000..3ead6a6
--- /dev/null
+++ b/.htaccess
@@ -0,0 +1,11 @@
+
+ Options +FollowSymlinks
+ RewriteEngine On
+
+ RewriteCond %{REQUEST_FILENAME} !-d
+ RewriteCond %{REQUEST_FILENAME} !-f
+ RewriteRule ^(.[a-zA-Z0-9\-\_]+).html$ index.php?mod=$1 [QSA,PT,L]
+ RewriteRule ^pay/(.*)$ pay.php?s=$1 [QSA,PT,L]
+ RewriteRule ^api/(.*)$ api.php?s=$1 [QSA,PT,L]
+ RewriteRule ^doc/(.[a-zA-Z0-9\-\_]+).html$ index.php?doc=$1 [QSA,PT,L]
+
\ No newline at end of file
diff --git a/IIS.txt b/IIS.txt
new file mode 100644
index 0000000..d240f0e
--- /dev/null
+++ b/IIS.txt
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/admin/ajax.php b/admin/ajax.php
new file mode 100644
index 0000000..dc4692f
--- /dev/null
+++ b/admin/ajax.php
@@ -0,0 +1,198 @@
+window.location.href='./login.php';");
+$act=isset($_GET['act'])?daddslashes($_GET['act']):null;
+
+if(!checkRefererHost())exit('{"code":403}');
+
+@header('Content-Type: application/json; charset=UTF-8');
+
+switch($act){
+case 'getcount':
+ $thtime=date("Y-m-d").' 00:00:00';
+ $count1=$DB->getColumn("SELECT count(*) from pre_order");
+ $count2=$DB->getColumn("SELECT count(*) from pre_user");
+ $plugincount=$DB->getColumn("SELECT count(*) from pre_plugin");
+ if($plugincount<1){
+ \lib\Plugin::updateAll();
+ }
+ $isConvert = $DB->getRow("SELECT * FROM pre_channel WHERE status=1 AND config IS NULL LIMIT 1");
+ if($isConvert){
+ convert_channel_data();
+ \lib\Plugin::updateAll();
+ }
+
+ $orderrow=$DB->getRow("SELECT COUNT(*) allnum,COUNT(IF(status>0, 1, NULL)) sucnum FROM pre_order WHERE addtime>='$thtime'");
+ $success_rate = 100;
+ if($orderrow){
+ if($orderrow['allnum'] > 0){
+ $success_rate = round($orderrow['sucnum']/$orderrow['allnum']*100,2);
+ }
+ }
+
+ $paytype = [];
+ $rs = $DB->getAll("SELECT id,name,showname FROM pre_type WHERE status=1");
+ foreach($rs as $row){
+ $paytype[$row['id']] = $row['showname'];
+ }
+ unset($rs);
+
+ $channel = [];
+ $rs = $DB->getAll("SELECT id,name FROM pre_channel WHERE status=1");
+ foreach($rs as $row){
+ $channel[$row['id']] = $row['name'];
+ }
+ unset($rs);
+
+ $tongji_cachetime=getSetting('tongji_cachetime', true);
+ $tongji_cache = $CACHE->read('tongji');
+ if($tongji_cachetime+3600>=time() && $tongji_cache && !isset($_GET['getnew'])){
+ $array = unserialize($tongji_cache);
+ $result=["code"=>0,"type"=>"cache","paytype"=>$paytype,"channel"=>$channel,"count1"=>$count1,"count2"=>$count2,"usermoney"=>round($array['usermoney'],2),"settlemoney"=>round($array['settlemoney'],2),"success_rate"=>$success_rate,"order_today"=>$array['order_today'],"order"=>[]];
+ }else{
+ $usermoney=$DB->getColumn("SELECT SUM(money) FROM pre_user WHERE money!='0.00'");
+ $settlemoney=$DB->getColumn("SELECT SUM(money) FROM pre_settle");
+
+ $today=date("Y-m-d");
+ $rs=$DB->query("SELECT type,channel,realmoney,profitmoney from pre_order where status=1 and date>='$today'");
+ foreach($paytype as $id=>$type){
+ $order_paytype[$id]=0;
+ $profit_paytype[$id]=0;
+ }
+ foreach($channel as $id=>$type){
+ $order_channel[$id]=0;
+ }
+ while($row = $rs->fetch())
+ {
+ $order_paytype[$row['type']]+=$row['realmoney'];
+ $order_channel[$row['channel']]+=$row['realmoney'];
+ if(!empty($row['profitmoney'])){
+ $profit_paytype[$row['type']]+=$row['profitmoney'];
+ }
+ }
+ foreach($order_paytype as $k=>$v){
+ $order_paytype[$k] = round($v,2);
+ }
+ foreach($order_channel as $k=>$v){
+ $order_channel[$k] = round($v,2);
+ }
+ foreach($profit_paytype as $k=>$v){
+ $profit_paytype[$k] = round($v,2);
+ }
+ $allmoney=0;
+ foreach($order_paytype as $order){
+ $allmoney+=$order;
+ }
+ $allprofit=0;
+ foreach($profit_paytype as $money){
+ $allprofit+=$money;
+ }
+
+ $order_today['all']=round($allmoney,2);
+ $order_today['profit_all']=round($allprofit,2);
+ $order_today['paytype']=$order_paytype;
+ $order_today['channel']=$order_channel;
+ $order_today['profit_paytype']=$profit_paytype;
+
+ saveSetting('tongji_cachetime',time());
+ $CACHE->save('tongji',serialize(["usermoney"=>$usermoney,"settlemoney"=>$settlemoney,"order_today"=>$order_today]));
+
+ $result=["code"=>0,"type"=>"online","paytype"=>$paytype,"channel"=>$channel,"count1"=>$count1,"count2"=>$count2,"usermoney"=>round($usermoney,2),"settlemoney"=>round($settlemoney,2),"success_rate"=>$success_rate,"order_today"=>$order_today,"order"=>[]];
+ }
+ for($i=1;$i<7;$i++){
+ $day = date("Ymd", strtotime("-{$i} day"));
+ if($order_tongji = $CACHE->read('order_'.$day)){
+ $result["order"][$day] = unserialize($order_tongji);
+ }else{
+ break;
+ }
+ }
+ exit(json_encode($result));
+break;
+
+case 'set':
+ if(isset($_POST['localurl'])){
+ if(!empty($_POST['localurl']) && (substr($_POST['localurl'],0,4)!='http' || substr($_POST['localurl'],-1)!='/'))exit('{"code":-1,"msg":"回调专用网址格式错误"}');
+ }
+ if(isset($_POST['apiurl'])){
+ if(!empty($_POST['apiurl']) && (substr($_POST['apiurl'],0,4)!='http' || substr($_POST['apiurl'],-1)!='/'))exit('{"code":-1,"msg":"用户对接网址格式错误"}');
+ }
+ if(isset($_POST['login_apiurl'])){
+ if(!empty($_POST['login_apiurl']) && (substr($_POST['login_apiurl'],0,4)!='http' || substr($_POST['login_apiurl'],-1)!='/'))exit('{"code":-1,"msg":"聚合登录API接口地址格式错误"}');
+ }
+ foreach($_POST as $k=>$v){
+ saveSetting($k, $v);
+ }
+ $ad=$CACHE->clear();
+ if($ad)exit('{"code":0,"msg":"succ"}');
+ else exit('{"code":-1,"msg":"修改设置失败['.$DB->error().']"}');
+break;
+case 'setGonggao':
+ $id=intval($_GET['id']);
+ $status=intval($_GET['status']);
+ $sql = "UPDATE pre_anounce SET status='$status' WHERE id='$id'";
+ if($DB->exec($sql))exit('{"code":0,"msg":"修改状态成功!"}');
+ else exit('{"code":-1,"msg":"修改状态失败['.$DB->error().']"}');
+break;
+case 'delGonggao':
+ $id=intval($_GET['id']);
+ $sql = "DELETE FROM pre_anounce WHERE id='$id'";
+ if($DB->exec($sql))exit('{"code":0,"msg":"删除公告成功!"}');
+ else exit('{"code":-1,"msg":"删除公告失败['.$DB->error().']"}');
+break;
+case 'iptype':
+ $result = [
+ ['name'=>'0_X_FORWARDED_FOR', 'ip'=>real_ip(0), 'city'=>get_ip_city(real_ip(0))],
+ ['name'=>'1_X_REAL_IP', 'ip'=>real_ip(1), 'city'=>get_ip_city(real_ip(1))],
+ ['name'=>'2_REMOTE_ADDR', 'ip'=>real_ip(2), 'city'=>get_ip_city(real_ip(2))]
+ ];
+ exit(json_encode($result));
+break;
+
+case 'setArticle': //文章状态
+ $id=intval($_GET['id']);
+ $active=intval($_GET['active']);
+ $DB->exec("update pre_article set active='$active' where id='{$id}'");
+ exit('{"code":0,"msg":"succ"}');
+break;
+case 'article_upload':
+ $file_name = $_FILES['imgFile']['name'];
+ $tmp_name = $_FILES['imgFile']['tmp_name'];
+ //获得文件扩展名
+ $temp_arr = explode(".", $file_name);
+ $file_ext = array_pop($temp_arr);
+ $file_ext = strtolower(trim($file_ext));
+ if (in_array($file_ext, array('gif', 'jpg', 'jpeg', 'png', 'bmp', 'webp')) === false) {
+ exit('{"error":1,"message":"上传文件扩展名是不允许的扩展名。"}');
+ }
+ $filename = md5_file($tmp_name).'.'.$file_ext;
+ $fileurl = '/assets/img/article/'.$filename;
+ if(copy($tmp_name, ROOT.'assets/img/article/'.$filename)){
+ exit('{"error":0,"url":"'.$fileurl.'"}');
+ }else{
+ exit('{"error":1,"message":"上传失败,请确保有本地写入权限"}');
+ }
+break;
+
+case 'testproxy':
+ $conf['proxy_server'] = trim($_POST['proxy_server']);
+ $conf['proxy_port'] = $_POST['proxy_port'];
+ $conf['proxy_user'] = trim($_POST['proxy_user']);
+ $conf['proxy_pwd'] = trim($_POST['proxy_pwd']);
+ $conf['proxy_type'] = $_POST['proxy_type'];
+ try{
+ check_proxy('https://dl.amh.sh/ip.htm');
+ }catch(Exception $e){
+ try{
+ check_proxy('https://myip.ipip.net/');
+ }catch(Exception $e){
+ exit('{"code":-1,"msg":"'.$e->getMessage().'"}');
+ }
+ }
+ exit('{"code":0}');
+break;
+
+default:
+ exit('{"code":-4,"msg":"No Act"}');
+break;
+}
\ No newline at end of file
diff --git a/admin/ajax_order.php b/admin/ajax_order.php
new file mode 100644
index 0000000..1b12621
--- /dev/null
+++ b/admin/ajax_order.php
@@ -0,0 +1,379 @@
+window.location.href='./login.php';");
+$act=isset($_GET['act'])?daddslashes($_GET['act']):null;
+
+if(!checkRefererHost())exit('{"code":403}');
+
+@header('Content-Type: application/json; charset=UTF-8');
+
+switch($act){
+case 'orderList':
+ $paytype = [];
+ $paytypes = [];
+ $rs = $DB->getAll("SELECT * FROM pre_type");
+ foreach($rs as $row){
+ $paytype[$row['id']] = $row['showname'];
+ $paytypes[$row['id']] = $row['name'];
+ }
+ unset($rs);
+
+ $sql=" 1=1";
+ if(isset($_POST['uid']) && !empty($_POST['uid'])) {
+ $uid = intval($_POST['uid']);
+ $sql.=" AND A.`uid`='$uid'";
+ }
+ if(isset($_POST['type']) && !empty($_POST['type'])) {
+ $type = intval($_POST['type']);
+ $sql.=" AND A.`type`='$type'";
+ }elseif(isset($_POST['channel']) && !empty($_POST['channel'])) {
+ $channel = intval($_POST['channel']);
+ $sql.=" AND A.`channel`='$channel'";
+ }elseif(isset($_POST['subchannel']) && !empty($_POST['subchannel'])) {
+ $subchannel = trim($_POST['subchannel']);
+ $subchannel = explode('|', $subchannel);
+ $subchannel = array_map('intval', $subchannel);
+ $sql.=" AND A.`subchannel` IN (".implode(",", $subchannel).")";
+ }
+ if(isset($_POST['dstatus']) && $_POST['dstatus']>-1) {
+ $dstatus = intval($_POST['dstatus']);
+ $sql.=" AND A.status={$dstatus}";
+ }
+ if(!empty($_POST['starttime']) || !empty($_POST['endtime'])){
+ if(!empty($_POST['starttime'])){
+ $starttime = daddslashes($_POST['starttime']);
+ $sql.=" AND A.addtime>='{$starttime} 00:00:00'";
+ }
+ if(!empty($_POST['endtime'])){
+ $endtime = daddslashes($_POST['endtime']);
+ $sql.=" AND A.addtime<='{$endtime} 23:59:59'";
+ }
+ }
+ if(isset($_POST['value']) && !empty($_POST['value'])) {
+ if($_POST['column']=='name'){
+ $sql.=" AND A.`{$_POST['column']}` like '%{$_POST['value']}%'";
+ }else{
+ if(($_POST['column'] == 'money' || $_POST['column'] == 'realmoney' || $_POST['column'] == 'getmoney') && strpos($_POST['value'],'-')){
+ $money = explode('-', $_POST['value']);
+ $sql.=" AND A.`{$_POST['column']}`>='{$money[0]}' AND A.`{$_POST['column']}`<='{$money[1]}'";
+ }else{
+ $sql.=" AND A.`{$_POST['column']}`='{$_POST['value']}'";
+ }
+ }
+ }
+ $offset = intval($_POST['offset']);
+ $limit = intval($_POST['limit']);
+ $total = $DB->getColumn("SELECT count(*) from pre_order A WHERE{$sql}");
+ $list = $DB->getAll("SELECT A.*,B.plugin FROM pre_order A LEFT JOIN pre_channel B ON A.channel=B.id WHERE{$sql} order by trade_no desc limit $offset,$limit");
+ $list2 = [];
+ foreach($list as $row){
+ $row['typename'] = $paytypes[$row['type']];
+ $row['typeshowname'] = $paytype[$row['type']];
+ $list2[] = $row;
+ }
+
+ exit(json_encode(['total'=>$total, 'rows'=>$list2]));
+break;
+
+case 'statistics':
+ $sql=" 1=1";
+ if(isset($_POST['uid']) && !empty($_POST['uid'])) {
+ $uid = intval($_POST['uid']);
+ $sql.=" AND A.`uid`='$uid'";
+ }
+ if(isset($_POST['type']) && !empty($_POST['type'])) {
+ $type = intval($_POST['type']);
+ $sql.=" AND A.`type`='$type'";
+ }elseif(isset($_POST['channel']) && !empty($_POST['channel'])) {
+ $channel = intval($_POST['channel']);
+ $sql.=" AND A.`channel`='$channel'";
+ }elseif(isset($_POST['subchannel']) && !empty($_POST['subchannel'])) {
+ $subchannel = intval($_POST['subchannel']);
+ $sql.=" AND A.`subchannel`='$subchannel'";
+ }
+ if(isset($_POST['dstatus']) && $_POST['dstatus']>-1) {
+ $dstatus = intval($_POST['dstatus']);
+ $sql.=" AND A.status={$dstatus}";
+ }
+ if(!empty($_POST['starttime']) || !empty($_POST['endtime'])){
+ if(!empty($_POST['starttime'])){
+ $starttime = daddslashes($_POST['starttime']);
+ $sql.=" AND A.addtime>='{$starttime} 00:00:00'";
+ }
+ if(!empty($_POST['endtime'])){
+ $endtime = daddslashes($_POST['endtime']);
+ $sql.=" AND A.addtime<='{$endtime} 23:59:59'";
+ }
+ }
+ if(isset($_POST['value']) && !empty($_POST['value'])) {
+ if($_POST['column']=='name'){
+ $sql.=" AND A.`{$_POST['column']}` like '%{$_POST['value']}%'";
+ }else{
+ if(($_POST['column'] == 'money' || $_POST['column'] == 'realmoney' || $_POST['column'] == 'getmoney') && strpos($_POST['value'],'-')){
+ $money = explode('-', $_POST['value']);
+ $sql.=" AND A.`{$_POST['column']}`>='{$money[0]}' AND A.`{$_POST['column']}`<='{$money[1]}'";
+ }else{
+ $sql.=" AND A.`{$_POST['column']}`='{$_POST['value']}'";
+ }
+ }
+ }
+ // 统计数据
+ $resultMoneyData = $DB->getRow("SELECT
+ SUM(money) AS totalMoney,
+ SUM(CASE WHEN A.status = 1 THEN money ELSE 0 END) AS successMoney,
+ SUM(CASE WHEN A.status = 0 THEN money ELSE 0 END) AS unpaidMoney,
+ SUM(CASE WHEN A.status = 2 THEN refundmoney ELSE 0 END) AS refundMoney
+ FROM pre_order A LEFT JOIN pre_channel B ON A.channel=B.id WHERE {$sql} order by trade_no desc");
+
+ $resultCount = $DB->getRow("SELECT
+ COUNT(*) AS totalCount,
+ SUM(CASE WHEN A.status = 1 THEN 1 ELSE 0 END) AS successCount,
+ SUM(CASE WHEN A.status = 0 THEN 1 ELSE 0 END) AS unpaidCount,
+ SUM(CASE WHEN A.status = 2 THEN 1 ELSE 0 END) AS refundCount
+ FROM pre_order A LEFT JOIN pre_channel B ON A.channel=B.id WHERE {$sql} order by trade_no desc");
+
+ // 获取平台总收入利润
+ $platformProfit = $DB->getColumn("SELECT SUM(A.profitmoney) FROM pre_order A LEFT JOIN pre_channel B ON A.channel=B.id WHERE {$sql} AND status = 1 order by trade_no desc");
+
+ $result = [
+ 'totalMoney' => number_format($resultMoneyData['totalMoney'], 2, '.', '') ?? 0.00,
+ 'successMoney' => number_format($resultMoneyData['successMoney'], 2, '.', '') ?? 0.00,
+ 'unpaidMoney' => number_format($resultMoneyData['unpaidMoney'], 2, '.', '') ?? 0.00,
+ 'refundMoney' => number_format($resultMoneyData['refundMoney'], 2, '.', '') ?? 0.00,
+ 'totalCount' => $resultCount['totalCount'] ?? '0',
+ 'successCount' => $resultCount['successCount'] ?? '0',
+ 'unpaidCount' => $resultCount['unpaidCount'] ?? '0',
+ 'refundCount' => $resultCount['refundCount'] ?? '0',
+ 'platformProfit' => number_format($platformProfit, 2, '.', '') ?? 0.00
+ ];
+ $result['successRate'] = $result['totalCount'] > 0 ? round(($result['totalCount']-$result['unpaidCount']) / $result['totalCount'] * 100, 2) : 0;
+ exit(json_encode(['code'=>0, 'data'=>$result]));
+break;
+
+case 'riskList':
+ $sql=" 1=1";
+ if(isset($_POST['value']) && !empty($_POST['value'])) {
+ $sql.=" AND `{$_POST['column']}`='{$_POST['value']}'";
+ }
+ if(isset($_POST['type']) && $_POST['type']>-1) {
+ $type = intval($_POST['type']);
+ $sql.=" AND `type`={$type}";
+ }
+ $offset = intval($_POST['offset']);
+ $limit = intval($_POST['limit']);
+ $total = $DB->getColumn("SELECT count(*) from pre_risk WHERE{$sql}");
+ $list = $DB->getAll("SELECT * FROM pre_risk WHERE{$sql} order by id desc limit $offset,$limit");
+
+ exit(json_encode(['total'=>$total, 'rows'=>$list]));
+break;
+
+case 'setStatus': //改变订单状态
+ $trade_no=trim($_GET['trade_no']);
+ $status=is_numeric($_GET['status'])?intval($_GET['status']):exit('{"code":200}');
+ if($status==5){
+ if($DB->exec("DELETE FROM pre_order WHERE trade_no='$trade_no'"))
+ exit('{"code":200}');
+ else
+ exit('{"code":400,"msg":"删除订单失败!['.$DB->error().']"}');
+ }else{
+ if($DB->exec("update pre_order set status='$status' where trade_no='$trade_no'")!==false)
+ exit('{"code":200}');
+ else
+ exit('{"code":400,"msg":"修改订单失败!['.$DB->error().']"}');
+ }
+break;
+case 'order': //订单详情
+ $trade_no=trim($_GET['trade_no']);
+ $row=$DB->getRow("select A.*,B.showname typename,C.name channelname from pre_order A,pre_type B,pre_channel C where trade_no='$trade_no' and A.type=B.id and A.channel=C.id limit 1");
+ if(!$row)
+ exit('{"code":-1,"msg":"当前订单不存在或未成功选择支付通道!"}');
+ $row['subchannelname'] = $row['subchannel'] > 0 ? $DB->findColumn('subchannel', 'name', ['id'=>$row['subchannel']]) : '';
+ if($row['status']==2){
+ $row['refundtime'] = $DB->findColumn('refundorder', 'addtime', ['trade_no'=>$trade_no], 'refund_no DESC');
+ }
+ $result=array("code"=>0,"msg"=>"succ","data"=>$row);
+ exit(json_encode($result));
+break;
+case 'subOrders':
+ $trade_no=trim($_GET['trade_no']);
+ $list = \lib\Payment::getSubOrders($trade_no);
+ exit(json_encode(['code'=>0, 'data'=>$list, 'settle'=>$DB->findColumn('order', 'settle', ['trade_no'=>$trade_no])]));
+break;
+case 'operation': //批量操作订单
+ $status=is_numeric($_POST['status'])?intval($_POST['status']):exit('{"code":-1,"msg":"请选择操作"}');
+ $checkbox=$_POST['checkbox'];
+ $i=0;
+ foreach($checkbox as $trade_no){
+ if($status==4)$DB->exec("DELETE FROM pre_order WHERE trade_no='$trade_no'");
+ elseif($status==3){
+ \lib\Order::unfreeze($trade_no);
+ }
+ elseif($status==2){
+ \lib\Order::freeze($trade_no);
+ }
+ else $DB->exec("update pre_order set status='$status' where trade_no='$trade_no' limit 1");
+ $i++;
+ }
+ exit('{"code":0,"msg":"成功改变'.$i.'条订单状态"}');
+break;
+case 'getmoney': //退款查询
+ if(!$conf['admin_paypwd'])exit('{"code":-1,"msg":"你还未设置支付密码"}');
+ $trade_no=trim($_POST['trade_no']);
+ $api=isset($_POST['api'])?intval($_POST['api']):0;
+ $result = \lib\Order::refund_info($trade_no, $api);
+ exit(json_encode($result));
+break;
+case 'refund': //退款操作
+ $trade_no=trim($_POST['trade_no']);
+ $money = trim($_POST['money']);
+ if(!is_numeric($money) || !preg_match('/^[0-9.]+$/', $money))exit('{"code":-1,"msg":"金额输入错误"}');
+
+ $refund_no = date("YmdHis").rand(11111,99999);
+ $result = \lib\Order::refund($refund_no, $trade_no, $money);
+ if($result['code'] == 0){
+ $result['msg'] = '已成功从UID:'.$result['uid'].'扣除'.$result['reducemoney'].'元余额';
+ }
+ exit(json_encode($result));
+break;
+case 'apirefund': //API退款操作
+ $trade_no=trim($_POST['trade_no']);
+ $paypwd=trim($_POST['paypwd']);
+ $money = trim($_POST['money']);
+ if(!is_numeric($money) || !preg_match('/^[0-9.]+$/', $money))exit('{"code":-1,"msg":"金额输入错误"}');
+ if($paypwd!=$conf['admin_paypwd'])
+ exit('{"code":-1,"msg":"支付密码输入错误!"}');
+
+ $refund_no = date("YmdHis").rand(11111,99999);
+ $result = \lib\Order::refund($refund_no, $trade_no, $money, 1);
+ if($result['code'] == 0){
+ $result['msg'] = '退款成功!退款金额¥'.$result['money'];
+ if($result['reducemoney']>0){
+ $result['msg'] .= ',并成功从UID:'.$result['uid'].'扣除'.$result['reducemoney'].'元余额';
+ }
+ }
+ exit(json_encode($result));
+break;
+case 'freeze': //冻结订单
+ $trade_no=trim($_POST['trade_no']);
+ $result = \lib\Order::freeze($trade_no);
+ exit(json_encode($result));
+break;
+case 'unfreeze': //解冻订单
+ $trade_no=trim($_POST['trade_no']);
+ $result = \lib\Order::unfreeze($trade_no);
+ exit(json_encode($result));
+break;
+case 'notify': //获取回调地址
+ $trade_no=trim($_POST['trade_no']);
+ $row=$DB->getRow("select * from pre_order where trade_no='$trade_no' limit 1");
+ if(!$row)
+ exit('{"code":-1,"msg":"当前订单不存在!"}');
+ $url=creat_callback($row);
+ if($row['notify']>0)
+ $DB->exec("update pre_order set notify=0,notifytime=NULL where trade_no='$trade_no'");
+ exit('{"code":0,"url":"'.($_POST['isreturn']==1?$url['return']:$url['notify']).'"}');
+break;
+case 'fillorder': //手动补单
+ $trade_no=trim($_POST['trade_no']);
+ $row=$DB->getRow("SELECT A.*,B.name typename,B.showname typeshowname FROM pre_order A left join pre_type B on A.type=B.id WHERE trade_no=:trade_no limit 1", [':trade_no'=>$trade_no]);
+ if(!$row)
+ exit('{"code":-1,"msg":"当前订单不存在!"}');
+ if($row['status']>0)exit('{"code":-1,"msg":"当前订单不是未完成状态!"}');
+ if($DB->exec("update `pre_order` set `status` ='1' where `trade_no`='$trade_no'")){
+ $DB->exec("update `pre_order` set `endtime` ='$date',`date` =NOW() where `trade_no`='$trade_no'");
+ $channel=\lib\Channel::get($row['channel']);
+ processOrder($row);
+ }
+ exit('{"code":0,"msg":"补单成功"}');
+break;
+case 'alipaydSettle': //支付宝直付通确认结算
+ $trade_no=trim($_POST['trade_no']);
+ $row=$DB->getRow("select * from pre_order where trade_no='$trade_no' limit 1");
+ if(!$row)
+ exit('{"code":-1,"msg":"当前订单不存在!"}');
+ if($row['status']==0)exit('{"code":-1,"msg":"当前订单状态是未支付"}');
+ $channel = $row['subchannel'] > 0 ? \lib\Channel::getSub($row['subchannel']) : \lib\Channel::get($row['channel'], $DB->findColumn('user', 'channelinfo', ['uid'=>$row['uid']]));
+ if(!$channel){
+ exit('{"code":-1,"msg":"当前支付通道信息不存在"}');
+ }
+ try{
+ if($channel['plugin'] == 'alipayd'){
+ \lib\Payment::alipaydSettle($channel, $row);
+ }elseif($channel['plugin'] == 'wxpaynp'){
+ \lib\Payment::wxpaynpSettle($channel, $row);
+ }else{
+ exit('{"code":-1,"msg":"支付插件不支持该操作"}');
+ }
+ $DB->exec("update `pre_order` set `settle`=2 where `trade_no`='$trade_no'");
+ exit('{"code":0,"msg":"结算成功!"}');
+ }catch(Exception $e){
+ $DB->exec("update `pre_order` set `settle`=3 where `trade_no`='$trade_no'");
+ exit('{"code":-1,"msg":"结算失败,'.$e->getMessage().'"}');
+ }
+break;
+case 'alipayPreAuthPay': //支付宝授权资金支付
+ $trade_no=trim($_POST['trade_no']);
+ $order=$DB->getRow("select * from pre_order where trade_no='$trade_no' limit 1");
+ if(!$order)
+ exit('{"code":-1,"msg":"当前订单不存在!"}');
+ $channel = $order['subchannel'] > 0 ? \lib\Channel::getSub($order['subchannel']) : \lib\Channel::get($order['channel'], $DB->findColumn('user', 'channelinfo', ['uid'=>$row['uid']]));
+ if(!$channel){
+ exit('{"code":-1,"msg":"当前支付通道信息不存在"}');
+ }
+ try{
+ $result = \lib\Payment::alipayPreAuthPay($channel, $order);
+
+ $api_trade_no = $result['trade_no'];
+ $buyer_id = $result['buyer_user_id'];
+ $total_amount = $result['total_amount'];
+ processNotify($order, $api_trade_no, $buyer_id);
+
+ exit('{"code":0,"msg":"授权资金支付成功!"}');
+ }catch(Exception $e){
+ $errmsg = $e->getMessage();
+ exit('{"code":-1,"msg":"授权资金支付失败,'.$errmsg.'"}');
+ }
+break;
+case 'alipayUnfreeze': //支付宝授权资金解冻
+ $trade_no=trim($_POST['trade_no']);
+ $order=$DB->getRow("select * from pre_order where trade_no='$trade_no' limit 1");
+ if(!$order)
+ exit('{"code":-1,"msg":"当前订单不存在!"}');
+ $channel = $order['subchannel'] > 0 ? \lib\Channel::getSub($order['subchannel']) : \lib\Channel::get($order['channel'], $DB->findColumn('user', 'channelinfo', ['uid'=>$row['uid']]));
+ if(!$channel){
+ exit('{"code":-1,"msg":"当前支付通道信息不存在"}');
+ }
+ try{
+ \lib\Payment::alipayUnfreeze($channel, $order);
+ $DB->exec("update `pre_order` set `status`=0 where `trade_no`='$trade_no'");
+ exit('{"code":0,"msg":"授权资金解冻成功!"}');
+ }catch(Exception $e){
+ $errmsg = $e->getMessage();
+ exit('{"code":-1,"msg":"授权资金解冻失败,'.$errmsg.'"}');
+ }
+break;
+case 'alipayRedPacketTansfer': //支付宝红包转账重试
+ $trade_no=trim($_POST['trade_no']);
+ $order=$DB->getRow("select * from pre_order where trade_no='$trade_no' limit 1");
+ if(!$order)
+ exit('{"code":-1,"msg":"当前订单不存在!"}');
+ $channel = $order['subchannel'] > 0 ? \lib\Channel::getSub($order['subchannel']) : \lib\Channel::get($order['channel'], $DB->findColumn('user', 'channelinfo', ['uid'=>$row['uid']]));
+ if(!$channel){
+ exit('{"code":-1,"msg":"当前支付通道信息不存在"}');
+ }
+ if(!empty($channel['appmchid'])) $payee_user_id = $channel['appmchid'];
+ else $payee_user_id = $DB->findColumn('user', 'alipay_uid', ['uid'=>$order['uid']]);
+ if(!$payee_user_id) exit('{"code":-1,"msg":"当前商户未绑定支付宝账号"}');
+ try{
+ \lib\Payment::alipayRedPacketTransfer($channel, $payee_user_id, $order['money'], $order['api_trade_no']);
+ $DB->exec("update `pre_order` set `settle`=2 where `trade_no`='$trade_no'");
+ exit('{"code":0,"msg":"红包打款成功!"}');
+ }catch(Exception $e){
+ $errmsg = $e->getMessage();
+ exit('{"code":-1,"msg":"红包打款失败,'.$errmsg.'"}');
+ }
+break;
+default:
+ exit('{"code":-4,"msg":"No Act"}');
+break;
+}
\ No newline at end of file
diff --git a/admin/ajax_pay.php b/admin/ajax_pay.php
new file mode 100644
index 0000000..546efcd
--- /dev/null
+++ b/admin/ajax_pay.php
@@ -0,0 +1,720 @@
+window.location.href='./login.php';");
+$act=isset($_GET['act'])?daddslashes($_GET['act']):null;
+
+if(!checkRefererHost())exit('{"code":403}');
+
+@header('Content-Type: application/json; charset=UTF-8');
+
+switch($act){
+case 'channelList':
+ $sql=" 1=1";
+ if(isset($_POST['id']) && !empty($_POST['id'])) {
+ $id = intval($_POST['id']);
+ $sql.=" AND A.`id`='$id'";
+ }
+ if(isset($_POST['type']) && !empty($_POST['type'])) {
+ $type = intval($_POST['type']);
+ $sql.=" AND A.`type`='$type'";
+ }
+ if(isset($_POST['plugin']) && !empty($_POST['plugin'])) {
+ $plugin = trim($_POST['plugin']);
+ $sql.=" AND A.`plugin`='$plugin'";
+ }
+ if(isset($_POST['dstatus']) && $_POST['dstatus']>-1) {
+ $dstatus = intval($_POST['dstatus']);
+ $sql.=" AND A.`status`={$dstatus}";
+ }
+ if(isset($_POST['kw']) && !empty($_POST['kw'])) {
+ $kw = trim(daddslashes($_POST['kw']));
+ $sql.=" AND (A.`id`='{$kw}' OR A.`name` like '%{$kw}%')";
+ }
+ $list = $DB->getAll("SELECT A.*,B.name typename,B.showname typeshowname FROM pre_channel A LEFT JOIN pre_type B ON A.type=B.id WHERE{$sql} ORDER BY id DESC");
+ exit(json_encode($list));
+break;
+
+case 'getPayType':
+ $id=intval($_GET['id']);
+ $row=$DB->getRow("select * from pre_type where id='$id' limit 1");
+ if(!$row)
+ exit('{"code":-1,"msg":"当前支付方式不存在!"}');
+ $result = ['code'=>0,'msg'=>'succ','data'=>$row];
+ exit(json_encode($result));
+break;
+case 'setPayType':
+ $id=intval($_GET['id']);
+ $status=intval($_GET['status']);
+ $row=$DB->getRow("select * from pre_type where id='$id' limit 1");
+ if(!$row)
+ exit('{"code":-1,"msg":"当前支付方式不存在!"}');
+ $sql = "UPDATE pre_type SET status='$status' WHERE id='$id'";
+ if($DB->exec($sql))exit('{"code":0,"msg":"修改支付方式成功!"}');
+ else exit('{"code":-1,"msg":"修改支付方式失败['.$DB->error().']"}');
+break;
+case 'delPayType':
+ $id=intval($_GET['id']);
+ $row=$DB->getRow("select * from pre_type where id='$id' limit 1");
+ if(!$row)
+ exit('{"code":-1,"msg":"当前支付方式不存在!"}');
+ $row=$DB->getRow("select * from pre_channel where type='$id' limit 1");
+ if($row)
+ exit('{"code":-1,"msg":"删除失败,存在使用该支付方式的支付通道"}');
+ $sql = "DELETE FROM pre_type WHERE id='$id'";
+ if($DB->exec($sql))exit('{"code":0,"msg":"删除支付方式成功!"}');
+ else exit('{"code":-1,"msg":"删除支付方式失败['.$DB->error().']"}');
+break;
+case 'savePayType':
+ if($_POST['action'] == 'add'){
+ $name=trim($_POST['name']);
+ $showname=trim($_POST['showname']);
+ $device=intval($_POST['device']);
+ if(!preg_match('/^[a-zA-Z0-9]+$/',$name)){
+ exit('{"code":-1,"msg":"调用值不符合规则"}');
+ }
+ $row=$DB->getRow("select * from pre_type where name='$name' and device='$device' limit 1");
+ if($row)
+ exit('{"code":-1,"msg":"同一个调用值+支持设备不能重复"}');
+ $data = ['name'=>$name, 'showname'=>$showname, 'device'=>$device, 'status'=>1];
+ if($DB->insert('type', $data))exit('{"code":0,"msg":"新增支付方式成功!"}');
+ else exit('{"code":-1,"msg":"新增支付方式失败['.$DB->error().']"}');
+ }else{
+ $id=intval($_POST['id']);
+ $name=trim($_POST['name']);
+ $showname=trim($_POST['showname']);
+ $device=intval($_POST['device']);
+ if(!preg_match('/^[a-zA-Z0-9]+$/',$name)){
+ exit('{"code":-1,"msg":"调用值不符合规则"}');
+ }
+ $row=$DB->getRow("select * from pre_type where name='$name' and device='$device' and id<>$id limit 1");
+ if($row)
+ exit('{"code":-1,"msg":"同一个调用值+支持设备不能重复"}');
+ $data = ['name'=>$name, 'showname'=>$showname, 'device'=>$device];
+ if($DB->update('type', $data, ['id'=>$id])!==false)exit('{"code":0,"msg":"修改支付方式成功!"}');
+ else exit('{"code":-1,"msg":"修改支付方式失败['.$DB->error().']"}');
+ }
+break;
+case 'getPlugin':
+ $name = trim($_GET['name']);
+ $row=$DB->getRow("SELECT * FROM pre_plugin WHERE name='$name'");
+ if($row){
+ $result = ['code'=>0,'msg'=>'succ','data'=>$row];
+ exit(json_encode($result));
+ }
+ else exit('{"code":-1,"msg":"当前支付插件不存在!"}');
+break;
+case 'getPlugins':
+ $typeid = intval($_GET['typeid']);
+ $type=$DB->getColumn("SELECT name FROM pre_type WHERE id='$typeid'");
+ if(!$type)
+ exit('{"code":-1,"msg":"当前支付方式不存在!"}');
+ $list=$DB->getAll("SELECT name,showname FROM pre_plugin WHERE types LIKE '%$type%' ORDER BY name ASC");
+ if($list){
+ $result = ['code'=>0,'msg'=>'succ','data'=>$list];
+ exit(json_encode($result));
+ }
+ else exit('{"code":-1,"msg":"没有找到支持该支付方式的插件"}');
+break;
+case 'getChannel':
+ $id=intval($_GET['id']);
+ $row=$DB->getRow("SELECT * FROM pre_channel WHERE id='$id'");
+ if(!$row)
+ exit('{"code":-1,"msg":"当前支付通道不存在!"}');
+ $result = ['code'=>0,'msg'=>'succ','data'=>$row];
+ exit(json_encode($result));
+break;
+case 'getChannels':
+ $typeid = intval($_GET['typeid']);
+ $type=$DB->getColumn("SELECT name FROM pre_type WHERE id='$typeid'");
+ if(!$type)
+ exit('{"code":-1,"msg":"当前支付方式不存在!"}');
+ $list=$DB->getAll("SELECT id,name FROM pre_channel WHERE type='$typeid' and status=1 ORDER BY id ASC");
+ if($list){
+ $result = ['code'=>0,'msg'=>'succ','data'=>$list];
+ exit(json_encode($result));
+ }
+ else exit('{"code":-1,"msg":"没有找到支持该支付方式的通道"}');
+break;
+case 'getChannelsByPlugin':
+ $plugin = $_GET['plugin'];
+ if($plugin){
+ $list=$DB->getAll("SELECT id,name FROM pre_channel WHERE plugin='$plugin' ORDER BY id ASC");
+ }else{
+ $list=$DB->getAll("SELECT id,name FROM pre_channel ORDER BY id ASC");
+ }
+ if($list){
+ $result = ['code'=>0,'msg'=>'succ','data'=>$list];
+ exit(json_encode($result));
+ }
+ else exit('{"code":-1,"msg":"没有找到支持该支付插件的通道"}');
+break;
+case 'getSubChannels':
+ $channel = intval($_GET['channel']);
+ $uid = intval($_GET['uid']);
+ $sql = " channel='$channel'";
+ if($uid > 0) $sql .= " AND uid='$uid'";
+ $list=$DB->getAll("SELECT id,name,channel,apply_id FROM pre_subchannel WHERE{$sql} ORDER BY id ASC");
+ $result = ['code'=>0,'msg'=>'succ','data'=>$list];
+ exit(json_encode($result));
+break;
+case 'setChannel':
+ $id=intval($_GET['id']);
+ $status=intval($_GET['status']);
+ $row=$DB->getRow("SELECT * FROM pre_channel WHERE id='$id'");
+ if(!$row)
+ exit('{"code":-1,"msg":"当前支付通道不存在!"}');
+ if($status==1 && empty($row['config'])){
+ exit('{"code":-1,"msg":"请先配置好密钥后再开启"}');
+ }
+ $sql = "UPDATE pre_channel SET status='$status' WHERE id='$id'";
+ if($DB->exec($sql))exit('{"code":0,"msg":"修改支付通道成功!"}');
+ else exit('{"code":-1,"msg":"修改支付通道失败['.$DB->error().']"}');
+break;
+case 'delChannel':
+ $id=intval($_GET['id']);
+ $row=$DB->getRow("SELECT * FROM pre_channel WHERE id='$id'");
+ if(!$row)
+ exit('{"code":-1,"msg":"当前支付通道不存在!"}');
+ if($DB->find('psreceiver', '*', ['channel'=>$id])){
+ exit('{"code":-1,"msg":"当前支付通道下有分账规则,需要先删除"}');
+ }
+ if($DB->find('applychannel', '*', ['channel'=>$id])){
+ exit('{"code":-1,"msg":"当前支付通道关联了进件渠道,无法删除"}');
+ }
+ $sql = "DELETE FROM pre_channel WHERE id='$id'";
+ if($DB->exec($sql)){
+ $DB->exec("DELETE FROM pre_subchannel WHERE channel='$id'");
+ exit('{"code":0,"msg":"删除支付通道成功!"}');
+ }
+ else exit('{"code":-1,"msg":"删除支付通道失败['.$DB->error().']"}');
+break;
+case 'saveChannel':
+ if($_POST['action'] == 'add'){
+ $name=trim($_POST['name']);
+ $rate=trim($_POST['rate']);
+ $costrate=trim($_POST['costrate']);
+ $type=intval($_POST['type']);
+ $plugin=trim($_POST['plugin']);
+ $daytop=intval($_POST['daytop']);
+ $mode=intval($_POST['mode']);
+ $paymin=trim($_POST['paymin']);
+ $paymax=trim($_POST['paymax']);
+ if(!preg_match('/^[0-9.]+$/',$rate)){
+ exit('{"code":-1,"msg":"分成比例不符合规则"}');
+ }
+ if(!empty($costrate) && !preg_match('/^[0-9.]+$/',$costrate)){
+ exit('{"code":-1,"msg":"通道成本不符合规则"}');
+ }
+ if($paymin && !preg_match('/^[0-9.]+$/',$paymin)){
+ exit('{"code":-1,"msg":"最小支付金额不符合规则"}');
+ }
+ if($paymax && !preg_match('/^[0-9.]+$/',$paymax)){
+ exit('{"code":-1,"msg":"最大支付金额不符合规则"}');
+ }
+ $row=$DB->getRow("SELECT * FROM pre_channel WHERE name='$name' LIMIT 1");
+ if($row)
+ exit('{"code":-1,"msg":"支付通道名称重复"}');
+ $data = ['name'=>$name, 'rate'=>$rate, 'costrate'=>$costrate, 'mode'=>$mode, 'type'=>$type, 'plugin'=>$plugin, 'daytop'=>$daytop, 'paymin'=>$paymin, 'paymax'=>$paymax];
+ if($DB->insert('channel', $data))exit('{"code":0,"msg":"新增支付通道成功!"}');
+ else exit('{"code":-1,"msg":"新增支付通道失败['.$DB->error().']"}');
+ }elseif($_POST['action'] == 'copy'){
+ $id=intval($_POST['id']);
+ $row=$DB->getRow("SELECT * FROM pre_channel WHERE id='$id'");
+ if(!$row) exit('{"code":-1,"msg":"当前支付通道不存在!"}');
+ $name=trim($_POST['name']);
+ $rate=trim($_POST['rate']);
+ $costrate=trim($_POST['costrate']);
+ $type=intval($_POST['type']);
+ $plugin=trim($_POST['plugin']);
+ $daytop=intval($_POST['daytop']);
+ $mode=intval($_POST['mode']);
+ $paymin=trim($_POST['paymin']);
+ $paymax=trim($_POST['paymax']);
+ if(!preg_match('/^[0-9.]+$/',$rate)){
+ exit('{"code":-1,"msg":"分成比例不符合规则"}');
+ }
+ if(!empty($costrate) && !preg_match('/^[0-9.]+$/',$costrate)){
+ exit('{"code":-1,"msg":"通道成本不符合规则"}');
+ }
+ if($paymin && !preg_match('/^[0-9.]+$/',$paymin)){
+ exit('{"code":-1,"msg":"最小支付金额不符合规则"}');
+ }
+ if($paymax && !preg_match('/^[0-9.]+$/',$paymax)){
+ exit('{"code":-1,"msg":"最大支付金额不符合规则"}');
+ }
+ $nrow=$DB->getRow("SELECT * FROM pre_channel WHERE name='$name' LIMIT 1");
+ if($nrow)
+ exit('{"code":-1,"msg":"支付通道名称重复"}');
+ $data = ['name'=>$name, 'rate'=>$rate, 'costrate'=>$costrate, 'mode'=>$mode, 'type'=>$type, 'plugin'=>$plugin, 'daytop'=>$daytop, 'paymin'=>$paymin, 'paymax'=>$paymax, 'config'=>$row['config'], 'apptype'=>$row['apptype'], 'appwxmp'=>$row['appwxmp'], 'appwxa'=>$row['appwxa']];
+ if($DB->insert('channel', $data))exit('{"code":0,"msg":"复制支付通道成功!"}');
+ else exit('{"code":-1,"msg":"复制支付通道失败['.$DB->error().']"}');
+ }elseif($_POST['action'] == 'edit'){
+ $id=intval($_POST['id']);
+ $row=$DB->getRow("SELECT * FROM pre_channel WHERE id='$id'");
+ if(!$row) exit('{"code":-1,"msg":"当前支付通道不存在!"}');
+ $name=trim($_POST['name']);
+ $rate=trim($_POST['rate']);
+ $costrate=trim($_POST['costrate']);
+ $type=intval($_POST['type']);
+ $plugin=trim($_POST['plugin']);
+ $daytop=intval($_POST['daytop']);
+ $mode=intval($_POST['mode']);
+ $paymin=trim($_POST['paymin']);
+ $paymax=trim($_POST['paymax']);
+ if(!preg_match('/^[0-9.]+$/',$rate)){
+ exit('{"code":-1,"msg":"分成比例不符合规则"}');
+ }
+ if(!empty($costrate) && !preg_match('/^[0-9.]+$/',$costrate)){
+ exit('{"code":-1,"msg":"通道成本不符合规则"}');
+ }
+ if($paymin && !preg_match('/^[0-9.]+$/',$paymin)){
+ exit('{"code":-1,"msg":"最小支付金额不符合规则"}');
+ }
+ if($paymax && !preg_match('/^[0-9.]+$/',$paymax)){
+ exit('{"code":-1,"msg":"最大支付金额不符合规则"}');
+ }
+ $nrow=$DB->getRow("SELECT * FROM pre_channel WHERE name='$name' AND id<>$id LIMIT 1");
+ if($nrow)
+ exit('{"code":-1,"msg":"支付通道名称重复"}');
+ $data = ['name'=>$name, 'rate'=>$rate, 'costrate'=>$costrate, 'mode'=>$mode, 'type'=>$type, 'plugin'=>$plugin, 'daytop'=>$daytop, 'paymin'=>$paymin, 'paymax'=>$paymax];
+ if($DB->update('channel', $data, ['id'=>$id])!==false){
+ if($row['daystatus']==1 && ($daytop==0 || $daytop>$row['daytop'])){
+ $DB->exec("UPDATE pre_channel SET daystatus=0 WHERE id='$id'");
+ }
+ exit('{"code":0,"msg":"修改支付通道成功!"}');
+ }else exit('{"code":-1,"msg":"修改支付通道失败['.$DB->error().']"}');
+ }
+break;
+case 'channelInfo':
+ $id=intval($_GET['id']);
+ $row=$DB->getRow("SELECT * FROM pre_channel WHERE id='$id'");
+ if(!$row)
+ exit('{"code":-1,"msg":"当前支付通道不存在!"}');
+ $typename = $DB->getColumn("SELECT name FROM pre_type WHERE id='{$row['type']}'");
+ //if($row['mode']>0){
+ // exit('{"code":-1,"msg":"当前通道为商户直清模式,请进入用户列表-编辑-接口密钥进行配置"}');
+ //}
+ $apptype = explode(',',$row['apptype']);
+ $plugin = \lib\Plugin::getConfig($row['plugin']);
+ if(!$plugin)
+ exit('{"code":-1,"msg":"当前支付插件不存在!"}');
+
+ $data = '
';
+ $result=array("code"=>0,"msg"=>"succ","data"=>$data);
+ exit(json_encode($result));
+break;
+case 'saveChannelInfo':
+ $id=intval($_GET['id']);
+ $config=isset($_POST['config'])?$_POST['config']:null;
+ $appwxmp=isset($_POST['appwxmp'])?intval($_POST['appwxmp']):null;
+ $appwxa=isset($_POST['appwxa'])?intval($_POST['appwxa']):null;
+ if(isset($_POST['isapptype'])){
+ if(!isset($_POST['apptype']) || count($_POST['apptype'])<=0)exit('{"code":-1,"msg":"请至少选择一个可用的支付接口"}');
+ $apptype=implode(',',$_POST['apptype']);
+ }else{
+ $apptype=null;
+ }
+ if(empty($config)) exit('{"code":-1,"msg":"填写的内容不能为空"}');
+ $config = json_encode($config);
+ $data = ['config'=>$config, 'apptype'=>$apptype, 'appwxmp'=>$appwxmp, 'appwxa'=>$appwxa];
+ if($DB->update('channel', $data, ['id'=>$id])!==false)exit('{"code":0,"msg":"修改支付密钥成功!"}');
+ else exit('{"code":-1,"msg":"修改支付密钥失败['.$DB->error().']"}');
+break;
+case 'getRoll':
+ $id=intval($_GET['id']);
+ $row=$DB->getRow("select * from pre_roll where id='$id' limit 1");
+ if(!$row)
+ exit('{"code":-1,"msg":"当前轮询组不存在!"}');
+ $result = ['code'=>0,'msg'=>'succ','data'=>$row];
+ exit(json_encode($result));
+break;
+case 'setRoll':
+ $id=intval($_GET['id']);
+ $status=intval($_GET['status']);
+ $row=$DB->getRow("select * from pre_roll where id='$id' limit 1");
+ if(!$row)
+ exit('{"code":-1,"msg":"当前轮询组不存在!"}');
+ if($status==1 && empty($row['info'])){
+ exit('{"code":-1,"msg":"请先配置好支付通道后再开启"}');
+ }
+ $sql = "UPDATE pre_roll SET status='$status' WHERE id='$id'";
+ if($DB->exec($sql))exit('{"code":0,"msg":"修改轮询组成功!"}');
+ else exit('{"code":-1,"msg":"修改轮询组失败['.$DB->error().']"}');
+break;
+case 'delRoll':
+ $id=intval($_GET['id']);
+ $row=$DB->getRow("select * from pre_roll where id='$id' limit 1");
+ if(!$row)
+ exit('{"code":-1,"msg":"当前轮询组不存在!"}');
+ $sql = "DELETE FROM pre_roll WHERE id='$id'";
+ if($DB->exec($sql))exit('{"code":0,"msg":"删除轮询组成功!"}');
+ else exit('{"code":-1,"msg":"删除轮询组失败['.$DB->error().']"}');
+break;
+case 'saveRoll':
+ if($_POST['action'] == 'add'){
+ $name=trim($_POST['name']);
+ $type=intval($_POST['type']);
+ $kind=intval($_POST['kind']);
+ $row=$DB->getRow("select * from pre_roll where name='$name' limit 1");
+ if($row)
+ exit('{"code":-1,"msg":"轮询组名称重复"}');
+ $sql = "INSERT INTO pre_roll (name, type, kind) VALUES ('{$name}', {$type}, {$kind})";
+ if($DB->exec($sql))exit('{"code":0,"msg":"新增轮询组成功!"}');
+ else exit('{"code":-1,"msg":"新增轮询组失败['.$DB->error().']"}');
+ }else{
+ $id=intval($_POST['id']);
+ $name=trim($_POST['name']);
+ $type=intval($_POST['type']);
+ $kind=intval($_POST['kind']);
+ $row=$DB->getRow("select * from pre_roll where name='$name' and id<>$id limit 1");
+ if($row)
+ exit('{"code":-1,"msg":"轮询组名称重复"}');
+ $sql = "UPDATE pre_roll SET name='{$name}',type='{$type}',kind='{$kind}' WHERE id='$id'";
+ if($DB->exec($sql)!==false)exit('{"code":0,"msg":"修改轮询组成功!"}');
+ else exit('{"code":-1,"msg":"修改轮询组失败['.$DB->error().']"}');
+ }
+break;
+case 'rollInfo':
+ $id=intval($_GET['id']);
+ $row=$DB->getRow("select * from pre_roll where id='$id' limit 1");
+ if(!$row)
+ exit('{"code":-1,"msg":"当前轮询组不存在!"}');
+ $list=$DB->getAll("select id,name from pre_channel where type='{$row['type']}' and status=1 ORDER BY id ASC");
+ if(!$list)exit('{"code":-1,"msg":"没有找到支持该支付方式的通道"}');
+ if(!empty($row['info'])){
+ $arr = explode(',',$row['info']);
+ $info = [];
+ foreach($arr as $item){
+ $a = explode(':',$item);
+ $info[] = ['channel'=>$a[0], 'weight'=>$a[1]?$a[1]:1];
+ }
+ }else{
+ $info = null;
+ }
+ $result=array("code"=>0,"msg"=>"succ","channels"=>$list,"info"=>$info);
+ exit(json_encode($result));
+break;
+case 'saveRollInfo':
+ $id=intval($_GET['id']);
+ $row=$DB->getRow("select * from pre_roll where id='$id' limit 1");
+ if(!$row)
+ exit('{"code":-1,"msg":"当前轮询组不存在!"}');
+ $list=$_POST['list'];
+ if(empty($list))
+ exit('{"code":-1,"msg":"通道配置不能为空!"}');
+ $info = '';
+ foreach($list as $a){
+ $info .= $row['kind']==1 ? $a['channel'].':'.$a['weight'].',' : $a['channel'].',';
+ }
+ $info = trim($info,',');
+ if(empty($info))
+ exit('{"code":-1,"msg":"通道配置不能为空!"}');
+ $sql = "UPDATE pre_roll SET info='{$info}' WHERE id='$id'";
+ if($DB->exec($sql)!==false)exit('{"code":0,"msg":"修改轮询组成功!"}');
+ else exit('{"code":-1,"msg":"修改轮询组失败['.$DB->error().']"}');
+break;
+
+case 'getChannelMoney': //统计支付通道金额
+ $type=intval($_GET['type']);
+ $channel=intval($_GET['channel']);
+ $today=$type==1 ? date("Y-m-d", strtotime("-1 day")) : date("Y-m-d");
+ $money=$DB->getColumn("SELECT SUM(realmoney) FROM pre_order WHERE date='$today' AND channel='$channel' AND status>0");
+ exit('{"code":0,"msg":"succ","money":"'.round($money,2).'"}');
+break;
+case 'getSubChannelMoney': //统计子通道金额
+ $type=intval($_GET['type']);
+ $channel=trim($_GET['channel']);
+ $today=$type==1 ? date("Y-m-d", strtotime("-1 day")) : date("Y-m-d");
+ $channel = explode('|', $channel);
+ $channel = array_map('intval', $channel);
+ $money=$DB->getColumn("SELECT SUM(realmoney) FROM pre_order WHERE date='$today' AND subchannel IN (".implode(",", $channel).") AND status>0");
+ exit('{"code":0,"msg":"succ","money":"'.round($money,2).'"}');
+break;
+case 'getTypeMoney': //统计支付方式金额
+ $type=intval($_GET['type']);
+ $typeid=intval($_GET['typeid']);
+ $today=$type==1 ? date("Y-m-d", strtotime("-1 day")) : date("Y-m-d");
+ $money=$DB->getColumn("SELECT SUM(realmoney) FROM pre_order WHERE date='$today' AND type='$typeid' AND status>0");
+ exit('{"code":0,"msg":"succ","money":"'.round($money,2).'"}');
+break;
+case 'getChannelRate':
+ $channel=intval($_GET['channel']);
+ $thtime = date("Y-m-d").' 00:00:00';
+ $all = 0;
+ $success = 0;
+ $orders=$DB->getAll("SELECT * FROM pre_order WHERE addtime>='$thtime' AND channel='$channel'");
+ foreach($orders as $order){
+ $all++;
+ if($order['status']>0)$success++;
+ }
+ $rate = $all > 0 ? round($success*100/$all, 2) : 0;
+ exit('{"code":0,"msg":"succ","rate":"'.$rate.'"}');
+break;
+case 'getSuccessRate':
+ $channel = intval($_GET['channel']);
+ $thtime = date("Y-m-d");
+ $orderrow=$DB->getRow("SELECT COUNT(*) allnum,COUNT(IF(status>0, 1, NULL)) sucnum FROM pre_order WHERE addtime>='$thtime' AND channel='$channel'");
+ $success_rate = $orderrow && $orderrow['allnum'] > 0 ? round($orderrow['sucnum']/$orderrow['allnum']*100,2) : 100;
+ exit('{"code":0,"msg":"succ","data":"' . $success_rate . '"}');
+break;
+
+case 'testpay':
+ $channel=intval($_POST['channel']);
+ $subchannel=intval($_POST['subchannel']);
+ $row=$DB->getRow("select * from pre_channel where id='$channel' limit 1");
+ if(!$row)
+ exit('{"code":-1,"msg":"当前支付通道不存在!"}');
+ if($subchannel > 0){
+ if(!$DB->getRow("select * from pre_subchannel where id='$subchannel' limit 1")) exit('{"code":-1,"msg":"当前子通道不存在!"}');
+ }
+ if(empty($row['config']))exit('{"code":-1,"msg":"请先配置好密钥"}');
+ if(!$conf['test_pay_uid'])exit('{"code":-1,"msg":"请先配置测试支付收款商户ID"}');
+ $money=trim(daddslashes($_POST['money']));
+ $name=trim(daddslashes($_POST['name']));
+ if($money<=0 || !is_numeric($money) || !preg_match('/^[0-9.]+$/', $money))exit('{"code":-1,"msg":"金额不合法"}');
+ if($conf['pay_maxmoney']>0 && $money>$conf['pay_maxmoney'])exit('{"code":-1,"msg":"最大支付金额是'.$conf['pay_maxmoney'].'元"}');
+ if($conf['pay_minmoney']>0 && $money<$conf['pay_minmoney'])exit('{"code":-1,"msg":"最小支付金额是'.$conf['pay_minmoney'].'元"}');
+ $trade_no=date("YmdHis").rand(11111,99999);
+ $return_url=$siteurl.'user/test.php?ok=1&trade_no='.$trade_no;
+ $domain=getdomain($return_url);
+ if(!$DB->exec("INSERT INTO `pre_order` (`trade_no`,`out_trade_no`,`uid`,`tid`,`addtime`,`name`,`money`,`type`,`channel`,`subchannel`,`realmoney`,`getmoney`,`notify_url`,`return_url`,`domain`,`ip`,`status`) VALUES (:trade_no, :out_trade_no, :uid, 3, NOW(), :name, :money, :type, :channel, :subchannel, :realmoney, :getmoney, :notify_url, :return_url, :domain, :clientip, 0)", [':trade_no'=>$trade_no, ':out_trade_no'=>$trade_no, ':uid'=>$conf['test_pay_uid'], ':name'=>$name, ':money'=>$money, ':type'=>$row['type'], ':channel'=>$channel, ':subchannel'=>$subchannel, ':realmoney'=>$money, ':getmoney'=>$money, ':notify_url'=>$return_url, ':return_url'=>$return_url, ':domain'=>$domain, ':clientip'=>$clientip]))exit('{"code":-1,"msg":"创建订单失败,请返回重试!"}');
+ $result = ['code'=>0, 'msg'=>'succ', 'url'=>'./testsubmit.php?trade_no='.$trade_no];
+ exit(json_encode($result));
+break;
+
+case 'getWeixin':
+ $id=intval($_GET['id']);
+ $row=$DB->getRow("select * from pre_weixin where id='$id' limit 1");
+ if(!$row)
+ exit('{"code":-1,"msg":"当前公众号/小程序不存在!"}');
+ $result = ['code'=>0,'msg'=>'succ','data'=>$row];
+ exit(json_encode($result));
+break;
+case 'delWeixin':
+ $id=intval($_GET['id']);
+ $row=$DB->getRow("select * from pre_weixin where id='$id' limit 1");
+ if(!$row)
+ exit('{"code":-1,"msg":"当前公众号/小程序不存在!"}');
+ $row=$DB->getRow("select * from pre_channel where appwxmp='$id' limit 1");
+ if($row)
+ exit('{"code":-1,"msg":"删除失败,存在使用该微信公众号的支付通道"}');
+ $row=$DB->getRow("select * from pre_channel where appwxa='$id' limit 1");
+ if($row)
+ exit('{"code":-1,"msg":"删除失败,存在使用该微信小程序的支付通道"}');
+ $sql = "DELETE FROM pre_weixin WHERE id='$id'";
+ if($DB->exec($sql)){
+ exit('{"code":0,"msg":"删除公众号/小程序成功!"}');
+ }else exit('{"code":-1,"msg":"删除公众号/小程序失败['.$DB->error().']"}');
+break;
+case 'saveWeixin':
+ if($_POST['action'] == 'add'){
+ $type=intval($_POST['type']);
+ $name=trim($_POST['name']);
+ $appid=trim($_POST['appid']);
+ $appsecret=trim($_POST['appsecret']);
+ $row=$DB->getRow("select * from pre_weixin where name='$name' limit 1");
+ if($row)
+ exit('{"code":-1,"msg":"名称重复"}');
+ $row=$DB->getRow("select * from pre_weixin where appid='$appid' limit 1");
+ if($row)
+ exit('{"code":-1,"msg":"APPID重复"}');
+ if($DB->insert('weixin', ['type'=>$type, 'name'=>$name, 'appid'=>$appid, 'appsecret'=>$appsecret, 'status'=>1, 'addtime'=>'NOW()']))exit('{"code":0,"msg":"新增公众号/小程序成功!"}');
+ else exit('{"code":-1,"msg":"新增公众号/小程序失败['.$DB->error().']"}');
+ }else{
+ $id=intval($_POST['id']);
+ $type=intval($_POST['type']);
+ $name=trim($_POST['name']);
+ $appid=trim($_POST['appid']);
+ $appsecret=trim($_POST['appsecret']);
+ $row=$DB->getRow("select * from pre_weixin where name='$name' and id<>$id limit 1");
+ if($row)
+ exit('{"code":-1,"msg":"名称重复"}');
+ $row=$DB->getRow("select * from pre_weixin where appid='$appid' and id<>$id limit 1");
+ if($row)
+ exit('{"code":-1,"msg":"APPID重复"}');
+ if($DB->update('weixin', ['type'=>$type, 'name'=>$name, 'appid'=>$appid, 'appsecret'=>$appsecret], ['id'=>$id])!==false)exit('{"code":0,"msg":"修改公众号/小程序成功!"}');
+ else exit('{"code":-1,"msg":"修改公众号/小程序失败['.$DB->error().']"}');
+ }
+break;
+case 'testweixin':
+ $id=intval($_POST['id']);
+ $row=$DB->getRow("select * from pre_weixin where id='$id' limit 1");
+ if(!$row)
+ exit('{"code":-1,"msg":"当前公众号/小程序不存在!"}');
+ try{
+ $wechat = new \lib\wechat\WechatAPI($id);
+ $access_token = $wechat->getAccessToken(true);
+ }catch(Exception $e){
+ exit('{"code":-1,"msg":"'.$e->getMessage().'"}');
+ }
+ exit('{"code":0,"msg":"接口连接测试成功!"}');
+break;
+
+case 'getWework':
+ $id=intval($_GET['id']);
+ $row=$DB->getRow("select * from pre_wework where id='$id' limit 1");
+ if(!$row)
+ exit('{"code":-1,"msg":"当前企业微信不存在!"}');
+ $result = ['code'=>0,'msg'=>'succ','data'=>$row];
+ exit(json_encode($result));
+break;
+case 'setWework':
+ $id=intval($_GET['id']);
+ $status=intval($_GET['status']);
+ $row=$DB->getRow("select * from pre_wework where id='$id' limit 1");
+ if(!$row)
+ exit('{"code":-1,"msg":"当前企业微信不存在!"}');
+ $sql = "UPDATE pre_wework SET status='$status' WHERE id='$id'";
+ if($DB->exec($sql))exit('{"code":0,"msg":"修改企业微信成功!"}');
+ else exit('{"code":-1,"msg":"修改企业微信失败['.$DB->error().']"}');
+break;
+case 'delWework':
+ $id=intval($_GET['id']);
+ $row=$DB->getRow("select * from pre_wework where id='$id' limit 1");
+ if(!$row)
+ exit('{"code":-1,"msg":"当前企业微信不存在!"}');
+ if($DB->delete('wework', ['id'=>$id])){
+ $DB->delete('wxkfaccount', ['wid'=>$id]);
+ exit('{"code":0,"msg":"删除企业微信成功!"}');
+ }else exit('{"code":-1,"msg":"删除企业微信失败['.$DB->error().']"}');
+break;
+case 'saveWework':
+ if($_POST['action'] == 'add'){
+ $name=trim($_POST['name']);
+ $appid=trim($_POST['appid']);
+ $appsecret=trim($_POST['appsecret']);
+ $row=$DB->getRow("select * from pre_wework where name='$name' limit 1");
+ if($row)
+ exit('{"code":-1,"msg":"名称重复"}');
+ $row=$DB->getRow("select * from pre_wework where appid='$appid' limit 1");
+ if($row)
+ exit('{"code":-1,"msg":"企业ID重复"}');
+ if($DB->insert('wework', ['name'=>$name, 'appid'=>$appid, 'appsecret'=>$appsecret, 'status'=>1, 'addtime'=>'NOW()']))exit('{"code":0,"msg":"新增企业微信成功!请点击刷新客服账号数量"}');
+ else exit('{"code":-1,"msg":"新增企业微信失败['.$DB->error().']"}');
+ }else{
+ $id=intval($_POST['id']);
+ $name=trim($_POST['name']);
+ $appid=trim($_POST['appid']);
+ $appsecret=trim($_POST['appsecret']);
+ $row=$DB->getRow("select * from pre_wework where name='$name' and id<>$id limit 1");
+ if($row)
+ exit('{"code":-1,"msg":"名称重复"}');
+ $row=$DB->getRow("select * from pre_wework where appid='$appid' and id<>$id limit 1");
+ if($row)
+ exit('{"code":-1,"msg":"企业ID重复"}');
+ if($DB->update('wework', ['name'=>$name, 'appid'=>$appid, 'appsecret'=>$appsecret], ['id'=>$id])!==false)exit('{"code":0,"msg":"修改企业微信成功!"}');
+ else exit('{"code":-1,"msg":"修改企业微信失败['.$DB->error().']"}');
+ }
+break;
+case 'refreshWework':
+ $id=intval($_POST['id']);
+ $row=$DB->getRow("select * from pre_wework where id='$id' limit 1");
+ if(!$row)
+ exit('{"code":-1,"msg":"当前企业微信不存在!"}');
+ $wework = new \lib\wechat\WeWorkAPI($id);
+ try{
+ $account_list = $wework->getKFList();
+ if(count($account_list) == 0){
+ exit('{"code":-1,"msg":"没有添加客服账号"}');
+ }
+ $account_data = $DB->findAll('wxkfaccount', 'id,openkfid', ['wid'=>$id]);
+ foreach($account_list as $account){
+ $isExsist = false;
+ foreach($account_data as $find){
+ if($find['openkfid'] == $account['open_kfid']){
+ $isExsist = true;break;
+ }
+ }
+ if(!$isExsist){
+ $DB->insert('wxkfaccount', ['wid'=>$id, 'openkfid'=>$account['open_kfid'], 'name'=>$account['name'], 'addtime'=>'NOW()']);
+ }
+ }
+ foreach($account_data as $account){
+ $isExsist = false;
+ foreach($account_list as $find){
+ if($find['open_kfid'] == $account['openkfid']){
+ $isExsist = true;break;
+ }
+ }
+ if(!$isExsist){
+ $DB->delete('wxkfaccount', ['id'=>$account['id']]);
+ }
+ }
+ exit(json_encode(['code'=>0, 'msg'=>'成功获取到'.count($account_list).'个客服账号']));
+ }catch(Exception $e){
+ exit('{"code":-1,"msg":"'.$e->getMessage().'"}');
+ }
+break;
+case 'testWework':
+ $id=intval($_POST['id']);
+ $row=$DB->getRow("select * from pre_wework where id='$id' limit 1");
+ if(!$row)
+ exit('{"code":-1,"msg":"当前企业微信不存在!"}');
+ $wework = new \lib\wechat\WeWorkAPI($id);
+ try{
+ $access_token = $wework->getAccessToken(true);
+ }catch(Exception $e){
+ exit('{"code":-1,"msg":"'.$e->getMessage().'"}');
+ }
+ exit('{"code":0,"msg":"接口连接测试成功!"}');
+break;
+
+default:
+ exit('{"code":-4,"msg":"No Act"}');
+break;
+}
\ No newline at end of file
diff --git a/admin/ajax_profitsharing.php b/admin/ajax_profitsharing.php
new file mode 100644
index 0000000..25ce665
--- /dev/null
+++ b/admin/ajax_profitsharing.php
@@ -0,0 +1,306 @@
+window.location.href='./login.php';");
+$act=isset($_GET['act'])?daddslashes($_GET['act']):null;
+
+if(!checkRefererHost())exit('{"code":403}');
+
+@header('Content-Type: application/json; charset=UTF-8');
+
+switch($act){
+
+case 'orderList':
+ $sql=" 1=1";
+ if(isset($_POST['rid']) && !empty($_POST['rid'])) {
+ $rid = intval($_POST['rid']);
+ $sql.=" AND A.`rid`='$rid'";
+ }
+ if(isset($_POST['dstatus']) && $_POST['dstatus']>-1) {
+ $dstatus = intval($_POST['dstatus']);
+ $sql.=" AND A.`status`={$dstatus}";
+ }
+ if(!empty($_POST['starttime']) || !empty($_POST['endtime'])){
+ if(!empty($_POST['starttime'])){
+ $starttime = daddslashes($_POST['starttime']);
+ $sql.=" AND A.addtime>='{$starttime} 00:00:00'";
+ }
+ if(!empty($_POST['endtime'])){
+ $endtime = daddslashes($_POST['endtime']);
+ $sql.=" AND A.addtime<='{$endtime} 23:59:59'";
+ }
+ }
+ if(isset($_POST['value']) && !empty($_POST['value'])) {
+ $sql.=" AND A.`{$_POST['column']}`='{$_POST['value']}'";
+ }
+ $offset = intval($_POST['offset']);
+ $limit = intval($_POST['limit']);
+ $total = $DB->getColumn("SELECT count(*) from pre_psorder A LEFT JOIN pre_psreceiver B ON A.rid=B.id LEFT JOIN pre_channel C ON B.channel=C.id WHERE{$sql}");
+ $list = $DB->getAll("SELECT A.*,C.id channelid,C.name channelname FROM pre_psorder A LEFT JOIN pre_psreceiver B ON A.rid=B.id LEFT JOIN pre_channel C ON B.channel=C.id WHERE{$sql} order by A.id desc limit $offset,$limit");
+
+ exit(json_encode(['total'=>$total, 'rows'=>$list]));
+break;
+
+case 'get_receiver':
+ $id=intval($_GET['id']);
+ $row=$DB->find('psreceiver', '*', ['id'=>$id]);
+ if(!$row) exit('{"code":-1,"msg":"当前分账规则不存在!"}');
+ exit(json_encode(['code'=>0, 'data'=>$row]));
+break;
+
+case 'add_receiver':
+ $data = [
+ 'channel' => intval($_POST['channel']),
+ 'uid' => !empty($_POST['uid'])?intval($_POST['uid']):null,
+ 'subchannel' => !empty($_POST['subchannel']) ? intval($_POST['subchannel']) : null,
+ 'account' => trim($_POST['account']),
+ 'name' => trim($_POST['name']),
+ 'rate' => !empty($_POST['rate'])?trim($_POST['rate']):'30',
+ 'minmoney' => trim($_POST['minmoney']),
+ 'status' => 0,
+ 'addtime' => 'NOW()'
+ ];
+ if(!$data['channel'] || !$data['account'])exit('{"code":-1,"msg":"必填项不能为空"}');
+ if(!empty($data['uid']) && !$DB->find('user', 'uid', ['uid'=>$data['uid']]))exit('{"code":-1,"msg":"商户ID不存在"}');
+ if(!\lib\Channel::get($data['channel']))exit('{"code":-1,"msg":"支付通道不存在"}');
+ if(!strpos($data['rate'], '|') && $data['rate'] > 100) exit('{"code":-1,"msg":"分账比例不能大于100"}');
+ $rows = $DB->getRow("SELECT * FROM `pre_psreceiver` WHERE `channel`='{$data['channel']}' AND ".($data['uid']?"`uid`='{$data['uid']}'":"`uid` IS NULL")."");
+ if($rows)exit('{"code":-1,"msg":"该支付通道&UID已存在分账规则,每次支付只能同时给1个人分账"}');
+ if($DB->insert('psreceiver', $data)){
+ exit('{"code":0,"msg":"新增分账规则成功!"}');
+ }else{
+ exit('{"code":-1,"msg":"新增分账规则失败['.$DB->error().']"}');
+ }
+break;
+
+case 'edit_receiver':
+ $id=intval($_POST['id']);
+ $row=$DB->find('psreceiver', '*', ['id'=>$id]);
+ if(!$row) exit('{"code":-1,"msg":"当前分账规则不存在!"}');
+ $data = [
+ 'channel' => intval($_POST['channel']),
+ 'uid' => !empty($_POST['uid'])?intval($_POST['uid']):null,
+ 'subchannel' => !empty($_POST['subchannel']) ? intval($_POST['subchannel']) : null,
+ 'account' => trim($_POST['account']),
+ 'name' => trim($_POST['name']),
+ 'rate' => !empty($_POST['rate'])?trim($_POST['rate']):30,
+ 'minmoney' => trim($_POST['minmoney']),
+ ];
+ if(!$data['channel'] || !$data['account'])exit('{"code":-1,"msg":"必填项不能为空"}');
+ if(!empty($data['uid']) && !$DB->find('user', 'uid', ['uid'=>$data['uid']]))exit('{"code":-1,"msg":"商户ID不存在"}');
+ if(!\lib\Channel::get($data['channel']))exit('{"code":-1,"msg":"支付通道不存在"}');
+ if(!strpos($data['rate'], '|') && $data['rate'] > 100) exit('{"code":-1,"msg":"分账比例不能大于100"}');
+ $rows = $DB->getRow("SELECT * FROM `pre_psreceiver` WHERE `channel`='{$data['channel']}' AND ".($data['uid']?"`uid`='{$data['uid']}'":"`uid` IS NULL")." AND id!='$id'");
+ if($rows)exit('{"code":-1,"msg":"该支付通道&UID已存在分账规则,每次支付只能同时给1个人分账"}');
+ if($row['status']==1 && $data['channel'] != $row['channel']){
+ exit('{"code":-1,"msg":"请先将状态改为已关闭再切换通道"}');
+ }
+ if($row['status']==1 && ($data['account']!=$row['account'] || $data['name']!=$row['name'] || $data['channel']!=$row['channel'])){
+ $channel = $row['subchannel'] > 0 ? \lib\Channel::getSub($row['subchannel']) : \lib\Channel::get($row['channel'], $row['uid']?$DB->findColumn('user', 'channelinfo', ['uid'=>$row['uid']]):null);
+ if($channel){
+ $model = \lib\ProfitSharing\CommUtil::getModel($channel);
+ $model->deleteReceiver($row['account'], $row['name']);
+ $result = $model->addReceiver($data['account'], $data['name']);
+ if($result['code'] != 0) exit(json_encode($result));
+ }
+ }
+ if($DB->update('psreceiver', $data, ['id'=>$id])!==false){
+ exit('{"code":0,"msg":"修改分账规则成功!"}');
+ }else{
+ exit('{"code":-1,"msg":"修改分账规则失败['.$DB->error().']"}');
+ }
+break;
+
+case 'set_receiver':
+ $id=intval($_POST['id']);
+ $status=intval($_POST['status']);
+ $row=$DB->find('psreceiver', '*', ['id'=>$id]);
+ if(!$row) exit('{"code":-1,"msg":"当前分账规则不存在!"}');
+ $channel = $row['subchannel'] > 0 ? \lib\Channel::getSub($row['subchannel']) : \lib\Channel::get($row['channel'], $row['uid']?$DB->findColumn('user', 'channelinfo', ['uid'=>$row['uid']]):null);
+ if(!$channel) exit('{"code":-1,"msg":"当前支付通道不存在!"}');
+ $model = \lib\ProfitSharing\CommUtil::getModel($channel);
+ if($status == 1){
+ $result = $model->addReceiver($row['account'], $row['name']);
+ }elseif($status == 0){
+ $result = $model->deleteReceiver($row['account'], $row['name']);
+ }
+ if($result['code'] == 0 || $status == 0 && strpos($result['msg'],'分账接收方不存在')!==false){
+ $DB->update('psreceiver', ['status'=>$status], ['id'=>$id]);
+ exit('{"code":0,"msg":"状态修改成功!"}');
+ }else{
+ exit(json_encode($result));
+ }
+break;
+
+case 'del_receiver':
+ $id=intval($_POST['id']);
+ $row=$DB->find('psreceiver', '*', ['id'=>$id]);
+ if(!$row) exit('{"code":-1,"msg":"当前分账规则不存在!"}');
+ if($row['status']==1){
+ $channel = $row['subchannel'] > 0 ? \lib\Channel::getSub($row['subchannel']) : \lib\Channel::get($row['channel'], $row['uid']?$DB->findColumn('user', 'channelinfo', ['uid'=>$row['uid']]):null);
+ if($channel){
+ $model = \lib\ProfitSharing\CommUtil::getModel($channel);
+ $model->deleteReceiver($row['account'], $row['name']);
+ }
+ }
+ if($DB->delete('psreceiver', ['id'=>$id])){
+ exit('{"code":0,"msg":"删除分账规则成功!"}');
+ }else{
+ exit('{"code":-1,"msg":"删除分账规则失败['.$DB->error().']"}');
+ }
+break;
+
+
+case 'submit':
+ $id=intval($_POST['id']);
+ $row = $DB->getRow("SELECT A.*,B.channel,B.account,B.name,B.uid psuid,C.uid,C.subchannel FROM pre_psorder A LEFT JOIN pre_psreceiver B ON A.rid=B.id LEFT JOIN pre_order C ON C.trade_no=A.trade_no WHERE A.id=:id", [':id'=>$id]);
+ if(!$row)exit('{"code":-1,"msg":"订单不存在"}');
+ if($row['status']!=0&&$row['status']!=3)exit('{"code":-1,"msg":"只有待分账的订单才能提交分账"}');
+ $channel = $row['subchannel'] > 0 ? \lib\Channel::getSub($row['subchannel']) : \lib\Channel::get($row['channel'], $row['uid']?$DB->findColumn('user', 'channelinfo', ['uid'=>$row['uid']]):null);
+ if(!$channel) exit('{"code":-1,"msg":"通道信息不存在"}');
+ $model = \lib\ProfitSharing\CommUtil::getModel($channel);
+ $result = $model->submit($row['trade_no'], $row['api_trade_no'], $row['account'], $row['name'], $row['money']);
+ if($result['code'] == 0){
+ $DB->update('psorder', ['status'=>1,'settle_no'=>$result['settle_no']], ['id'=>$id]);
+ }elseif($result['code'] == 1){
+ $DB->update('psorder', ['status'=>2,'settle_no'=>$result['settle_no']], ['id'=>$id]);
+ if(!empty($row['psuid']) && $channel['mode']==0){
+ changeUserMoney($row['psuid'], $row['money'], false, '订单分账', $row['trade_no']);
+ }
+ }elseif($result['code'] == -2){
+ //$DB->update('psorder', ['status'=>3,'result'=>$result['msg']], ['id'=>$id]);
+ }
+ exit(json_encode($result));
+break;
+
+case 'query':
+ $id=intval($_POST['id']);
+ $row = $DB->getRow("SELECT A.*,B.channel,B.account,B.name,B.uid psuid,C.uid,C.subchannel FROM pre_psorder A LEFT JOIN pre_psreceiver B ON A.rid=B.id LEFT JOIN pre_order C ON C.trade_no=A.trade_no WHERE A.id=:id", [':id'=>$id]);
+ if(!$row)exit('{"code":-1,"msg":"订单不存在"}');
+ if($row['status']!=1)exit('{"code":-1,"msg":"只有已提交的订单才能查询结果"}');
+ $channel = $row['subchannel'] > 0 ? \lib\Channel::getSub($row['subchannel']) : \lib\Channel::get($row['channel'], $row['uid']?$DB->findColumn('user', 'channelinfo', ['uid'=>$row['uid']]):null);
+ if(!$channel) exit('{"code":-1,"msg":"通道信息不存在"}');
+ $model = \lib\ProfitSharing\CommUtil::getModel($channel);
+ $result = $model->query($row['trade_no'], $row['api_trade_no'], $row['settle_no']);
+ if($result['code']==0){
+ if($result['status']==1){
+ $DB->update('psorder', ['status'=>2], ['id'=>$id]);
+ if(!empty($row['psuid']) && $channel['mode']==0){
+ changeUserMoney($row['psuid'], $row['money'], false, '订单分账', $row['trade_no']);
+ }
+ }elseif($result['status']==2){
+ $DB->update('psorder', ['status'=>3,'result'=>$result['reason']], ['id'=>$id]);
+ }
+ }
+ exit(json_encode($result));
+break;
+
+case 'unfreeeze':
+ $id=intval($_POST['id']);
+ $row = $DB->getRow("SELECT A.*,B.channel,B.account,B.name,C.uid,C.subchannel FROM pre_psorder A LEFT JOIN pre_psreceiver B ON A.rid=B.id LEFT JOIN pre_order C ON C.trade_no=A.trade_no WHERE A.id=:id", [':id'=>$id]);
+ if(!$row)exit('{"code":-1,"msg":"订单不存在"}');
+ if($row['status']==2)exit('{"code":-1,"msg":"只有待分账的订单才能取消分账"}');
+ $channel = $row['subchannel'] > 0 ? \lib\Channel::getSub($row['subchannel']) : \lib\Channel::get($row['channel'], $row['uid']?$DB->findColumn('user', 'channelinfo', ['uid'=>$row['uid']]):null);
+ if(!$channel) exit('{"code":-1,"msg":"通道信息不存在"}');
+ $model = \lib\ProfitSharing\CommUtil::getModel($channel);
+ $result = $model->unfreeeze($row['trade_no'], $row['api_trade_no']);
+ if($result['code'] == 0){
+ $DB->update('psorder', ['status'=>4], ['id'=>$id]);
+ }
+ exit(json_encode($result));
+break;
+
+case 'return':
+ $id=intval($_POST['id']);
+ $row = $DB->getRow("SELECT A.*,B.channel,B.account,B.name,C.uid,C.subchannel FROM pre_psorder A LEFT JOIN pre_psreceiver B ON A.rid=B.id LEFT JOIN pre_order C ON C.trade_no=A.trade_no WHERE A.id=:id", [':id'=>$id]);
+ if(!$row)exit('{"code":-1,"msg":"订单不存在"}');
+ if($row['status']!=2)exit('{"code":-1,"msg":"只有分账成功的订单才能回退"}');
+ $channel = $row['subchannel'] > 0 ? \lib\Channel::getSub($row['subchannel']) : \lib\Channel::get($row['channel'], $row['uid']?$DB->findColumn('user', 'channelinfo', ['uid'=>$row['uid']]):null);
+ if(!$channel) exit('{"code":-1,"msg":"通道信息不存在"}');
+ $model = \lib\ProfitSharing\CommUtil::getModel($channel);
+ $result = $model->return($row['trade_no'], $row['api_trade_no'], $row['account'], $row['money']);
+ if($result['code'] == 0){
+ $DB->update('psorder', ['status'=>4], ['id'=>$id]);
+ }
+ exit(json_encode($result));
+break;
+
+case 'editmoney':
+ $id=intval($_POST['id']);
+ $money=trim($_POST['money']);
+ if(!is_numeric($money) || !preg_match('/^[0-9.]+$/', $money))exit('{"code":-1,"msg":"金额输入错误"}');
+ $row = $DB->getRow("SELECT * FROM pre_psorder WHERE id=:id", [':id'=>$id]);
+ if(!$row)exit('{"code":-1,"msg":"订单不存在"}');
+ if($row['status']!=0)exit('{"code":-1,"msg":"只有待分账的订单才能修改金额"}');
+ $DB->update('psorder', ['money'=>$money], ['id'=>$id]);
+ exit('{"code":0,"msg":"succ"}');
+break;
+
+case 'operation': //批量操作订单
+ $status=is_numeric($_POST['status'])?intval($_POST['status']):exit('{"code":-1,"msg":"请选择操作"}');
+ $checkbox=$_POST['checkbox'];
+ $i=0;
+ foreach($checkbox as $id){
+ if($status==5)$DB->exec("DELETE FROM pre_psorder WHERE id='$id'");
+ else $DB->exec("update pre_psorder set status='$status' where id='$id' limit 1");
+ $i++;
+ }
+ exit('{"code":0,"msg":"成功改变'.$i.'条订单状态"}');
+break;
+
+case 'statistics':
+ $sql = " 1=1";
+ if(isset($_POST['rid']) && !empty($_POST['rid'])) {
+ $rid = intval($_POST['rid']);
+ $sql .= " AND rid='$rid'";
+ }
+ if(isset($_POST['dstatus']) && $_POST['dstatus']>-1) {
+ $dstatus = intval($_POST['dstatus']);
+ $sql .= " AND status={$dstatus}";
+ }
+ if(!empty($_POST['starttime']) || !empty($_POST['endtime'])){
+ if(!empty($_POST['starttime'])){
+ $starttime = daddslashes($_POST['starttime']);
+ $sql .= " AND addtime>='{$starttime} 00:00:00'";
+ }
+ if(!empty($_POST['endtime'])){
+ $endtime = daddslashes($_POST['endtime']);
+ $sql .= " AND addtime<='{$endtime} 23:59:59'";
+ }
+ }
+ if(isset($_POST['value']) && !empty($_POST['value'])) {
+ $column = daddslashes($_POST['column']);
+ if($column == 'money'){
+ $sql .= " AND {$column}='".floatval($_POST['value'])."'";
+ }else{
+ $sql .= " AND {$column}='".daddslashes($_POST['value'])."'";
+ }
+ }
+
+ $result = $DB->getRow("SELECT
+ SUM(money) AS totalMoney,
+ SUM(CASE WHEN status = 2 THEN money ELSE 0 END) AS successMoney,
+ SUM(CASE WHEN status = 3 THEN money ELSE 0 END) AS failMoney,
+ COUNT(*) AS totalCount,
+ SUM(CASE WHEN status = 2 THEN 1 ELSE 0 END) AS successCount,
+ SUM(CASE WHEN status = 3 THEN 1 ELSE 0 END) AS failCount
+ FROM pre_psorder WHERE {$sql}");
+
+ $successRate = $result['totalCount'] > 0 ? round(($result['successCount'] / $result['totalCount']) * 100, 2) : 0;
+
+ $data = [
+ 'totalMoney' => number_format($result['totalMoney'] ?? 0, 2, '.', ''),
+ 'successMoney' => number_format($result['successMoney'] ?? 0, 2, '.', ''),
+ 'failMoney' => number_format($result['failMoney'] ?? 0, 2, '.', ''),
+ 'totalCount' => $result['totalCount'] ?? 0,
+ 'successCount' => $result['successCount'] ?? 0,
+ 'failCount' => $result['failCount'] ?? 0,
+ 'successRate' => $successRate
+ ];
+
+ exit(json_encode(['code' => 0, 'data' => $data]));
+break;
+
+default:
+ exit('{"code":-4,"msg":"No Act"}');
+break;
+}
\ No newline at end of file
diff --git a/admin/ajax_settle.php b/admin/ajax_settle.php
new file mode 100644
index 0000000..7b2e049
--- /dev/null
+++ b/admin/ajax_settle.php
@@ -0,0 +1,250 @@
+window.location.href='./login.php';");
+$act=isset($_GET['act'])?daddslashes($_GET['act']):null;
+
+if(!checkRefererHost())exit('{"code":403}');
+
+@header('Content-Type: application/json; charset=UTF-8');
+
+switch($act){
+case 'settleList':
+ $sql=" 1=1";
+ if(isset($_POST['batch']) && !empty($_POST['batch'])) {
+ $batch = daddslashes($_POST['batch']);
+ $sql.=" AND `batch`='$batch'";
+ }
+ if(isset($_POST['uid']) && !empty($_POST['uid'])) {
+ $uid = intval($_POST['uid']);
+ $sql.=" AND `uid`='$uid'";
+ }
+ if(isset($_POST['type']) && !empty($_POST['type'])) {
+ $type = intval($_POST['type']);
+ $sql.=" AND `type`='$type'";
+ }
+ if(isset($_POST['dstatus']) && $_POST['dstatus']>-1) {
+ $dstatus = intval($_POST['dstatus']);
+ $sql.=" AND `status`={$dstatus}";
+ }
+ if(isset($_POST['value']) && !empty($_POST['value'])) {
+ $value = daddslashes($_POST['value']);
+ $sql.=" AND (`account` like '%{$value}%' OR `username` like '%{$value}%')";
+ }
+ $offset = intval($_POST['offset']);
+ $limit = intval($_POST['limit']);
+ $total = $DB->getColumn("SELECT count(*) from pre_settle WHERE{$sql}");
+ $list = $DB->getAll("SELECT * FROM pre_settle WHERE{$sql} order by id desc limit $offset,$limit");
+ $list2 = [];
+ foreach($list as $row){
+ if($row['type'] == 2 && $row['status'] == 1 && !empty($row['transfer_ext']) && time() - strtotime($row['transfer_date']) <= 86400){
+ if(substr($row['ext'], 0, 4) == 'http'){
+ $row['jumpurl'] = $row['ext'];
+ }else{
+ $row['jumpurl'] = $siteurl.'paypage/wxtrans.php?id='.$row['id'].'&type=settle';
+ }
+ }
+ $list2[] = $row;
+ }
+
+ exit(json_encode(['total'=>$total, 'rows'=>$list2]));
+break;
+
+case 'create_batch':
+ $count=$DB->getColumn("SELECT count(*) from pre_settle where status=0");
+ if($count==0)exit('{"code":-1,"msg":"当前不存在待结算的记录"}');
+ $batch=date("Ymd").rand(111,999);
+ $allmoney = 0;
+ $rs=$DB->query("SELECT * from pre_settle where status=0");
+ while($row = $rs->fetch())
+ {
+ $DB->exec("UPDATE pre_settle SET batch='$batch',status=2 WHERE id='{$row['id']}'");
+ $allmoney+=$row['realmoney'];
+ }
+ $DB->insert('batch', ['batch'=>$batch, 'allmoney'=>$allmoney, 'count'=>$count, 'time'=>'NOW()', 'status'=>0]);
+
+ exit(json_encode(['code'=>0, 'msg'=>'succ', 'batch'=>$batch, 'count'=>$count, 'allmoney'=>$allmoney]));
+break;
+case 'complete_batch':
+ $batch=trim($_POST['batch']);
+ $DB->exec("UPDATE pre_settle SET status=1 WHERE batch='$batch'");
+ exit('{"code":0,"msg":"succ"}');
+break;
+case 'setSettleStatus':
+ $id=intval($_GET['id']);
+ $status=intval($_GET['status']);
+ if($status==4){
+ $row = $DB->find('settle', 'uid,money', ['id'=>$id]);
+ if(!$row) exit('{"code":200}');
+ if($DB->exec("DELETE FROM pre_settle WHERE id='$id'")){
+ changeUserMoney($row['uid'], $row['money'], true, '结算失败退回');
+ exit('{"code":200}');
+ }
+ else{
+ exit('{"code":400,"msg":"删除记录失败!['.$DB->error().']"}');
+ }
+ }else{
+ if($status==1){
+ $sql = "update pre_settle set status='$status',endtime='$date',result=NULL where id='$id'";
+
+ $row = $DB->find('settle', 'uid,money,realmoney,account', ['id'=>$id]);
+ \lib\MsgNotice::send('settle', $row['uid'], ['money'=>$row['money'], 'realmoney'=>$row['realmoney'], 'time'=>date('Y-m-d H:i:s'), 'account'=>$row['account']]);
+ }else{
+ $sql = "update pre_settle set status='$status',endtime=NULL where id='$id'";
+ }
+ if($DB->exec($sql)!==false)
+ exit('{"code":200}');
+ else
+ exit('{"code":400,"msg":"修改记录失败!['.$DB->error().']"}');
+ }
+break;
+case 'opslist':
+ $status=$_POST['status'];
+ $checkbox=$_POST['checkbox'];
+ $i=0;
+ foreach($checkbox as $id){
+ if($status==4){
+ $sql = "DELETE FROM pre_settle WHERE id='$id'";
+ }elseif($status==1){
+ $sql = "update pre_settle set status='$status',endtime='$date',result=NULL where id='$id'";
+ }else{
+ $sql = "update pre_settle set status='$status',endtime=NULL where id='$id'";
+ }
+ $DB->exec($sql);
+ $i++;
+ }
+ exit('{"code":0,"msg":"成功改变'.$i.'条记录状态"}');
+break;
+case 'settle_result':
+ $id=intval($_POST['id']);
+ $row=$DB->getRow("select result from pre_settle where id='$id' limit 1");
+ if(!$row)
+ exit('{"code":-1,"msg":"当前结算记录不存在!"}');
+ $result = ['code'=>0,'msg'=>'succ','result'=>$row['result']];
+ exit(json_encode($result));
+break;
+case 'settle_setresult':
+ $id=intval($_POST['id']);
+ $result=trim($_POST['result']);
+ $row=$DB->getRow("select * from pre_settle where id='$id' limit 1");
+ if(!$row)
+ exit('{"code":-1,"msg":"当前结算记录不存在!"}');
+ $sds = $DB->exec("UPDATE pre_settle SET result='$result' WHERE id='$id'");
+ if($sds!==false)
+ exit('{"code":0,"msg":"修改成功!"}');
+ else
+ exit('{"code":-1,"msg":"修改失败!'.$DB->error().'"}');
+break;
+case 'settle_info':
+ $id=intval($_GET['id']);
+ $rows=$DB->getRow("select * from pre_settle where id='$id' limit 1");
+ if(!$rows)
+ exit('{"code":-1,"msg":"当前结算记录不存在!"}');
+ $data = '';
+ $data .= '';
+ $data .= '';
+ $data .= '';
+ $result=array("code"=>0,"msg"=>"succ","data"=>$data,"pay_type"=>$rows['type']);
+ exit(json_encode($result));
+break;
+case 'settle_save':
+ $id=intval($_POST['id']);
+ $pay_type=intval($_POST['pay_type']);
+ $pay_account=htmlspecialchars(trim($_POST['pay_account']));
+ $pay_name=htmlspecialchars(trim($_POST['pay_name']));
+ $data = ['type'=>$pay_type, 'account'=>$pay_account, 'username'=>$pay_name];
+ if($DB->update('settle', $data, ['id'=>$id])!==false)
+ exit('{"code":0,"msg":"修改记录成功!"}');
+ else
+ exit('{"code":-1,"msg":"修改记录失败!'.$DB->error().'"}');
+break;
+case 'paypwd_check':
+ if(isset($_SESSION['paypwd']) && $_SESSION['paypwd']==$conf['admin_paypwd'])
+ exit('{"code":0,"msg":"ok"}');
+ else
+ exit('{"code":-1,"msg":"error"}');
+break;
+case 'paypwd_input':
+ $paypwd=trim($_POST['paypwd']);
+ if(!$conf['admin_paypwd'])exit('{"code":-1,"msg":"你还未设置支付密码"}');
+ if($paypwd == $conf['admin_paypwd']){
+ $_SESSION['paypwd'] = $paypwd;
+ exit('{"code":0,"msg":"ok"}');
+ }else{
+ exit('{"code":-1,"msg":"支付密码错误!"}');
+ }
+break;
+case 'paypwd_reset':
+ unset($_SESSION['paypwd']);
+ exit('{"code":0,"msg":"ok"}');
+break;
+
+case 'transfer':
+ $id = isset($_POST['id'])?intval($_POST['id']):exit('{"code":-1,"msg":"ID不能为空"}');
+ $type = isset($_POST['type'])?intval($_POST['type']):exit('{"code":-1,"msg":"type不能为空"}');
+ $channelid = isset($_POST['channel'])?intval($_POST['channel']):0;
+
+ $payee_err_code = [ //收款方原因导致的失败编码
+ 'PAYEE_NOT_EXIST','PAYEE_ACCOUNT_STATUS_ERROR','CARD_BIN_ERROR','PAYEE_CARD_INFO_ERROR','PERM_AML_NOT_REALNAME_REV','PAYEE_USER_INFO_ERROR','PAYEE_ACC_OCUPIED','PERMIT_NON_BANK_LIMIT_PAYEE','PAYEE_TRUSTEESHIP_ACC_OVER_LIMIT','PAYEE_ACCOUNT_NOT_EXSIT','PAYEE_USERINFO_STATUS_ERROR','TRUSTEESHIP_RECIEVE_QUOTA_LIMIT','EXCEED_LIMIT_UNRN_DM_AMOUNT','INVALID_CARDNO','RELEASE_USER_FORBBIDEN_RECIEVE','PAYEE_USER_TYPE_ERROR','PAYEE_NOT_RELNAME_CERTIFY','PERMIT_LIMIT_PAYEE',
+
+ 'OPENID_ERROR','NAME_MISMATCH','V2_ACCOUNT_SIMPLE_BAN','MONEY_LIMIT','EXCEED_PAYEE_ACCOUNT_LIMIT','PAYEE_ACCOUNT_ABNORMAL','APPID_OR_OPENID_ERR',
+
+ 'REALNAME_CHECK_ERROR','RE_USER_NAME_CHECK_ERROR','ERR_TJ_BLACK','USER_FROZEN','TRANSFER_FAIL','TRANSFER_FEE_LIMIT_ERROR',
+
+ 'ACCOUNT_FROZEN','REAL_NAME_CHECK_FAIL','NAME_NOT_CORRECT','OPENID_INVALID','TRANSFER_QUOTA_EXCEED','DAY_RECEIVED_QUOTA_EXCEED','MONTH_RECEIVED_QUOTA_EXCEED','DAY_RECEIVED_COUNT_EXCEED','ID_CARD_NOT_CORRECT','ACCOUNT_NOT_EXIST','TRANSFER_RISK','REALNAME_ACCOUNT_RECEIVED_QUOTA_EXCEED','RECEIVE_ACCOUNT_NOT_PERMMIT','PAYEE_ACCOUNT_ABNORMAL','BLOCK_B2C_USERLIMITAMOUNT_BSRULE_MONTH','BLOCK_B2C_USERLIMITAMOUNT_MONTH',
+ ];
+
+ if(!isset($_SESSION['paypwd']) || $_SESSION['paypwd']!==$conf['admin_paypwd'])exit('{"code":-1,"msg":"支付密码错误,请返回重新进入该页面"}');
+
+ $row=$DB->getRow("SELECT * FROM pre_settle WHERE id='{$id}' limit 1");
+ if(!$row)exit('{"code":-1,"msg":"记录不存在"}');
+ if($row['type']!=$type)exit('{"code":-1,"msg":"转账类型不正确"}');
+
+ if($row['transfer_status']==1)exit('{"code":0,"ret":2,"result":"转账订单号:'.$row['transfer_result'].' 支付时间:'.$row['transfer_date'].'"}');
+
+ if($type == 1){
+ $app = 'alipay';
+ }elseif($type == 2){
+ $app = 'wxpay';
+ }elseif($type == 3){
+ $app = 'qqpay';
+ }elseif($type == 4){
+ $app = 'bank';
+ }
+ $channel = \lib\Channel::get($channelid);
+ if(!$channel)exit('{"code":-1,"msg":"当前支付通道信息不存在"}');
+
+ $out_biz_no = date("YmdHis").str_pad($id, 5, '0', STR_PAD_LEFT);
+ $result = \lib\Transfer::submit($app, $channel, $out_biz_no, $row['account'], $row['username'], $row['realmoney']);
+
+ if($result['code']==0){
+ $data['code']=0;
+ $data['ret']=1;
+ $data['result']='转账订单号:'.$result['orderid'].' 支付时间:'.$result['paydate'];
+ $update = ['status'=>1, 'endtime'=>'NOW()', 'transfer_no'=>$out_biz_no, 'transfer_channel'=>$channelid, 'transfer_status'=>1, 'transfer_result'=>$result["orderid"], 'transfer_date'=>$result["paydate"]];
+ if(isset($result['wxpackage'])) $update['transfer_ext'] = $result['wxpackage'];
+ $DB->update('settle', $update, ['id'=>$id]);
+
+ if(isset($result['wxpackage'])) {
+ $jumpurl = $siteurl.'paypage/wxtrans.php?type=settle&id='.$id;
+ \lib\MsgNotice::send('settle', $row['uid'], ['money'=>$row['money'], 'realmoney'=>$row['realmoney'], 'time'=>date('Y-m-d H:i:s'), 'account'=>$row['account'], 'jumpurl'=>$jumpurl]);
+ }else{
+ \lib\MsgNotice::send('settle', $row['uid'], ['money'=>$row['money'], 'realmoney'=>$row['realmoney'], 'time'=>date('Y-m-d H:i:s'), 'account'=>$row['account']]);
+ }
+ } else {
+ if(in_array($result['errcode'], $payee_err_code)){
+ $data['code']=0;
+ $data['ret']=0;
+ $data['result']='转账失败 '.$result['msg'];
+ $DB->update('settle', ['status'=>3, 'result'=>$result["msg"], 'transfer_status'=>2, 'transfer_result'=>$data['result']], ['id'=>$id]);
+ }else{
+ $data['code']=-1;
+ $data['msg']=$result['msg'];
+ }
+ }
+ exit(json_encode($data));
+break;
+
+default:
+ exit('{"code":-4,"msg":"No Act"}');
+break;
+}
\ No newline at end of file
diff --git a/admin/ajax_transfer.php b/admin/ajax_transfer.php
new file mode 100644
index 0000000..1449f23
--- /dev/null
+++ b/admin/ajax_transfer.php
@@ -0,0 +1,115 @@
+window.location.href='./login.php';");
+$act=isset($_GET['act'])?daddslashes($_GET['act']):null;
+
+if(!checkRefererHost())exit('{"code":403}');
+
+@header('Content-Type: application/json; charset=UTF-8');
+
+switch($act){
+case 'transferList':
+ $sql=" 1=1";
+ if(isset($_POST['uid']) && !empty($_POST['uid'])) {
+ $uid = intval($_POST['uid']);
+ $sql.=" AND `uid`='$uid'";
+ }
+ if(isset($_POST['type']) && !empty($_POST['type'])) {
+ $type = intval($_POST['type']);
+ $sql.=" AND `type`='$type'";
+ }
+ if(isset($_POST['dstatus']) && $_POST['dstatus']>-1) {
+ $dstatus = intval($_POST['dstatus']);
+ $sql.=" AND `status`={$dstatus}";
+ }
+ if(isset($_POST['value']) && !empty($_POST['value'])) {
+ $value = daddslashes($_POST['value']);
+ $sql.=" AND (`biz_no`='{$value}' OR `account` like '%{$value}%' OR `username` like '%{$value}%')";
+ }
+ $offset = intval($_POST['offset']);
+ $limit = intval($_POST['limit']);
+ $total = $DB->getColumn("SELECT count(*) from pre_transfer WHERE{$sql}");
+ $list = $DB->getAll("SELECT * FROM pre_transfer WHERE{$sql} order by biz_no desc limit $offset,$limit");
+ $list2 = [];
+ foreach($list as $row){
+ if($row['type'] == 'wxpay' && $row['status'] == 0 && !empty($row['ext'])){
+ if(substr($row['ext'], 0, 4) == 'http'){
+ $row['jumpurl'] = $row['ext'];
+ }else{
+ $row['jumpurl'] = $siteurl.'paypage/wxtrans.php?id='.$row['biz_no'].'&type=transfer';
+ }
+ }
+ $list2[] = $row;
+ }
+
+ exit(json_encode(['total'=>$total, 'rows'=>$list2]));
+break;
+
+case 'transfer_query':
+ $biz_no=trim($_GET['biz_no']);
+ $result = \lib\Transfer::status($biz_no);
+ exit(json_encode($result));
+break;
+case 'transfer_result':
+ $biz_no=trim($_GET['biz_no']);
+ $row = $DB->find('transfer', 'biz_no,result', ['biz_no' => $biz_no]);
+ if(!$row) exit('{"code":-1,"msg":"付款记录不存在!"}');
+ $result = ['code'=>0,'msg'=>$row['result']?$row['result']:'未知'];
+ exit(json_encode($result));
+break;
+case 'transfer_cancel':
+ $biz_no=trim($_POST['biz_no']);
+ $result = \lib\Transfer::cancel($biz_no);
+ exit(json_encode($result));
+break;
+case 'balance_query':
+ $type = $_POST['type'];
+ $channel = isset($_POST['channel'])?intval($_POST['channel']):$conf['transfer_'.$type];
+ $channel = \lib\Channel::get($channel);
+ if(!$channel)exit('{"code":-1,"msg":"当前支付通道信息不存在"}');
+ $user_id = isset($_POST['user_id'])?$_POST['user_id']:null;
+ $result = \lib\Transfer::balance($type, $channel, $user_id);
+ exit(json_encode($result));
+break;
+case 'setTransferStatus':
+ $biz_no=$_POST['biz_no'];
+ $status=intval($_POST['status']);
+ if($DB->exec("UPDATE pre_transfer SET status='$status' WHERE biz_no='$biz_no'")!==false)exit('{"code":0,"msg":"succ"}');
+ else exit('{"code":-1,"msg":"修改失败['.$DB->error().']"}');
+break;
+case 'delTransfer':
+ $biz_no=$_POST['biz_no'];
+ if($DB->exec("DELETE FROM pre_transfer WHERE biz_no='$biz_no'")!==false)exit('{"code":0,"msg":"succ"}');
+ else exit('{"code":-1,"msg":"删除失败['.$DB->error().']"}');
+break;
+case 'refundTransfer':
+ $biz_no=$_POST['biz_no'];
+ $order = $DB->find('transfer', '*', ['biz_no' => $biz_no]);
+ if(!$order) exit('{"code":-1,"msg":"付款记录不存在!"}');
+ if($DB->exec("UPDATE pre_transfer SET status='2' WHERE biz_no='$biz_no'")){
+ if($order['uid'] > 0){
+ changeUserMoney($order['uid'], $order['costmoney'], true, '代付退回');
+ }
+ }
+ exit('{"code":0,"msg":"已成功将¥'.$order['costmoney'].'推给商户'.$order['uid'].'"}');
+break;
+case 'transfer_proof':
+ $biz_no=trim($_POST['biz_no']);
+ $result = \lib\Transfer::proof($biz_no);
+ exit(json_encode($result));
+break;
+case 'operation': //批量操作订单
+ $status=is_numeric($_POST['status'])?intval($_POST['status']):exit('{"code":-1,"msg":"请选择操作"}');
+ $checkbox=$_POST['checkbox'];
+ $i=0;
+ foreach($checkbox as $biz_no){
+ if($status==3)$DB->exec("DELETE FROM pre_transfer WHERE biz_no='$biz_no'");
+ else $DB->exec("update pre_transfer set status='$status' where biz_no='$biz_no' limit 1");
+ $i++;
+ }
+ exit('{"code":0,"msg":"成功改变'.$i.'条订单状态"}');
+break;
+default:
+ exit('{"code":-4,"msg":"No Act"}');
+break;
+}
\ No newline at end of file
diff --git a/admin/ajax_user.php b/admin/ajax_user.php
new file mode 100644
index 0000000..de55e10
--- /dev/null
+++ b/admin/ajax_user.php
@@ -0,0 +1,794 @@
+window.location.href='./login.php';");
+$act=isset($_GET['act'])?daddslashes($_GET['act']):null;
+
+if(!checkRefererHost())exit('{"code":403}');
+
+@header('Content-Type: application/json; charset=UTF-8');
+
+switch($act){
+case 'userList':
+ $usergroup = [0=>'默认用户组'];
+ $rs = $DB->getAll("SELECT * FROM pre_group");
+ foreach($rs as $row){
+ $usergroup[$row['gid']] = $row['name'];
+ }
+ unset($rs);
+
+ $sql=" 1=1";
+ if(isset($_POST['dstatus']) && !empty($_POST['dstatus'])) {
+ $dstatus = explode('_',$_POST['dstatus']);
+ $sql.=" AND `{$dstatus[0]}`='{$dstatus[1]}'";
+ }
+ if(isset($_POST['gid']) && $_POST['gid']!=='') {
+ $gid = intval($_POST['gid']);
+ $sql.=" AND `gid`='$gid'";
+ }
+ if(isset($_POST['upid']) && $_POST['upid']!=='') {
+ $upid = intval($_POST['upid']);
+ $sql.=" AND `upid`='$upid'";
+ }
+ if(isset($_POST['value']) && !empty($_POST['value'])) {
+ $sql.=" AND `{$_POST['column']}`='{$_POST['value']}'";
+ }
+ $offset = intval($_POST['offset']);
+ $limit = intval($_POST['limit']);
+ $total = $DB->getColumn("SELECT count(*) from pre_user WHERE{$sql}");
+ $list = $DB->getAll("SELECT * FROM pre_user WHERE{$sql} order by uid desc limit $offset,$limit");
+ $list2 = [];
+ foreach($list as $row){
+ if($row['endtime']!=null && strtotime($row['endtime'])