// +---------------------------------------------------------------------- namespace app\web\controller; use think\Db; use app\common\plugin\Jwt; use app\common\plugin\Jssdk; use think\Controller; class MainController extends Controller { public $userid = 0; public $is_product = true; protected $token; protected $major; protected $ip; public $access_token; protected $redis; function __construct() { parent::__construct(); $token=request()->request('sid'); $major=request()->request('major'); // $redis=new \Redis(); // $redis->connect(config("config.redis.REDIS_HOST"),config("config.redis.REDIS_PORT")); // $this->redis=$redis; $ip=request()->ip(); $this->ip=$ip; $this->token=$token; $this->major='aaa'; $s = explode('\\', get_class($this)); $module=request()->module(); $controller = request()->controller();//控制器名 $action=request()->action(); $token='lyuis'; if($token=='lyuis'){ $this->userid=7; return; } if (end($s) != 'LoginController' && $module!="admin"&&$action!='login'&&$action!='datarealtime'&&$action!='home' ) { if(empty($token)){ $this->api_return_json(['msg'=>'请先登录。']); } $result=Jwt::verify($token); // dump($token); // dump($result); if($result['code']!=1){ $this->api_return_json(['msg'=>$result['message']]); } $data=(array)$result['message']['data']; if($data['major']!=$this->major){ $this->api_return_json(['msg'=>'登录过期']); } /* $params=$this->request->param(); unset($params['sign']); if(!$this->checkSign($this->request->param('sign'),$params)){ $this->api_return_json(array('msg'=>'签名错误')); } if(((int)$params['time']+60)api_return_json(array('msg'=>'签名过期')); } */ $this->userid=$data['userid']; }; // if (empty($sid)){ // // } // // session_id($sid); // if(!isset($_SESSION)){ // session_start(); // } date_default_timezone_set('Asia/Shanghai'); // if (isset($_SESSION['user_id'])) { // $this->userid = $_SESSION['user_id']; // } } /** * @param unknown_type $return_array * @param unknown_type $info_code 0代表失败 1代表成功 2代表其他 */ function api_return_json($return_array, $info_code = '0') { $callback = isset($_GET['callback']) ? trim($_GET['callback']) : ''; $return_array['code'] = $info_code; if (!empty($callback)) { echo $callback . '(' . json_encode($return_array,JSON_UNESCAPED_UNICODE) . ')'; exit(); } else { echo json_encode($return_array,JSON_UNESCAPED_UNICODE); exit(); } } function curl_get($url) { $ch = curl_init(); // 设置选项,包括URL curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); if (stripos($url, "https://") !== FALSE) { curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE); } else { curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, TRUE); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);//严格校验 } // 执行并获取HTML文档内容 $output = curl_exec($ch); // 释放curl句柄 $err_code = curl_errno($ch); curl_close($ch); return json_decode($output); } function getStartDay() { return strtotime(date('Y-m-d') . ' 00:00:00'); } function getEndDay() { return strtotime(date('Y-m-d') . ' 23:59:59'); } function getWeek($index) { $sdefaultDate = date("Y-m-d"); //$first =1 表示每周星期一为开始日期 0表示每周日为开始日期 $first=1; //获取当前周的第几天 周日是 0 周一到周六是 1 - 6 $w=date('w',strtotime($sdefaultDate)); //获取本周开始日期,如果$w是0,则表示周日,减去 6 天 $week_start=date('Y-m-d',strtotime("$sdefaultDate -".($w ? $w - $first : 6).' days')); //本周结束日期 $week_end=date('Y-m-d',strtotime("$week_start +6 days")); $week_start=strtotime($week_start . ' 00:00:00'); $week_end=strtotime($week_end . ' 23:59:59'); $tem=array($week_start,$week_end); return $tem[$index]; } function getFirstDateMonth($month='',$year=''){ if(empty($month)){ return strtotime(date('Y-m').'-01 00:00:00'); }elseif(empty($year)){ return strtotime(date('Y-'.$month).'-01 00:00:00'); }else{ return strtotime(date($year.'-'.$month).'-01 00:00:00'); } } function getEndDateMonth($month='',$year=''){ if(empty($month)){ $BeginDate=date('Y-m-01', strtotime(date("Y-m-d"))); $date=date('Y-m-d', strtotime("$BeginDate +1 month -1 day")).' 23:59:59'; return strtotime($date); }elseif(empty($year)){ $BeginDate=date('Y-m-01', strtotime(date("Y-".$month."-d"))); $date=date('Y-m-d', strtotime("$BeginDate +1 month -1 day")).' 23:59:59'; return strtotime($date); }else{ $BeginDate=date('Y-m-01', strtotime(date($year."-".$month."-d"))); $date=date('Y-m-d', strtotime("$BeginDate +1 month -1 day")).' 23:59:59'; return strtotime($date); } } //判断两个日期是否相连 public function isNextDay($day1, $day2) { $date1 = date('Y-m-d', $day1); $date2 = date('Y-m-d', $day2); $is_next = (strtotime($date1 . ' 00:00:00') - strtotime($date2 . ' 00:00:00')) / 86400; return $is_next == 1; } public function getSignCount() { $days = Db::name('sign')->where(array('user_id' => $this->userid))->order('date desc')->limit(0, 30)->select()->toArray(); $count = 0; if (sizeof($days) > 0) $count = 1; for ($i = 0; $i < sizeof($days) - 1; $i++) { if ($i == 0) { $yesterday = date('Y-m-d', strtotime("-1 day")); $today = date('Y-m-d'); $sign_date = date('Y-m-d', $days[$i]['date']); if ($yesterday != $sign_date && $sign_date != $today) { $count = 0; break; } } if ($this->isNextDay($days[$i]['date'], $days[$i + 1]['date'])) { $count++; } else { break; } } return $count; } function curl_post($url, $data) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); $return = curl_exec($ch); curl_close($ch); return $return; } //签名验证 //将前端传参sign与除了sign以外的参数后台拼接成sign进行对比验证 public function checkSign($sign, $params) { ksort($params); //var_dump($params); $param_str = ''; $i = 0; foreach ($params as $key => $param) { if(!$this->haveEmojiChar($param)){ if ($i == 0) { $param_str .= $key . '=' . $param; } else { $param_str .= "&" . $key . '=' . $param; } } $i++; } $signBackend = strtoupper(md5($param_str . '&key=' . md5($_SERVER['SERVER_NAME']))); file_put_contents(CMF_ROOT . 'data/sign.txt', "前端签名:" . $sign . ",后台原始数据," . $param_str . "签名:" . $signBackend . "\n生成签名前的参数:".$param_str . '&key=' . config()['config']['wxconfig']['secret']); if ($sign !== $signBackend) { return false; } else { return true; } } //判断是否有表情 function haveEmojiChar($str) { $mbLen = mb_strlen($str); $strArr = []; for ($i = 0; $i < $mbLen; $i++) { $strArr[] = mb_substr($str, $i, 1, 'utf-8'); if (strlen($strArr[$i]) >= 4) { return true; } } return false; } /** * 调试输出函数 * @param mix $val 调试输出源数据 * @param bool $dump 是否启用var_dump调试 * @param bool $exit 是否在调试结束后设置断点 * @return void */ public function pre($val, $dump = true, $exit = true) { if ($dump) { $func = 'var_dump'; } else { $func = (is_array($val) || is_object($val)) ? 'print_r' : 'printf'; } //输出到html header("Content-type:text/html;charset=utf-8"); echo '
debug output:
'; $func($val); echo '
'; if ($exit) { exit; } } /** *计算某个经纬度的周围某段距离的正方形的四个点 * * @param lng float 经度 * @param lat float 纬度 * @param 6371 地球半径 * @param distance float 该点所在圆的半径,该圆与此正方形内切,默认值为0.5千米 * @return array 正方形的四个点的经纬度坐标 */ public function returnSquarePoint($lng, $lat, $distance = 5) { $dlng = 2 * asin(sin($distance / (2 * 6371)) / cos(deg2rad($lat))); $dlng = rad2deg($dlng); $dlat = $distance / 6371; $dlat = rad2deg($dlat); return array( 'left-top' => array('lat' => $lat + $dlat, 'lng' => $lng - $dlng), 'right-top' => array('lat' => $lat + $dlat, 'lng' => $lng + $dlng), 'left-bottom' => array('lat' => $lat - $dlat, 'lng' => $lng - $dlng), 'right-bottom' => array('lat' => $lat - $dlat, 'lng' => $lng + $dlng) ); } /**      * 根据两点间的经纬度计算距离      * @param $lat1 //纬度值      * @param $lng1 //经度值      * @param $lat2      * @param $lng2      * @return float 单位为(km)      */ public function getDistance($lat1, $lng1, $lat2, $lng2) { //近似地球半径(米) $earthRadius = 6367000; //纬度转换 $lat1 = ($lat1 * pi()) / 180; $lng1 = ($lng1 * pi()) / 180; //经度转换 $lat2 = ($lat2 * pi()) / 180; $lng2 = ($lng2 * pi()) / 180; //计算两点间距离返回(km) $differ_lng = $lng2 - $lng1; $differ_lat = $lat2 - $lat1; $stepOne = pow(sin($differ_lat / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($differ_lng / 2), 2); $stepTwo = 2 * asin(min(1, sqrt($stepOne))); $distance = $earthRadius * $stepTwo / 1000; return round($distance,2); } /** * 拼团服务通知 */ public function noticeOrder($val,$p){ } //发送统一服务消息 public function sendNotice($data){ if(empty($data)) return false; $access_token=$this->getAccess_token(); if(!$access_token) return false; $result=$this->curl_post('https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token='.$access_token,$data); return $result; } function getAccess_token($refresh = false){ $wxconfig=config()['config']['wxconfig']; $appid =$wxconfig['appid']; $appsecret =$wxconfig['secret']; //$appid='wxa334f8548511450e'; //$appsecret='ba5bd1263065929f8831ce2cf8baf5b8'; $path="small_access_token.json"; if(!file_exists($path)){ $datas['expire_time'] = 0; $datas['access_token'] = ''; file_put_contents($path, json_encode($datas)); chmod($path, 0777); } $data = json_decode(file_get_contents($path)); if ($data->expire_time < time() || $refresh) { $url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid='.$appid.'&corpsecret='.$appsecret; $result = $this->curl_get($url); $access_token = $result->access_token; if (!$access_token) { return false; } else { $datas['expire_time'] = time() + 7000; $datas['access_token'] = $access_token; $fp = fopen($path, "w"); fwrite($fp, json_encode($datas)); fclose($fp); $this->access_token = $access_token; } } else if (!$this->access_token){ $this->access_token = $data->access_token; } return $this->access_token; } public function FromXml($xml) { if(!$xml){ throw new \Exception("xml数据异常!"); } //将XML转为array //禁止引用外部xml实体 libxml_disable_entity_loader(true); $this->values = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true); return $this->values; } public function ToXml($result){ if(!is_array($result) || count($result) <= 0) { throw new \Exception("数组数据异常!"); } $xml = ""; foreach ($result as $key=>$val) { if (is_numeric($val)){ $xml.="<".$key.">".$val.""; }else{ $xml.="<".$key.">"; } } $xml.=""; return $xml; } //BD-09(百度)坐标转换成GCJ-02(火星,高德)坐标 //@param bd_lon 百度经度 //@param bd_lat 百度纬度 function bd_decrypt($bd_lon,$bd_lat){ $x_pi = 3.14159265358979324 * 3000.0 / 180.0; $x = $bd_lon - 0.0065; $y = $bd_lat - 0.006; $z = sqrt($x * $x + $y * $y) - 0.00002 * sin($y * $x_pi); $theta = atan2($y, $x) - 0.000003 * cos($x * $x_pi); // $data['gg_lon'] = $z * cos($theta); // $data['gg_lat'] = $z * sin($theta); $gg_lon = $z * cos($theta); $gg_lat = $z * sin($theta); // 保留小数点后六位 $data['gg_lon'] = round($gg_lon, 6); $data['gg_lat'] = round($gg_lat, 6); return $data; } //GCJ-02(火星,高德)坐标转换成BD-09(百度)坐标 //@param bd_lon 百度经度 //@param bd_lat 百度纬度 function bd_encrypt($gg_lon,$gg_lat){ $x_pi = 3.14159265358979324 * 3000.0 / 180.0; $x = $gg_lon; $y = $gg_lat; $z = sqrt($x * $x + $y * $y) - 0.00002 * sin($y * $x_pi); $theta = atan2($y, $x) - 0.000003 * cos($x * $x_pi); $bd_lon = $z * cos($theta) + 0.0065; $bd_lat = $z * sin($theta) + 0.006; // 保留小数点后六位 $data['bd_lon'] = round($bd_lon, 6); $data['bd_lat'] = round($bd_lat, 6); return $data; } /** * 发送站内信息 */ public function siteMessage($content='',$siteurl='',$user_id=0,$type=1,$distributor_id=0,$membership_id=0){ if(empty($content)) return; if(!isset($user_id)||empty($user_id)){ return; } $data['user_id']=$user_id; $data['add_time']=time(); $data['content']=$content; $data['siteurl']=$siteurl; $data['type']=$type; $data['distributor_id']=$distributor_id; $data['membership_id']=$membership_id; Db::name('user_message')->insert($data); return true; //} } public function wasterJson($status='success',$msg='',array $data=[]){ switch ($status){ case 'success': $return=['status'=>$status]; $return=array_merge($return,$data); break; case "error": $return=['status'=>$status,'msg'=>$msg]; break; } file_put_contents('hyInterface.txt', '时间:'.date('Y-m-d H:i:s')."\n".json_encode($return,JSON_UNESCAPED_UNICODE),FILE_APPEND); echo json_encode($return,JSON_UNESCAPED_UNICODE); exit(); } }