379 lines
16 KiB
PHP
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;
|
||
} |