openAuth = new OpenAuth(); } //获取微博登陆地址 public function actionWbloginurl() { return $this->openAuth->getWbLoginUrl(); } //获取微信登录地址 public function actionWxloginurl() { return $this->openAuth->getWxLoginUrl(); } //获取钉钉登录地址 public function actionDdloginurl() { return $this->openAuth->getDdLoginUrl(); } //获取QQ登录地址 public function actionQqloginurl() { return $this->openAuth->getQqLoginUrl(); } //微信登录后回调 public function actionWxcallback() { return $this->_callback('wx','wx'); } //QQ登录后回调 public function actionQqcallback() { return $this->_callback('qq','qq'); } //钉钉登录后回调 public function actionDingcallback() { return $this->_callback('dd','dd'); } //公众号消息通知开启二维码 public function actionMpmsg() { return $this->openAuth->mpMsg(); } //公众号登录调用 public function actionMplogin() { return $this->openAuth->mpLogin(); } //公众号关注二维码 public function actionMpsub() { $this->openAuth->mpSub(); } //微信扫码免费下载文档二维码 public function actionFreedowncode() { $this->openAuth->freeDowncode(); } private function _callback($app,$unionapp) { $authFunction = $app.'Auth'; //授权成功以后 if($this->openAuth->$authFunction()&&$this->openAuth->checkAppLogin($app)) { $userInfo = $this->openAuth->getAppUserInfo($app); if(Yii::$app->params['openauth']['openUnionId']==1&&$unionapp=='wx') { if(empty($userInfo['unionid'])) { exit('请在微信开放平台绑定该应用'); } $bindModel = UserOpenAuth::find()->where("app_unionname='".$unionapp."' and app_unionid='".$userInfo['unionid']."'")->orderBy(['id'=>SORT_DESC])->one(); } else { $bindModel = UserOpenAuth::find()->where("app='".$app."' and app_uid='".$userInfo['uid']."'")->orderBy(['id'=>SORT_DESC])->one(); } // $justBindUser = Identify::hasLogined()?true:false; if(empty($bindModel))//如果没有绑定记录 { $bindModel = new UserOpenAuth; $bindModel->app = $app; $bindModel->app_uid = $userInfo['uid']; $bindModel->user_info = base64_encode(array2string($userInfo)); $bindModel->user_id = Identify::hasLogined()?Identify::getUserInfo(NULL,'user_id'):0; $bindModel->hash = md5($bindModel->app.$userInfo['uid']); $bindModel->app_unionid = $userInfo['unionid']?$userInfo['unionid']:''; $bindModel->app_unionname = $unionapp; $bindModel->bind_time = TIMESTAMP; if($bindModel->save()) { //如果不是绑定操作,生成一个新用户 if(empty($bindModel->user_id)) { $newUser = Identify::createUser($bindModel,getSysconfigValue('default_user_model')); $bindModel->user_id = $newUser->user_id; $bindModel->save(); } } else { exit('登录失败!'.$bindModel->returnFirstError()); } } //Cookie::setCookie(Yii::$app->params['authHashName'],$bindModel->hash); if($this->_doLogin($bindModel)){ $referPage = Cookie::getCookie(Yii::$app->params['referPageName']); if(empty($referPage)) { $referPage = $this->homeUrl; } $this->showMessage(array('class'=>'success','message'=>$justBindUser?'绑定成功':'登录成功','url'=>$justBindUser?rtrim(SiteUrl::myaccount(3),'/').'/':$referPage,'time'=>2000)); } else { exit('登录失败!');//没有关联的用户账号,可以设置一个绑定账号的页面 } } } //最终登录记录本地库的身份信息 private function _doLogin($bindModel) { if(!empty($bindModel->user_id)) { if(Identify::hasLogined()) { $user_id = Identify::getUserInfo(NULL,'user_id'); if($bindModel->user_id>0&&$user_id!=$bindModel->user_id) { exit($this->openAuth->getAppName($bindModel->app).'已有绑定用户,无法绑定当前用户'); } return true; } else { $user = User::findOne($bindModel->user_id); $user->generateAccessToken($user,REQUEST_FROM); Identify::doLogin($user); return true; } } else { if(Identify::hasLogined()) { $user_id = Identify::getUserInfo(NULL,'user_id'); $bindModel->user_id = $user_id; $bindModel->save(); return true; } else { //对异常情况进行纠正 $newUser = Identify::createUser($bindModel,getSysconfigValue('default_user_model')); $bindModel->user_id = $newUser->user_id; $bindModel->save(); $newUser->generateAccessToken($newUser,REQUEST_FROM); Identify::doLogin($newUser); return true; } } } //退出 public function actionLogout() { $this->openAuth->logout(); } //微信公众号消息通知的轮询 public function actionFetchmpmsg() { $app = 'mpmsg'; //防止恶意攻击 $fromUrl = Yii::$app->request->getReferrer(); if(strpos($fromUrl,APP_URL)===false||empty($fromUrl)) { exit; } $scene_id = Yii::$app->request->get('scene_id'); if(!empty($scene_id)) { $userOpenAuth = UserOpenAuth::find()->where("scene_id='$scene_id' and app='".$app."'")->one(); if($userOpenAuth) { if(Identify::hasLogined()) { if(!$userOpenAuth->user_id) { $userOpenAuth->user_id = Identify::getUserInfo(null,'user_id'); $userOpenAuth->save(); //积分奖励 $pointConfigResult = Yii::$app->db->createCommand("select * from {{%config}} where name='point'")->queryOne(); $pointConfig = string2array($pointConfigResult['value']); if($pointConfig['bindmpmsg_prize']>0) { Wallet::pointChange($userOpenAuth->user_id,$pointConfig['bindmpmsg_prize'],'绑定微信消息',1,'point'); } echo_json(array('error'=>0,'msg'=>'绑定成功','data'=>['scene_id'=>$scene_id])); } else { if($userOpenAuth->user_id==Identify::getUserInfo(null,'user_id')) { echo_json(array('error'=>0,'msg'=>'绑定成功','data'=>['scene_id'=>$scene_id])); } else { echo_json(array('error'=>1,'msg'=>'绑定失败,已绑定其它账号')); } } } else { echo_json(array('error'=>1,'msg'=>'绑定失败')); } } } else { echo_json(array('error'=>1,'msg'=>'系统错误')); } } //微信公众号登录的轮询 public function actionFetchopenauth() { $app_unionname = 'wx'; $app = 'mp'; //防止恶意攻击 $fromUrl = Yii::$app->request->getReferrer(); if(strpos($fromUrl,APP_URL)===false||empty($fromUrl)) { exit; } $scene_id = Yii::$app->request->get('scene_id'); $refer_page = Cookie::getCookie(Yii::$app->params['referPageName']); if(!empty($scene_id)) { if(Yii::$app->params['openauth']['openUnionId']==1) { $userOpenAuth = UserOpenAuth::find()->where("scene_id='$scene_id' and app_uid!='0' and app_unionname='".$app_unionname."'")->one(); } else { $userOpenAuth = UserOpenAuth::find()->where("scene_id='$scene_id' and app_uid!='0' and app='".$app."'")->one(); } if($userOpenAuth) { //Cookie::setCookie(Yii::$app->params['authHashName'],$userOpenAuth->hash); if(!$userOpenAuth->user_id) { if(Identify::hasLogined()) { $userOpenAuth->user_id = Identify::getUserInfo(null,'user_id'); $userOpenAuth->save(); echo_json(array('error'=>0,'msg'=>'绑定成功','data'=>['scene_id'=>$scene_id,'refer_page'=>$refer_page?$refer_page:SiteUrl::ucenter()])); } else { //生成新用户 $checkUserInfo = string2array(base64_decode($userOpenAuth->user_info)); //判断用户资料是否写入 if($checkUserInfo['nick_name']) { $newUser = Identify::createUser($userOpenAuth,getSysconfigValue('default_user_model')); if($newUser) { $userOpenAuth->user_id = $newUser->user_id; $userOpenAuth->save(); ob_clean(); $newUser->generateAccessToken($newUser,REQUEST_FROM); if(Identify::doLogin($newUser)) { echo_json(array('error'=>0,'msg'=>'登录成功','data'=>['scene_id'=>$scene_id,'refer_page'=>$refer_page?$refer_page:APP_URL])); } } else { echo_json(array('error'=>1,'msg'=>'登录失败')); } } } } else { if(!Identify::hasLogined()) { //生成新用户 $checkUserInfo = string2array(base64_decode($userOpenAuth->user_info)); //判断用户资料是否写入 if($checkUserInfo['nick_name']) { $user = User::find()->where("user_id='".$userOpenAuth->user_id."'")->one(); if($user->is_lock) { echo_json(array('error'=>1,'msg'=>'你的账号已被锁定,请联系管理员')); } if($user->disabled) { echo_json(array('error'=>1,'msg'=>'你的账号已被禁用,请联系管理员')); } if($user->is_delete) { echo_json(array('error'=>1,'msg'=>'你的账号已被永久禁用,请联系管理员')); } ob_clean(); $user->generateAccessToken($user,REQUEST_FROM); if(Identify::doLogin($user)) { echo json_encode(array('error'=>0,'msg'=>'登录成功','data'=>['scene_id'=>$scene_id,'refer_page'=>$refer_page?$refer_page:APP_URL])); } } } else { if(Identify::hasLogined()&&Identify::getUserInfo(NULL,'user_id')!=$userOpenAuth->user_id) { echo_json(array('error'=>1,'msg'=>$userOpenAuth->app.'已有绑定用户,无法绑定当前用户')); } echo_json(array('error'=>0,'msg'=>'绑定成功','data'=>['scene_id'=>$scene_id,'refer_page'=>$refer_page?$refer_page:APP_URL])); } } } } else { echo_json(array('error'=>1,'msg'=>'系统错误')); } } //使用token登录 public function actionAccesstokenlogin() { $token = safe_replace(Yii::$app->request->post(Yii::$app->params['access_token_name'])); $tokenModel = \app\modules\ucenter\models\UserToken::find()->where("token='".$token."'")->orderBy(['id'=>SORT_DESC])->one(); if(!empty($tokenModel)) { if($tokenModel->create_time+Yii::$app->params['apiTokenExpire']1,'msg'=>'登录失败(失效凭据)'); } else { $user = \app\modules\ucenter\models\User::find()->where("user_id=".$tokenModel->user_id)->one(); Cookie::setCookie(Yii::$app->params['access_token_name'],$token); if(Yii::$app->request->post('rember'))$expire = TIMESTAMP+Yii::$app->params['remberExpire']; \app\common\helpers\Identify::doLogin($user,$expire); $refer_page = Cookie::getCookie(Yii::$app->params['referPageName']); if(empty($refer_page))$refer_page = ''; $result = array('error'=>0,'msg'=>'恭喜您,登录成功','data'=>array('refer_page'=>$refer_page)); } } else { $result = array('error'=>1,'msg'=>'登录失败(无效凭据)'); } ob_clean(); echo json_encode($result); } }