save = new Save(false, 'cookie'); } public function wechat($data, $user = array(), $account, $system, $source_type, $source = false) { $uid = false; if (!$data['openid']) { Dever::alert('错误的openid'); } if (!isset($user['username'])) { Dever::alert('用户名错误'); } if (isset($user['sex'])) { if ($user['sex'] == 1) { $user['sex'] = 1; } elseif ($user['sex'] == 2) { $user['sex'] = 2; } else { $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::load('passport/wechat-one', array('option_openid' => $data['openid'])); if (!$info) { if (isset($data['unionid']) && $data['unionid']) { $info = Dever::load('passport/wechat-one', array('unionid' => $data['unionid'])); if (!$info) { $uid = false; } else { $uid = $info['uid']; } $wechat['unionid'] = $data['unionid']; } if (!$uid) { $user['source_type'] = 'service'; if ($system) { $user['system_id'] = $system; } if ($source_type) { $user['source_type'] = $source_type; } $uid = Dever::load('passport/user-insert', $user); } else { $user['where_id'] = $uid; Dever::load('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']; $wechat['account_id'] = $account; if ($system) { $wechat['system_id'] = $system; } $wechat['uid'] = $uid; $wechat['type'] = 2; if ($source_type == 'applet') { $wechat['type'] = 1; } elseif ($source_type == 'ios') { $wechat['type'] = 3; } elseif ($source_type == 'android') { $wechat['type'] = 4; } $id = Dever::load('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']; $wechat['account_id'] = $account; if ($system) { $wechat['system_id'] = $system; } $id = $info['id']; Dever::load('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); $this->save($user); $user['uid'] = $user['id']; $user['signature'] = Dever::login($user['id']); return $user; } /** * 更新用户信息 绑定用户手机号 * * @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 = 'JM' . $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-state', array($col => $unionid)); } if ($user_wechat) { # 合并去 $drop = array(); 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']); } if ($cur != $v['uid']) { if ($user['bind'] == 1 || $user['temp'] == 2 || $user['avatar'] || $user['mobile'] || $v['uid'] < $cur) { $drop[$cur] = $cur; $cur = $v['uid']; } else { $drop[$v['uid']] = $v['uid']; } } } $test = Dever::input('test'); if ($test == 1) { print_r($cur); print_r($drop);die; } if ($drop) { foreach ($drop as $k => $v) { if ($cur == $v) { unset($drop[$k]); continue; } $insert['new_uid'] = $cur; $insert['old_uid'] = $v; $info = Dever::db('passport/combine')->one($insert); if (!$info) { Dever::db('passport/combine')->insert($insert); } Dever::load('passport/user-update', array('set_state' => 2, 'where_id' => $v)); Dever::load('passport/user-update', array('set_state' => 1, 'where_id' => $cur)); $new = Dever::db('passport/user')->one($cur); $old = Dever::db('passport/user')->one($v); $update = array(); if ($new['temp'] == 1) { $update['username'] = $old['username']; } if (strstr($new['username'], '****')) { $update['username'] = $old['username']; } if (!$new['avatar']) { $update['avatar'] = $old['avatar']; } if (!$new['mobile']) { $update['mobile'] = $old['mobile']; } if (!$new['area']) { $update['area'] = $old['area']; } if (isset($update) && $update) { $update['where_id'] = $cur; Dever::load('passport/user-update', $update); } } $combine = Dever::project('combine'); if ($combine && $drop) { $drop = implode(',', $drop); Dever::load('combine/lib/core.handle?uid=' . $cur . '&drop=' . $drop); //Dever::daemon('lib/core.handle?uid=' . $cur . '&drop=' . $drop, 'combine'); } } } return $cur; } /** * 检测用户有效性 * * @return mixed */ public function check($state = true) { $signature = Dever::input('signature'); $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; } protected function code($code = false) { if ($code) { $save = $this->save->get(self::CODE); return $code == $save; } $code = new Code(); $code->create(); $this->save->add(self::CODE, $code->code, 600); } protected function mcode($mobile, $code = false) { if ($code) { $save = $this->save->get(self::MCODE); return $mobile . '_' . $code == $save; } $day = date('Ymd', time()); # 检测当前手机号最新一次发送时间,不允许一分钟之内发送 $param['option_day'] = $day; $param['option_mobile'] = $mobile; # 检测当前手机号今天已经发送多少验证码了 $info = Dever::load('passport/code-total', $param); if ($info >= 1) { $check = Dever::load('passport/code-one', $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); $this->save->add(self::MCODE, $mobile . '_' . $code->mcode, Dever::config('base', 'project')->mobileCode['timeout']); return $code->mcode; } public function send($mobile, $code, $id = false) { if (Dever::project('sms')) { $send['skin'] = 'code'; $send['mobile'] = $mobile; $send['param'] = array ( 'code' => $code ); $send['param'] = Dever::json_encode($send['param']); return Dever::load('sms/api.send', $send); } $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) { $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']); if (Dever::config('base', 'project')->regAction) { Dever::load(Dever::config('base', 'project')->regAction, $user); } return $user; } } 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; } }