270, 'user_name' => 'wayne', ] ); return $this->success(['token'=>'Bearer '.$token]); } public function checkLogin(){ try{ $payload = JWTAuth::auth(false); return $this->Success(true); } catch (TokenInvalidException $e){ return $this->Success(false); } catch (\Exception $e){ return $this->Success(false); } } /** * return 200 成功 * 201 不是會員 */ public function lineLogin(){ $id_token = input('token'); if(!$id_token){ return $this->Error('請求參數錯誤'); } $line_res = LineLogin::verifyIdToken(env('line.login_channel_id'), $id_token); if(!$line_res){ return $this->Error('發生錯誤,請重新執行',401); } $user=Db::name('users') ->where('line_id',$line_res['sub']) ->find(); if(!$user){ //第一次登入,請求註冊 return $this->success('非會員',201); } $token = JWTAuth::builder( [ 'user_id' => $user['user_id'], 'user_name' => $user['user_name'], ] ); return $this->success(['token'=>'Bearer '.$token]); } public function lineReg(){ $id_token = input('id_token'); $mobile = input('mobile'); //驗證id_token $line_res = LineLogin::verifyIdToken(env('line.login_channel_id'), $id_token); if(!$line_res){ return $this->Error('發生錯誤,請重新執行',401); } //檢查line id是否己經是會員 //TODO $user=Db::name('users') ->where('line_id',$line_res['sub']) ->find(); if($user){ return $this->error('已是會員,重新登入',501); } $data = [ 'line_id' => $line_res['sub'], 'line_picture' => $line_res['picture'], 'line_name' => $line_res['name'], 'user_name' => $mobile, 'mobile_phone' => $mobile, 'refer_code' => $this->getReferCode(), 'reg_time' => time() ]; //檢查mobile phone是否己經是會員 //TODO $user=Db::name('users') ->where('mobile_phone',$mobile) ->find(); if($user){ //update $rtn = Db::name('users') ->where('mobile_phone',$mobile) ->update($data); }else{ //推薦人代碼 $data['parent_id'] = 1; //insert $id = Db::name('users') ->insertGetId($data); } $user=Db::name('users') ->where('line_id',$line_res['sub']) ->find(); if(!$user){ return $this->success('註冊失敗,請重新操作',502); } $token = JWTAuth::builder( [ 'user_id' => $user['user_id'], 'user_name' => $user['user_name'], ] ); return $this->success(['token'=>'Bearer '.$token]); $avatar=$this->saveLineImage($data['line_picture'],$data['user_id']); $data['line_picture']= getUrl().'/storage/'.$data['user_id'].'/'.$avatar; if(!isset($data['avatar'])){ $data['avatar']=$data['line_picture']; }else{ $file_path = $_SERVER['DOCUMENT_ROOT'].'/storage/'.$data['user_id'].'/'.date('Ymd').'/'; if(!is_dir($file_path)){ mkdir($file_path, 0777, true); } $temp_file = str_replace(getUrl(),"",$data['avatar']); $avatar_file = $file_path.basename($temp_file); if(!rename($_SERVER['DOCUMENT_ROOT'].$temp_file, $avatar_file)){ return $this->error('搬移檔案失敗'); } $data['avatar']=getUrl().'/storage/'.$data['user_id'].'/'.date('Ymd').'/'.basename($temp_file); } try{ $id = Db::name('user') ->insertGetId($data); $refer_code = encodeRefer($id); $result = Db::name('user') ->where('id',$id) ->update(['code'=>$refer_code]); $qrcodeUrl = genQrCode('https://'.$_SERVER['HTTP_HOST'].'/home/?aid='.$agent['prefix'],$data['user_id'],'refer'); $aes = new Aes([]); $params = urlencode($aes->encrypt('user_id='.$data['user_id'].'&verify_code='.input('verify'))); $nfcUrl = genQrCode('https://'.$_SERVER['HTTP_HOST'].'/card/?params='.$params,$data['user_id'],'nfc'); Vcard::genVcf($data['user_id']); $token = JWTAuth::builder( [ 'id' => $id, 'user_id' => $data['user_id'], 'level' => 0 ]); if($action == 'openright'){ Db::name('precard') ->where('verify_code',input('verify')) ->update(['status'=>2]); } return $this->success(['uid'=>$data['user_id'],'token'=>'Bearer'.$token]); }catch(\Exception $e){ return $this->error('註冊失敗'); } } /** * 註冊會員 */ public function register(){ $data = input('post.'); unset($data['version']); unset($data['controller']); unset($data['action']); unset($data['uid']); unset($data['userid']); unset($data['refer_code']); unset($data['verify']); unset($data['token']); unset($data['type']); $data=array_map('asc_trim',$data); if(input('type')=='line'){ //驗證id_token $verify_line = $this->verifyIdToken(input('token')); if(!isset($verify_line)){ return $this->error('id token expire',500); } $data['line_name'] = $verify_line['name']; $data['line_picture'] = $verify_line['picture']; $data['line_id'] = $verify_line['sub']; $data['mobile_phone'] = $data['phone']; $user_data = [ 'line_id' => $data['line_id'], 'line_name' => $data['line_name'], 'line_picture' => $data['line_picture'], ]; }else{ $data['mobile_phone'] = input('token'); } $data['real_name'] = $data['name']; //新增User至Oss Server $user_data['appid'] = 'sc'; $user_data['phone'] = $data['mobile_phone']; $user_data['real_name'] = $data['real_name']; $user_data['email'] = $data['email']; $user_data['timestamp'] = time(); //檢查refer_code是否存在,存在則加入user_data if(strlen(input('refer_code'))>0){ $user_data['refer_code'] = input('refer_code'); } $sign = Sign::genSign($user_data); $user_data['sign'] = $sign; $client = new Client([ 'base_uri' => 'https://sso.slash1000.com/api/v1/' ]); $response = $client->post('user/add',[ 'form_params' => $user_data ]); if($response->getStatusCode()!=200){ return $this->error('上傳SSO SERVER 失敗'); } $sso_data = json_decode($response->getBody()->getContents(),true)['data']; try{ //檢查相同電話的會員是否已存在 $data=[ 'sso_user_id' => $sso_data['info']['user_id'], 'headimg' => $sso_data['info']['avatar'], 'line_id' => isset($sso_data['info']['line_id'])?$sso_data['info']['line_id']:'', 'line_name' => isset($sso_data['info']['line_name'])?$sso_data['info']['line_name']:'', 'line_picture' => isset($sso_data['info']['line_picture'])?$sso_data['info']['line_picture']:'', 'mobile_phone' => $sso_data['info']['phone'], 'user_name' => $sso_data['info']['phone'], 'real_name' => $sso_data['info']['real_name'], 'refer_code' => $sso_data['info']['code'], 'parent_id' => $sso_data['info']['parent_id'], 'reg_time' => time(), 'last_login' => time(), ]; $is_exist = Db::name('users')->where('mobile_phone',$sso_data['info']['phone'])->count(); if($is_exist>0){ //更新會員資料 Db::name('users') ->where('mobile_phone',$sso_data['info']['phone']) ->update($data); }else{ $id = Db::name('users') ->insertGetId($data); } $payload = [ 'user_id' => $data['sso_user_id'], ]; $token = Token::genToken($payload); return $this->success(['uid'=>$data['sso_user_id'],'token'=>'Bearer '.$token]); }catch(\Exception $e){ return $this->error($e->getMessage()); } } public function bindCard(){ $uid = input('uid'); $verify = input('verify'); try{ Db::name('user') ->where('user_id',$uid) ->update(['uniqid'=>$verify]); Db::name('precard') ->where('verify_code',$verify) ->update(['status'=>2]); return $this->success('綁定成功'); }catch(\Exception $e){ return $this->error('綁定失敗'); } } public function checkLineId(){ $line_id=input('lineid'); $user = Db::name('user') ->where('line_id',$line_id) ->find(); if($user){ return $this->error('會員已存在'); } return $this->success('檢查成功'); } private function verifyIdToken($token){ try{ $client = new Client(); $response = $client->request('POST', 'https://api.line.me/oauth2/v2.1/verify', [ 'form_params' => [ 'id_token' => $token, 'client_id'=> env('line.login_channel_id') ] ]); $body = $response->getBody()->getContents(); return json_decode($body, true); } catch (\Exception $e) { // print_r($e); return false; } } private function saveLineImage($pictureUrl,$uid) { if($pictureUrl){ $curl = curl_init($pictureUrl); curl_setopt($curl,CURLOPT_RETURNTRANSFER,1); $imageData=curl_exec($curl); curl_close($curl); $filename=$uid."_line.jpg"; $filedir=$_SERVER['DOCUMENT_ROOT'].'/storage/'.$uid; if (!file_exists($filedir)) { mkdir($filedir , 0777 , true); } $fp=fopen($filedir.'/'.$filename,'a'); fwrite($fp,$imageData); fclose($fp); return $filename; }else{ return false; } } public function uploadAvatar(){ $files = request()->file('file'); $savename = \think\facade\Filesystem::disk('public')->putFile( 'temp' , $files); $avatar = getUrl().'/storage/'.$savename; // Db::name('user') // ->where('user_id',input('user_id')) // ->update(['avatar'=>$avatar]); return $this->Success($avatar); } public function sendVerify(){ $username = input('username'); //在這裡檢查是否已經發送過驗證碼,如果已經發送過,則不再發送 $is_exist = Cache::get($username); // if ($is_exist) { // // 驗證碼存在 // return $this->error('驗證碼已發送,請勿重複發送'); // } else { // 驗證碼不存在或已過期 // 重新生成驗證碼並存儲到Redis中 $verification_code = mt_rand(100000, 999999); Cache::set($username, $verification_code, 300); $message = '[SlashCard]'.$verification_code.'簡訊登入驗證碼,請於5分鐘內輸入驗證碼完成登入。'; // 發送短信 Sms::createSms('smsking', [ 'recipient'=>$username, 'message'=>$message ]); return $this->success('驗證碼已發送,請注意查收'); // } } private function lineAuth($code) { if(strlen($code)){ $oline=new LineLogin('1657776252','de34ab10e249e5c874b81d04ddc6e41d'); $response=$oline->getLineToken($code); print_r($response); $user_profile = $oline->getUserProfile($response['access_token']); $res = $user_profile; return $res; }else{ return false; } } private function addLineUser($user){ $data = [ 'line_id' => $user['line_id'], 'line_picture' => $user['picture'], 'line_name' => $user['name'], 'user_name' => $user['line_id'], 'password' => '', 'reg_time' => time() ]; } private function getReferCode(){ $refer = Utils::genReferCode(); $rtn = Db::name('users') ->where('refer_code',$refer) ->count(); if($rtn){ $refer = $this->getReferCode(); } return $refer; } }