File size: 9,769 Bytes
0d5b03e |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 |
<?php
if(preg_match('/Baiduspider/', $_SERVER['HTTP_USER_AGENT']))exit;
$nosession = true;
require './includes/common.php';
if (function_exists("set_time_limit"))
{
@set_time_limit(0);
}
if (function_exists("ignore_user_abort"))
{
@ignore_user_abort(true);
}
@header('Content-Type: text/html; charset=UTF-8');
if(empty($conf['cronkey']))exit("请先设置好监控密钥");
if($conf['cronkey']!=$_GET['key'])exit("监控密钥不正确");
if($_GET['do']=='settle'){
if($conf['settle_open']==1 || $conf['settle_open']==3){
$settle_time=getSetting('settle_time', true);
if(strtotime($settle_time)>=strtotime(date("Y-m-d").' 00:00:00'))exit('自动生成结算列表今日已完成');
$rs=$DB->query("SELECT * from pre_user where money>={$conf['settle_money']} and account is not null and username is not null and settle=1 and status=1");
$i=0;
$allmoney=0;
while($row = $rs->fetch())
{
if($conf['cert_force']==1 && $row['cert']==0){
continue;
}
$i++;
$settle_rate = $conf['settle_rate'];
$group = getGroupConfig($row['gid']);
if(isset($group['settle_open']) && $group['settle_open'] == 2) continue;
if(isset($group['settle_rate']) && $group['settle_rate']!=='' && $group['settle_rate']!==null) $settle_rate = $group['settle_rate'];
if($settle_rate>0){
$fee=round($row['money']*$settle_rate/100,2);
if(!empty($conf['settle_fee_min']) && $fee<$conf['settle_fee_min'])$fee=$conf['settle_fee_min'];
if(!empty($conf['settle_fee_max']) && $fee>$conf['settle_fee_max'])$fee=$conf['settle_fee_max'];
$realmoney=$row['money']-$fee;
}else{
$realmoney=$row['money'];
}
$data = ['uid'=>$row['uid'], 'type'=>$row['settle_id'], 'account'=>$row['account'], 'username'=>$row['username'], 'money'=>$row['money'], 'realmoney'=>$realmoney, 'addtime'=>'NOW()', 'status'=>0];
if($DB->insert('settle', $data)){
changeUserMoney($row['uid'], $row['money'], false, '自动结算');
$allmoney+=$realmoney;
}
}
saveSetting('settle_time', $date);
exit('自动生成结算列表成功 allmony='.$allmoney.' num='.$i);
}else{
exit('自动生成结算列表未开启');
}
}
elseif($_GET['do']=='order'){
$order_time=getSetting('order_time', true);
if(strtotime($order_time)>=strtotime(date("Y-m-d").' 00:00:00'))exit('订单统计与清理任务今日已完成');
$thtime=date("Y-m-d H:i:s",time()-3600*24);
$CACHE->clean();
$DB->exec("delete from pre_order where status=0 and addtime<'{$thtime}'");
$DB->exec("delete from pre_regcode where `time`<'".(time()-3600*24)."'");
$DB->exec("delete from pre_blacklist where endtime is not null and endtime<NOW()");
$DB->exec("delete from pay_wxkflog where addtime<'".date("Y-m-d H:i:s", strtotime('-48 hours'))."'");
$day = date("Ymd", strtotime("-1 day"));
$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);
$lastday=date("Y-m-d",strtotime("-1 day"));
$today=date("Y-m-d");
$rs=$DB->query("SELECT type,channel,money from pre_order where status=1 and date>='$lastday' and date<'$today'");
foreach($paytype as $id=>$type){
$order_paytype[$id]=0;
}
foreach($channel as $id=>$type){
$order_channel[$id]=0;
}
while($row = $rs->fetch())
{
$order_paytype[$row['type']]+=$row['money'];
$order_channel[$row['channel']]+=$row['money'];
}
foreach($order_paytype as $k=>$v){
$order_paytype[$k] = round($v,2);
}
foreach($order_channel as $k=>$v){
$order_channel[$k] = round($v,2);
}
$allmoney=0;
foreach($order_paytype as $money){
$allmoney+=$money;
}
$order_lastday['all']=round($allmoney,2);
$order_lastday['paytype']=$order_paytype;
$order_lastday['channel']=$order_channel;
$CACHE->save('order_'.$day, serialize($order_lastday), 604830);
saveSetting('order_time', $date);
$DB->exec("update pre_channel set daystatus=0");
exit($day.'订单统计与清理任务执行成功');
}
elseif($_GET['do']=='notify'){
$limit = 20; //每次重试的订单数量
for($i=0;$i<$limit;$i++){
$srow=$DB->getRow("SELECT * FROM pre_order WHERE (TO_DAYS(NOW()) - TO_DAYS(endtime) <= 1) AND notify>0 AND notifytime<NOW() LIMIT 1");
if(!$srow)break;
//通知时间:1分钟,3分钟,20分钟,1小时,2小时
$notify = $srow['notify'] + 1;
if($notify == 2){
$interval = '2 minute';
}elseif($notify == 3){
$interval = '16 minute';
}elseif($notify == 4){
$interval = '36 minute';
}elseif($notify == 5){
$interval = '1 hour';
}else{
$DB->exec("UPDATE pre_order SET notify=-1,notifytime=NULL WHERE trade_no='{$srow['trade_no']}'");
continue;
}
$DB->exec("UPDATE pre_order SET notify={$notify},notifytime=date_add(now(), interval {$interval}) WHERE trade_no='{$srow['trade_no']}'");
$url=creat_callback($srow);
if(do_notify($url['notify'])){
$DB->exec("UPDATE pre_order SET notify=0,notifytime=NULL WHERE trade_no='{$srow['trade_no']}'");
echo $srow['trade_no'].' 重新通知成功<br/>';
}else{
echo $srow['trade_no'].' 重新通知失败(第'.$notify.'次)<br/>';
}
}
echo 'ok!';
}
elseif($_GET['do']=='notify2'){
$limit = 20; //每次重试的订单数量
for($i=0;$i<$limit;$i++){
$srow=$DB->getRow("SELECT * FROM pre_order WHERE (TO_DAYS(NOW()) - TO_DAYS(endtime) <= 1) AND notify=-1 LIMIT 1");
if(!$srow)break;
$url=creat_callback($srow);
if(do_notify($url['notify'])){
$DB->exec("UPDATE pre_order SET notify=0,notifytime=NULL WHERE trade_no='{$srow['trade_no']}'");
echo $srow['trade_no'].' 重新通知成功<br/>';
}else{
echo $srow['trade_no'].' 重新通知失败<br/>';
}
}
echo 'ok!';
}
elseif($_GET['do']=='profitsharing'){
\lib\ProfitSharing\CommUtil::task();
echo 'ok!';
}
elseif($_GET['do']=='check'){
if($conf['auto_check_channel'] == 1){
$second = intval($conf['check_channel_second']);
$failcount = intval($conf['check_channel_failcount']);
if($second==0 || $failcount==0)exit('未开启支付通道检查功能');
$channels = $DB->getAll("SELECT * FROM pre_channel WHERE status=1 ORDER BY id ASC");
foreach($channels as $channel){
$channelid = $channel['id'];
$orders=$DB->getAll("SELECT trade_no,status FROM pre_order WHERE addtime>=DATE_SUB(NOW(), INTERVAL {$second} SECOND) AND channel='$channelid' order by trade_no desc limit {$failcount}");
if(count($orders)<$failcount)continue;
$succount = 0;
foreach($orders as $order){
if($order['status']>0) $succount++;
}
if($succount == 0){
$DB->exec("UPDATE pre_channel SET status=0 WHERE id='$channelid'");
echo '已关闭通道:'.$channel['name'].'<br/>';
if($conf['check_channel_notice'] == 1){
$mail_name = $conf['mail_recv']?$conf['mail_recv']:$conf['mail_name'];
send_mail($mail_name,$conf['sitename'].' - 支付通道自动关闭提醒','尊敬的管理员:支付通道“'.$channel['name'].'”因在'.$second.'秒内连续出现'.$failcount.'个未支付订单,已被系统自动关闭!<br/>----------<br/>'.$conf['sitename'].'<br/>'.date('Y-m-d H:i:s'));
}
}
}
echo '支付通道检查任务已完成<br/>';
}
if($conf['auto_check_sucrate'] == 1){
$second = intval($conf['check_sucrate_second']);
$count = intval($conf['check_sucrate_count']);
$sucrate = floatval($conf['check_sucrate_value']);
if($second==0 || $count==0 || $sucrate==0)exit('未开启商户订单成功率检查功能');
//统计指定时间内每个商户的总订单数量
$user_all_stats_rows=$DB->getAll("SELECT uid,count(*) ordernum FROM pre_order WHERE addtime>=DATE_SUB(NOW(), INTERVAL {$second} SECOND) GROUP BY uid");
//统计指定时间内每个商户的成功订单数量
$user_suc_stats_rows=$DB->getAll("SELECT uid,count(*) ordernum FROM pre_order WHERE addtime>=DATE_SUB(NOW(), INTERVAL {$second} SECOND) and status>0 GROUP BY uid");
$user_suc_stats = [];
foreach($user_suc_stats_rows as $row){
if(!$row['uid']) continue;
$user_suc_stats[$row['uid']] = $row['ordernum'];
}
foreach($user_all_stats_rows as $row){
if(!$row['uid']) continue;
$total_num = intval($row['ordernum']);
$succ_num = intval($user_suc_stats[$row['uid']]);
$user_rate = round($succ_num * 100 / $total_num, 2);
if($total_num >= $count && $user_rate < $sucrate){
$userrow = $DB->find('user', 'uid,email,pay', ['uid'=>$row['uid']]);
if($userrow['pay'] == 1){
$DB->exec("UPDATE pre_user SET pay=0 WHERE uid='{$row['uid']}'");
echo 'UID:'.$row['uid'].' 订单成功率'.$user_rate.'%('.$succ_num.'/'.$total_num.'),已关闭支付权限<br/>';
$DB->exec("INSERT INTO `pre_risk` (`uid`, `type`, `content`, `date`) VALUES (:uid, 1, :content, NOW())", [':uid'=>$row['uid'],':content'=>$user_rate.'%('.$succ_num.'/'.$total_num.')']);
if($conf['check_sucrate_notice'] == 1){
send_mail($userrow['email'],$conf['sitename'].' - 商户支付权限关闭提醒','尊敬的用户:你的商户ID '.$userrow['uid'].' 因在'.$second.'秒内订单支付成功率低于'.$sucrate.'%,已被系统自动关闭支付权限!如有疑问请联系网站客服。<br/>当前订单支付成功率:'.$user_rate.'%(总订单数:'.$succ_num.',成功订单数:'.$total_num.')<br/>----------<br/>'.$conf['sitename'].'<br/>'.date('Y-m-d H:i:s'));
}
}
}
}
echo '商户订单成功率检查任务已完成<br/>';
}
} |