企业微信+esaywechat 扫码授权登录
相关
- 这里用的是 Yii2 框架。
- 安装easywechat: composer require overtrue/wechat:~4.0 -vvv
- wechat官方文档:https://work.weixin.qq.com/api/doc/90000/90135/90988
- easywechat官网文档: https://www.easywechat.com/docs/master/wework/oauth
这里主要用了两个方法,一个是扫码登录,另一个是授权。
主要思路是:session不存在,保存当前方法->跳转到扫码(生成二维码)页->用户扫码授权->根据回调参数redirect_uri跳转->记录登录信息->根据session保存的targetUri跳转到原始方法。
代码如下:
扫码登录方法:
/**
* 扫码登录
* @param $uri
* @return bool|string
*/
public function actionScanLogin(){
$session = Yii::$app->session;
if(empty($_SESSION['targetUri'])){
echo "源uri参数缺失";return;
}
$ip = $_SERVER["REMOTE_ADDR"];
$state = md5(sprintf("%s&%s%s", time(), $ip, mt_rand(100, 999)));
$session->set('wechat_state', $state);
$config = [
'appid' => Yii::$app->params['wechat']['corp_id'],
'agent_id' => Yii::$app->params['wechat']['agent_id'],
'state' => $state,
'href' => '',
];
return $this->render('scanLogin', $config);
}
前端页面:
<?php
$host = \Yii::$app->request->hostInfo;
?>
<script src="http://rescdn.qqmail.com/node/ww/wwopenmng/js/sso/wwLogin-1.0.0.js"></script>
<div class="site-login">
<div id="wxLogin"></div>
</div>
<script>
window.WwLogin({
"id" : "wxLogin",
"appid" : "<?=$appid;?>",
"agentid" : "<?=$agent_id;?>",
"redirect_uri" : "<?php echo urlencode($host.'/test/oauth-callback');?>",
"state" : "<?=$state;?>",
"href" : '',
});
</script>
授权回调方法:
/**
* 授权回调
* @return string
*/
public function actionOauthCallback(){
$session = Yii::$app->session;
$get = Yii::$app->request->get();
$config = [
'corp_id' => Yii::$app->params['wechat']['corp_id'],
'secret' => Yii::$app->params['wechat']['secret'], // 应用的 secret
'agent_id' => Yii::$app->params['wechat']['agent_id'],
];
$app = Factory::work($config);
$user = $app->oauth->detailed()->user();
//用户信息
$username = $user->getId(); // 对应企业微信英文名(userid)
$userInfo = $user->getOriginal(); // 获取企业微信接口返回的原始信息
$accessToken = $app->oauth->getAccessToken(trim($get['code']))->getToken();
$_SESSION['wechatUserInfo'] = $userInfo;
$_SESSION['wechatAccessToken'] = $accessToken;
$sessionState = $session->get('wechat_state');
if($sessionState !== trim($get['state'])){
echo "非法!";exit;
}
return $this->redirect($_SESSION['targetUri']);
}
使用:
/**
* 使用
* @return string|\yii\web\Response
*/
public function actionIndex(){
if(empty($_SESSION['wechatUserInfo'])) {
$session->set('targetUri', '/test/index');
return $this->redirect('/test/scan-login');
}else{
return $this->render('index');
}
}