200, 'msg'=>'环境自检报告', 'data'=>$checks], JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE); exit; } // --- 1. 登录 --- if ($action == 'login') { $u=$_POST['username']??''; $p=$_POST['password']??''; if ($u===$admin_username && $p===$admin_password) { $_SESSION['is_admin']=true; echo json_encode(['code'=>200,'msg'=>'ok']); } else { echo json_encode(['code'=>401,'msg'=>'error']); } exit; } // --- 2. 设置 --- if ($action == 'get_settings') { $d=['shop_name'=>'极速达','logo_img'=>'https://via.placeholder.com/150','notice'=>'...','banner_img'=>'','jump_url'=>'#']; $s=json_decode(file_get_contents(SET_PATH),true); if(is_array($s))$d=array_merge($d,$s); echo json_encode(['code'=>200,'data'=>$d]); exit; } // --- 3. 搜索 --- if ($action == 'search') { $phone = trim($_POST['phone'] ?? ''); $page = intval($_POST['page']??1); $limit = 10; // 演示号 if ($phone === '13800138000') { echo json_encode(['code'=>200, 'data'=>[[ 'phone'=>'13800138000','address'=>'演示地址','register_time'=>'11-30','tracking_number'=>'SF888','showAll'=>false, 'logistics'=>[['time'=>date('Y-m-d H:i'), 'status'=>'【已签收】演示数据']] ]], 'total'=>1, 'hasMore'=>false]); exit; } $content = file_get_contents(DATA_PATH); // 移除BOM头,防止json解析失败 $content = preg_replace('/^\xEF\xBB\xBF/', '', $content); $all = json_decode($content, true); if (!is_array($all)) $all = []; $matched = []; foreach (array_reverse($all) as $item) { if ($item['phone'] == $phone) $matched[] = $item; } $total = count($matched); $list = array_slice($matched, ($page-1)*$limit, $limit); foreach ($list as &$item) { $item['logistics'] = getLogistics($item['tracking_number'], $item['phone'], $kuaidi100_customer, $kuaidi100_key); } echo json_encode(['code'=>200, 'data'=>$list, 'total'=>$total, 'hasMore'=>($page*$limit)<$total]); exit; } // --- 🚀 核心物流函数 (V37 修正版) --- function getLogistics($num, $phone, $c, $k) { if (empty($num)) return [['time'=>'--', 'status'=>'无单号']]; if (empty($c) || $c == '你的Customer') return [['time'=>date('Y-m-d H:i'), 'status'=>'【后台】API未配置']]; // 1. 智能识别 $autoUrl = "http://www.kuaidi100.com/autonumber/auto?num=$num&key=$k"; $autoRes = httpRequest($autoUrl); // 容错处理:如果请求空,可能是网络问题 if (!$autoRes) return [['time'=>date('Y-m-d H:i'), 'status'=>'网络请求失败,请检查服务器网络']]; $autoData = json_decode($autoRes, true); // 容错处理:如果返回不是数组,或者含有returnCode错误码 if (empty($autoData) || isset($autoData['returnCode']) || !isset($autoData[0]['comCode'])) { $msg = $autoData['message'] ?? '单号识别失败(请检查Key/单号)'; return [['time'=>date('Y-m-d H:i'), 'status'=>"⚠️ $msg"]]; } $comCode = $autoData[0]['comCode']; // 2. 查询 $paramArr = ['com' => $comCode, 'num' => $num]; if ($comCode == 'shunfeng') $paramArr['phone'] = $phone; $param = json_encode($paramArr); $sign = strtoupper(md5($param . $k . $c)); $postData = ['customer'=>$c, 'sign'=>$sign, 'param'=>$param]; $res = httpRequest('https://poll.kuaidi100.com/poll/query.do', $postData); $data = json_decode($res, true); $logs = []; if (isset($data['message']) && $data['message'] == 'ok' && !empty($data['data'])) { foreach ($data['data'] as $t) { $logs[] = ['time' => $t['time'], 'status' => $t['context']]; } } else { $msg = $data['message'] ?? '暂无轨迹'; $logs[] = ['time'=>date('Y-m-d H:i'), 'status'=>"⚠️ $msg"]; } return $logs; } // 增强版 CURL function httpRequest($url, $postData = null) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); // 允许重定向 curl_setopt($ch, CURLOPT_TIMEOUT, 10); if ($postData) { curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($postData)); } $res = curl_exec($ch); curl_close($ch); return $res; } function checkAdmin() { if(!isset($_SESSION['is_admin'])){echo json_encode(['code'=>403]);exit;} } // --- 其他后台接口 --- if($action=='admin_list'){checkAdmin();$p=max(1,intval($_GET['page']??1));$l=20;$all=json_decode(file_get_contents(DATA_PATH),true);if(!is_array($all))$all=[];$all=array_reverse($all);echo json_encode(['code'=>200,'data'=>['list'=>array_slice($all,($p-1)*$l,$l),'total'=>count($all),'page'=>$p,'limit'=>$l]]);exit;} if($action=='import_data_json'){checkAdmin();$in=json_decode(file_get_contents('php://input'),true);$curr=json_decode(file_get_contents(DATA_PATH),true);if(!is_array($curr))$curr=[];$c=0;$pre=[];foreach($in as $row){if(!empty($row['phone'])){$t=trim($row['time']??'');if(is_numeric($t)&&$t>40000)$t=gmdate("m-d",($t-25569)*86400);elseif(!empty($t))$t=date('m-d',strtotime(str_replace(['.','/'],'-',$t)));else $t=date('m-d');$ni=['id'=>uniqid(),'phone'=>trim($row['phone']),'address'=>trim($row['address']??''),'register_time'=>$t,'tracking_number'=>trim($row['no']??''),'upload_time'=>date('Y-m-d H:i:s')];$curr[]=$ni;$c++;if($c<=50)$pre[]=$ni;}}file_put_contents(DATA_PATH,json_encode($curr,JSON_UNESCAPED_UNICODE));echo json_encode(['code'=>200,'msg'=>"导入{$c}条",'preview'=>$pre]);exit;} if($action=='admin_stats'){checkAdmin();$all=json_decode(file_get_contents(DATA_PATH),true);$t=date('m-d');$tc=0;$m=[];if(is_array($all))foreach($all as $i){if(strpos($i['upload_time'],date('Y-m-d'))!==false)$tc++;$p=dp($i['address']);if($p){if(!isset($m[$p]))$m[$p]=0;$m[$p]++;}}$md=[];foreach($m as $k=>$v)$md[]=['name'=>$k,'value'=>$v];echo json_encode(['code'=>200,'data'=>['today'=>$tc,'total'=>is_array($all)?count($all):0,'mapData'=>$md]]);exit;} function dp($s){$m=['北京'=>'北京','天津'=>'天津','上海'=>'上海','重庆'=>'重庆','河北'=>'河北','山西'=>'山西','辽宁'=>'辽宁','吉林'=>'吉林','黑龙江'=>'黑龙江','江苏'=>'江苏','浙江'=>'浙江','安徽'=>'安徽','福建'=>'福建','江西'=>'江西','山东'=>'山东','河南'=>'河南','湖北'=>'湖北','湖南'=>'湖南','广东'=>'广东','海南'=>'海南','四川'=>'四川','贵州'=>'贵州','云南'=>'云南','陕西'=>'陕西','甘肃'=>'甘肃','青海'=>'青海','台湾'=>'台湾','内蒙古'=>'内蒙古','广西'=>'广西','西藏'=>'西藏','宁夏'=>'宁夏','新疆'=>'新疆','香港'=>'香港','澳门'=>'澳门'];foreach($m as $k=>$v){if(mb_strpos($s,$k)!==false)return $v;}return null;} if($action=='admin_delete'){checkAdmin();$id=$_POST['id'];$all=json_decode(file_get_contents(DATA_PATH),true);$n=[];foreach($all as $i)if($i['id']!==$id)$n[]=$i;file_put_contents(DATA_PATH,json_encode($n,JSON_UNESCAPED_UNICODE));echo json_encode(['code'=>200,'msg'=>'ok']);exit;} if($action=='admin_clear_all'){checkAdmin();file_put_contents(DATA_PATH,json_encode([]));echo json_encode(['code'=>200,'msg'=>'ok']);exit;} if($action=='save_settings'){checkAdmin();$c=json_decode(file_get_contents(SET_PATH),true);foreach($_POST as $k=>$v)$c[$k]=$v;file_put_contents(SET_PATH,json_encode($c,JSON_UNESCAPED_UNICODE));echo json_encode(['code'=>200,'msg'=>'ok']);exit;} if($action=='upload_logo'){checkAdmin();if($_FILES['logo']['error']==0){$n='logo_'.time().'.png';move_uploaded_file($_FILES['logo']['tmp_name'],$n);$c=json_decode(file_get_contents(SET_PATH),true);$c['logo_img']=$n;file_put_contents(SET_PATH,json_encode($c,JSON_UNESCAPED_UNICODE));echo json_encode(['code'=>200,'msg'=>'ok','url'=>$n]);}exit;} ?>