Files
pay/admin/ajax_order.php
T
2025-11-28 10:08:12 +08:00

379 lines
16 KiB
PHP

<?php
include("../includes/common.php");
if($islogin==1){}else exit("<script language='javascript'>window.location.href='./login.php';</script>");
$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;
}