save = new Save(false, 'cookie'); /* $save_type = $this->save_type = Dever::config('base', 'project')->mobileCode['save']; if ($this->save_type == 'db') { $save_type = 'session'; } */ $save_type = 'session'; $this->save = new Save(false, $save_type); } # 返回加密的用户信息 public function getSign($uid, $vid = false, $mobile = false) { if ($vid) { $data['vid'] = $vid; } if ($mobile) { $data['mobile'] = $mobile; } $data['uid'] = $uid; $data['signature'] = Dever::login($uid); return $data; } # 注册用户 public function reg($type, $system_source, $data) { $user = $this->getUserExtInfo($data); $user['source_type'] = $type; $user['system_source'] = $system_source; $user['system_id'] = isset($data['system']) ? $data['system'] : 1; if (isset($data['username'])) { $user['temp'] = 2; $user['username'] = $data['username']; } else { $user['temp'] = 1; $user['username'] = '临时用户'; } if (isset($data['mobile'])) { $user['bind'] = 1; $user['mobile'] = $data['mobile']; } else { $user['bind'] = 2; $user['mobile'] = ''; } $uid = Dever::db('passport/user')->insert($user); if ($user['system_id']) { $this->setSystem($uid, $user['system_id']); } $this->invite($uid); $this->createUsername($uid, $user['username'], true); if (Dever::config('base', 'project')->regAction) { $user['id'] = $uid; Dever::load(Dever::config('base', 'project')->regAction, $user); } return $uid; } # 更新用户 public function updateUser($uid, $data) { $user = $this->getUserExtInfo($data); $user['username'] = $this->createUsername($uid, $data['username']); if (isset($user) && $user) { $user['where_id'] = $uid; Dever::db('passport/user')->update($user); } return $uid; } private function getUserExtInfo($data) { $user = array(); if (isset($data['sex'])) { $user['sex'] = $data['sex']; } if (isset($data['avatar']) && $data['avatar']) { //$update['avatar'] = $this->saveAvatar($pic); $user['avatar'] = $data['avatar']; } else { # 获取默认头像 $where = array(); if (isset($user['sex']) && $user['sex']) { $where['sex'] = $user['sex'] . ',4'; } $avatar = Dever::db('passport/avatar')->rand($where); if ($avatar) { $user['avatar_id'] = $avatar['id']; } } if (isset($data['city'])) { $user['city'] = $data['city']; } if (isset($data['province'])) { $user['province'] = $data['province']; } if (isset($data['country'])) { $user['country'] = $data['country']; } if (isset($user['country']) && isset($user['province']) && isset($user['city'])) { $user['set_area'] = $user['country'] .','. $user['province'] .','. $user['city']; } return $user; } public function wechat($data, $user = array(), $account, $system, $source_type, $system_source, $source = false, $invite = false, $uid = false) { if ($uid <= 0) { $uid = false; } if (!$data['openid']) { Dever::alert('错误的openid'); } if (!isset($user['username'])) { Dever::alert('用户名错误'); } if (isset($user['sex'])) { if ($user['sex'] != 1 && $user['sex'] != 2) { $user['sex'] = 3; } } if (isset($user['country']) && $user['country'] && isset($user['province']) && $user['province'] && isset($user['city']) && $user['city']) { $user['area'] = $user['country'] .','. $user['province'] .','. $user['city']; } $info = Dever::db('passport/wechat')->one(array('openid' => $data['openid'])); if (!$info) { if (isset($data['unionid']) && $data['unionid']) { $info = Dever::db('passport/wechat')->one(array('unionid' => $data['unionid'])); if ($info) { $uid = $info['uid']; } $wechat['unionid'] = $data['unionid']; } if (!$uid) { $user['source_type'] = 'service';//即将废弃 $user['system_source'] = 6; if ($system) { $user['system_id'] = $system; } if ($source_type) { $user['source_type'] = $source_type; } if ($system_source) { $user['system_source'] = $system_source; } $uid = Dever::db('passport/user')->insert($user); } else { $user['where_id'] = $uid; Dever::db('passport/user')->update($user); } $wechat['access_token'] = $data['access_token']; $wechat['openid'] = $data['openid']; $wechat['expires_in'] = $data['expires_in']; $wechat['refresh_token'] = $data['refresh_token']; if ($account) { $wechat['account_id'] = $account; } if ($system) { $wechat['system_id'] = $system; } $wechat['uid'] = $uid; # 此处整个废弃 if ($source_type) { # 默认为公众号 $wechat['type'] = 2;//即将废弃,统一 $wechat['system_source'] = 6; if ($source_type == 'applet') { $wechat['type'] = 1;//即将废弃,统一 $wechat['system_source'] = 5; } elseif ($source_type == 'ios') { $wechat['type'] = 3;//即将废弃,统一 $wechat['system_source'] = 3; } elseif ($source_type == 'android') { $wechat['type'] = 4;//即将废弃,统一 $wechat['system_source'] = 2; } } if ($system_source) { $wechat['system_source'] = $system_source; } $id = Dever::db('passport/wechat')->insert($wechat); if (Dever::project('source') && isset($source) && $source && $source > 0) { Dever::load('source/lib/core')->saveUser($id, $uid, $source, 'oauth', $account); } } else { $uid = $info['uid']; if (isset($data['unionid']) && $data['unionid']) { $wechat['unionid'] = $data['unionid']; # 判断用户是否存在,是否需要合并 //$wechat['uid'] = $this->combine($uid, $data['unionid']); } $wechat['access_token'] = $data['access_token']; $wechat['openid'] = $data['openid']; $wechat['expires_in'] = $data['expires_in']; $wechat['refresh_token'] = $data['refresh_token']; $wechat['where_id'] = $info['id']; if ($account) { $wechat['account_id'] = $account; } if ($system) { $wechat['system_id'] = $system; } $id = $info['id']; //Dever::db('passport/wechat')->update($wechat); $user['where_id'] = $uid; //Dever::load('passport/user-update', $user); } $this->createUsername($uid, $user['username']); $user = Dever::load('passport/user-one', $uid); if ($system) { $this->setSystem($uid, $system); } $this->save($user); $user['uid'] = $user['id']; $user['signature'] = Dever::login($user['id']); return $user; } public function setSystem($uid, $system) { $where['uid'] = $uid; $where['system_id'] = $system; $one = Dever::db('passport/user_system')->find($where); if (!$one) { Dever::db('passport/user_system')->insert($where); } } public function setProfession($uid, $profession) { $where['uid'] = $uid; $where['profession'] = $system; $one = Dever::db('passport/user_profession')->find($where); if (!$one) { Dever::db('passport/user_profession')->insert($where); } } /** * 更新用户信息 绑定用户手机号 * * @return mixed */ public function bind_mobile() { $uid = $this->check(); //$code = Dever::input('mcode'); $mobile = Dever::load('passport/reg')->checkMobileExists(); //$mobile = Dever::input('mobile'); if ($mobile && $uid) { $info = Dever::load('passport/user-one', array('mobile' => $mobile)); if ($info && $info['bind'] == 1) { Dever::alert('该手机号已绑定'); } $uid = $this->combine($uid, $mobile, 'mobile'); $info = Dever::load('passport/user-one', $uid); $result['mobile'] = $mobile; if ($info) { $update['set_mobile'] = $mobile; $update['set_bind'] = 1; $update['where_id'] = $uid; Dever::load('passport/user-update', $update); $state = Dever::config('base', 'project')->regSendSms; if ($state) { Dever::setInput('skin', $state); $this->send($mobile, $uid); } } else { Dever::alert('无效的用户id,请重新登录'); } } if (!$info['mobile']) { Dever::score($uid, 'bind_mobile', '绑定手机号'); } $result['uid'] = $uid; $result['signature'] = Dever::login($uid); return $result; } public function createUsername($uid, $username, $update = false) { if (!$username || $username == '临时用户') { $username = $uid + 100000; $username = 'G' . $username; if ($update) { Dever::db('passport/user')->update(array('where_id' => $uid, 'username' => $username)); } } return $username; } # 合并用户 public function combine($uid, $unionid, $col = 'unionid') { $cur = $uid; if ($col == 'mobile' || $col == 'id') { $user_wechat = Dever::load('passport/user-all', array($col => $unionid)); } else { $user_wechat = Dever::load('passport/wechat-getByUnionid', array($col => $unionid)); } if ($user_wechat) { # 合并去 $drop = array(); $total = count($user_wechat); if ($total <= 1) { return $cur; } $new = false; foreach ($user_wechat as $k => $v) { if (!isset($v['uid'])) { $v['uid'] = $v['id']; $user = $v; } else { $user = Dever::db('passport/user')->one($v['uid']); $user['uid'] = $user['id']; } if (!$new) { if ($user['bind'] == 1 && !strstr($user['username'], '****')) { $new = $user; } elseif ($user['temp'] == 2 && $user['system_source'] == 5) { $new = $user; } elseif ($user['temp'] == 2 && $user['source_type'] == 'applet') { $new = $user; } elseif ($user['avatar']) { $new = $user; } elseif ($user['mobile']) { $new = $user; } else { $drop[$user['uid']] = $user; } } else { $drop[$user['uid']] = $user; } } $cur = $new; if (Dever::input('test') == 1) { print_r($user_wechat); print_r($cur); print_r($drop);die; } # 异步处理 $this->updateCombine($cur, $drop); $cur = $new['uid']; } return $cur; } private function updateCombine($new, $drop) { # 队列 //Dever::queue(); if (isset($drop[$new['uid']])) { unset($drop[$new['uid']]); } $drops = array(); if ($drop) { foreach ($drop as $k => $v) { $drops[] = $k; $update = array(); if (!$new['username'] && $v['username']) { $update['username'] = $v['username']; } elseif (strstr($new['username'], '****') && $v['username']) { $update['username'] = $v['username']; } if (!$new['avatar'] && $v['avatar']) { $update['avatar'] = $v['avatar']; } if (!$new['mobile'] && $v['mobile']) { $update['mobile'] = $v['mobile']; } if (!$new['area'] && $v['area']) { $update['area'] = $v['area']; } if (isset($update) && $update) { $update['where_id'] = $new['uid']; Dever::load('passport/user-update', $update); } } if ($drops) { asort($drops); $drop_uid = implode(',', $drops); //Dever::load('passport/lib/base.handleCombine?new_uid=' . $new['uid'] . '&old_uid=' . $drop_uid); Dever::daemon('lib/base.handleCombine?new_uid=' . $new['uid'] . '&old_uid=' . $drop_uid, 'passport'); } } } public function handleCombine() { $combine = array(); $combine['status'] = 1; $combine['new_uid'] = Dever::input('new_uid'); $combine['old_uid'] = Dever::input('old_uid'); $info = Dever::db('passport/combine')->one($combine); if (!$info) { Dever::db('passport/combine')->insert($combine); } Dever::load('passport/user-updates', array('set_state' => 2, 'where_id' => $combine['old_uid'])); Dever::load('passport/wechat-updates', array('set_uid' => $combine['new_uid'], 'where_uid' => $combine['old_uid'])); } /** * 检测用户有效性 * * @return mixed */ public function check($state = true, $name = 'signature') { $signature = Dever::input($name); $user = Dever::checkLogin($signature, $state); if ($state && !isset($user['uid'])) { Dever::alert('user error'); } if (isset($user['uid']) && $user['uid']) { return $user['uid']; } return -1; } public function getToken($request = array()) { return http_build_query(Dever::token($request)); } public function getUrl($method, $request = array()) { return Dever::proxy($method, $this->getToken($request)); } protected function info() { $data = $this->save->get(self::NAME); return $data; } public function code($code = false, $image = true) { if ($code) { $save = $this->save->get(self::CODE); $state = $code == $save; if ($state) { //$this->save->un(self::CODE); } return $state; } if ($image) { $code = new Code(); $code->create(); $code = $code->code; } else { $code = Dever::code(); } $this->save->add(self::CODE, $code, 86400); return $code; } public function mcode($mobile, $code = false, $update = 1) { if (Dever::project('sms')) { $send['skin'] = 'code'; $send['mobile'] = $mobile; if ($code) { $send['code'] = $code; $send['update'] = $update; return Dever::load('sms/api')->checkCode($send['skin'], $send['mobile'], $send['code'], $send['update']); } else { $send['state'] = true; return Dever::load('sms/api.sendCode', $send); } } $day = date('Ymd', time()); # 检测当前手机号最新一次发送时间,不允许一分钟之内发送 $param['option_day'] = $day; $param['option_mobile'] = $mobile; if ($code) { if ($this->save_type == 'db') { $check = Dever::db('passport/code')->getNew($param); if ($check) { return $mobile . '_' . $code == $check['mobile'] . '_' . $check['code']; } return false; } else { $save = $this->save->get(self::MCODE); return $mobile . '_' . $code == $save; } } # 检测当前手机号今天已经发送多少验证码了 $info = Dever::load('passport/code-total', $param); if ($info >= 1) { $check = Dever::db('passport/code')->getNew($param); if ($check) { if (time() - $check['cdate'] < Dever::config('base', 'project')->mobileCode['time']) { Dever::alert('请不要在一分钟之内申请多次验证码,请您稍后再试'); } } } $total = Dever::config('base', 'project')->mobileCode['total']; if ($info >= $total) { Dever::alert('很抱歉,您已经申请获取验证码超过' . $total . '次,今天您已经无法获取验证码了,请您明天再来'); } $code = new Code(); $code->createM(); # 记录当前的验证码 $insert['add_mobile'] = $mobile; $insert['add_day'] = $day; $insert['add_code'] = $code->mcode; $id = Dever::load('passport/code-insert', $insert); # 启动发送 $this->send($mobile, $insert['add_code'], $id); if ($this->save_type != 'db') { $this->save->add(self::MCODE, $mobile . '_' . $code->mcode, Dever::config('base', 'project')->mobileCode['timeout']); } return $code->mcode; } public function send($mobile, $code, $id = false) { $url = Dever::config('base', 'project')->mobileCode['url']; if (!$url) { return; } $content = Dever::config('base', 'project')->mobileCode['body']; $content = $this->replace($content, $mobile, $code); parse_str($content, $param); $type = Dever::config('base', 'project')->mobileCode['method']; $json = Dever::config('base', 'project')->mobileCode['json']; $header = Dever::config('base', 'project')->mobileCode['header']; return Dever::curl($url, $param, $type, $json, $header); } private function replace($content, $mobile = '', $code = '') { $skin = Dever::config('base', 'project')->mobileCode['skin']; $skin_key = Dever::input('skin', 'code'); if (isset($skin[$skin_key])) { $skin = $skin[$skin_key]; } else { $skin = array_shift($skin); } $config = array('{code}', '{mobile}', '{sign}', '{skin}', '{param}'); $replace = array($code, $mobile, Dever::config('base', 'project')->mobileCode['sign'], $skin); return str_replace($config, $replace, $content); } protected function refer($state = false) { $refer = Dever::input('refer'); $project = 'main'; if ($refer) { if (!strstr($refer, 'http://')) { $refer = Encrypt::decode($refer); } /* $url = parse_url(Encrypt::decode($refer)); $url['path'] = preg_replace('/^\//', '', $url['path']); if (!isset($url['query'])) { $url['query'] = ''; } if (Uri::$type == '?') { $refer = Dever::url(str_replace($url['path'] . Uri::$type, '', $url['query']), $project); } else { $refer = Dever::url($url['path'] . '?' . $url['query'], $project); } */ } else { $refer = Dever::url('home', $project); } $param = Dever::input('param'); if ($param) { $refer .= '&' . $param; } if ($state) { return $refer; } Dever::out($refer); } protected function save($user) { if (is_numeric($user)) { $user = Dever::load('passport/user-one', $user); } if ($user && is_array($user)) { if (Dever::mobile()) { $time = 30; } else { $time = 7; } $this->save->add(self::NAME, $user, 3600 * 24 * $time); $user['signature'] = Dever::login($user['id']); $this->invite($user['id']); if (Dever::config('base', 'project')->regAction) { Dever::load(Dever::config('base', 'project')->regAction, $user); } return $user; } } protected function invite($uid) { $invite = Dever::input('invite'); if (Dever::project('invite') && $invite) { Dever::load('invite/api')->setRelation($uid, false, $invite); } } public function createRefer() { return 'refer=' . Encrypt::encode(Dever::url(false, 'main')); } protected function saveSex($sex) { if ($sex || $sex == 0) { $config_sex = Dever::config('base', 'project')->sex; if (isset($config_sex[$sex])) { $sex = $config_sex[$sex]; } else { if ($sex == '男') { $sex = 1; } elseif ($sex == '女') { $sex = 2; } elseif ($sex == '未知') { $sex = 3; } } } return $sex; } protected function saveAvatar($value) { if (!$value) { return ''; } $value = Dever::pic($value); $base = Dever::data(); $date = explode('-', date("Y-m-d")); if (is_array($value)) { $user = $value[1]; $value = $value[0]; if (is_array($value)) { $name = md5($value['tmp_name'] . rand(0, 100) . microtime()); $path = 'avatar/' . $date[0] . '/' . $date[1] . '/' . $date[2] . '/'; $ext = '.jpg'; $temp = Dever::path($base, $path . $name . $ext); move_uploaded_file($value['tmp_name'], $temp); $value = $temp; } } //$result = Dever::$global['host']['img'] . 'chead.jpg'; if ($value) { # 裁图 $handle = new Img(); $size = '200_200_2'; $user = isset($user) && $user ? $user : $this->init(); if ($user && isset($user['id']) && $user['id']) { $name = md5($user['id']); } else { $name = md5($value . rand(0, 100) . microtime()); } $path = 'avatar/' . $date[0] . '/' . $date[1] . '/' . $date[2] . '/'; $ext = '.jpg'; $file = Dever::path($base, $path . $name . $ext); $temp = $file . '.temp.jpg'; //$value = Dever::curl($value); //file_put_contents($temp, file_get_contents($value)); $file = $handle->thumb($value, $size, true, $file); if ($file) { $result = str_replace('/upload/', '/', Dever::config('host')->uploadRes . $path . $name . $ext); } else { $result = $value; } } return $result; } }