-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathcron.php
319 lines (301 loc) · 12.9 KB
/
cron.php
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
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
<?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'){
$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 settle=1 and status=1 and account is not null and username is not null");
$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'] > 0){
if($group['settle_open'] == 2) continue;
}elseif($conf['settle_open']!=1 && $conf['settle_open']!=3) continue;
if(isset($group['settle_rate'])) $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);
}
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,realmoney,profitmoney from pre_order where status=1 and date>='$lastday' 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 $money){
$allmoney+=$money;
}
$allprofit=0;
foreach($profit_paytype as $money){
$allprofit+=$money;
}
$order_lastday['all']=round($allmoney,2);
$order_lastday['profit_all']=round($allprofit,2);
$order_lastday['paytype']=$order_paytype;
$order_lastday['channel']=$order_channel;
$order_lastday['profit_paytype']=$profit_paytype;
$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/>';
}
}
elseif($_GET['do']=='complain'){
$channelid = intval($_GET['channel']);
$source = isset($_GET['source'])?intval($_GET['source']):1;
$num = 20;
$channel=\lib\Channel::get($channelid);
if(!$channel)exit('当前支付通道不存在');
$channel['source'] = $source;
if($channel['plugin'] == 'alipaysl' && substr($channel['appmchid'],0,1)=='['){
$uid = [];
$subchannels = [];
$orders = $DB->getAll("SELECT DISTINCT uid,subchannel FROM pre_order WHERE channel='$channelid' AND date>='".date("Y-m-d",strtotime("-7 day"))."'");
foreach($orders as $row){
if(!in_array($row['uid'], $uid) && $row['subchannel'] == 0)$uid[] = $row['uid'];
if($row['subchannel'] > 0)$subchannels[] = $row['subchannel'];
}
$exist = false;
if(count($uid)>0){
$users = $DB->getAll("SELECT uid,channelinfo FROM pre_user WHERE uid IN (".implode(',',$uid).")");
foreach($users as $user){
if(empty($user['channelinfo'])) continue;
$channel=\lib\Channel::get($channelid, $user['channelinfo']);
$channel['source'] = $source;
$model = \lib\Complain\CommUtil::getModel($channel);
$result = $model->refreshNewList($num);
echo $user['uid'].':'.$result['msg'].'<br/>';
}
$exist = true;
}
if(count($subchannels)>0){
foreach($subchannels as $subchannel){
$channel=\lib\Channel::getSub($subchannel);
$channel['source'] = $source;
$model = \lib\Complain\CommUtil::getModel($channel);
$result = $model->refreshNewList($num);
echo $user['uid'].':'.$result['msg'].'<br/>';
}
$exist = true;
}
if(!$exist)exit('当前支付通道暂无订单');
exit;
}
$model = \lib\Complain\CommUtil::getModel($channel);
if(!$model)exit('不支持该支付插件');
$result = $model->refreshNewList($num);
echo $result['msg'];
}
elseif($_GET['do']=='complain_complete'){
$interval = 5 * 60; //延迟处理时间(秒)
$limit = 10; //每次处理的投诉数量
$complain = $DB->getAll("SELECT * FROM pre_complain WHERE status=1 AND paytype=2 AND edittime<DATE_SUB(NOW(), INTERVAL {$interval} SECOND) AND addtime>DATE_SUB(NOW(), INTERVAL 3 DAY) ORDER BY id ASC LIMIT {$limit}");
foreach($complain as $row){
$channel = \lib\Channel::get($row['channel']);
if(!$channel)continue;
$channel['thirdmchid'] = $row['thirdmchid'];
$model = \lib\Complain\CommUtil::getModel($channel);
if(!$model)continue;
$result = $model->complete($row['thirdid']);
if($result['code'] == 0){
$DB->exec("UPDATE pre_complain SET status=1 WHERE id='{$row['id']}'");
echo '投诉单号:'.$row['thirdid'].' 处理成功<br/>';
}else{
echo '投诉单号:'.$row['thirdid'].' 处理失败,原因:'.$result['msg'].'<br/>';
}
}
echo '投诉自动处理('.count($complain).')';
}
elseif($_GET['do']=='plugin'){
$channelid = isset($_GET['channel'])?intval($_GET['channel']):0;
$channel = \lib\Channel::get($channelid);
if(!$channel) exit('当前支付通道不存在');
try{
\lib\Plugin::loadForAdmin('_cron');
}catch(Exception $e){
echo $e->getMessage();
}
}