在WeiPHP4.0中,可以在后台开启扫码登录功能,默认是关闭的 ![](https://box.kancloud.cn/86313ea34a7dfa76e3aea85f21d109dc_696x400.png) 未开启扫码登录前的效果: ![](https://box.kancloud.cn/9edb27ba1c5d84f1d8dde12c710b83b8_437x441.png) 开启扫码登录前的效果: ![](https://box.kancloud.cn/769d9f67619fac624f26aca35fde7a1b_421x493.png) 除了本系统的运营人员可以扫码登录外,还支持子系统也能使用扫码登录功能。这比较适合于有一个主站,还有多个子站的客户。比如我们WeiPHP官网,体验环境相当于主站,社区论坛,商城等其它产品的体验站点相当于子站。这些站点之间都可以通过扫码登录的方式为用户提供统一登录方式,**不再需要用户重复注册和登录**。 子站要使用扫码登录功能,需要使用API接口与主站进行交互,以获取二维码和用户登录信息,如下图: ![](https://box.kancloud.cn/9efda856d74fd49e6becd9dc1c7d8433_968x700.jpg) 子站集成扫码登录的开发流程 ### 生成LoginKey,并换取二维码 ~~~ // 生成LoginKey,并放到Cookie中,防止用户重复刷新获取二维码 $key = cookie ( 'LoginKey' ); if (empty ( $key )) { $key = uniqid (); cookie ( 'LoginKey', $key ); } $this->assign ( 'LoginKey', $key ); $main_url = 'http://demo.weiphp.cn/'; // 主站的网址,开发者要替换成自己的网站 // 获取二维码的地址 TODO 待加上access_token $qr_code = get_data ( $main_url . 'index.php?s=/Home/ScanLoginApi/getQrCode/key/' . $key ); ~~~ ### 不断询问用户扫码进度 模板HTML的关键代码: ~~~ <!--显示二维码给用户扫描--> <img src="{$qrcode}" width=250 height=250> <script type="text/javascript"> $(function(){ //每隔3秒询问下用户是否已扫码,如已扫码,自动跳转到指定页面 setInterval(function(){ $.post("{:U('checkLogin')}",{},function(res){ if(res.status==1){ window.location.href = res.url; } }); },3000)}); </script> ~~~ ### 完成自动注册和自动登录 后端PHP处理的关键代码: ~~~ function checkLogin() { $main_url = 'http://demo.weiphp.cn/'; // 主站的网址,开发者要替换成自己的网站 $key = cookie ( 'LoginKey' ); // 通过LoginKey获取用户扫码进度 $user = get_data ( $main_url . 'index.php?s=/Home/ScanLoginApi/checkLogin/key/' . $key ); if (empty ( $user )) { // 用户未扫码,直接返回 exit ( '0' ); } // 已扫码,获取用户信息 $user = json_decode ( $user, true ); unset ( $user ['uid'] ); // 获取用户ID,如果用户未注册,会自动完成注册 $user ['uid'] = D ( 'Common/Follow' )->init_follow ( $user ['openid'], $user ['token'], false, $user ); // 自动完成登录 D ( 'Common/User' )->autoLogin ( $user ); $return ['status'] = 1; $return ['url'] = cookie ( '__forward__' ); if (! $return ['url']) { $return ['url'] = U ( 'Home/Apps/lists' ); } else { cookie ( '__forward__', null ); } // 返回跳转地址信息 exit ( json ( $return ) ); } ~~~