在我们的项目开发中,第三方登录可以很好的为用户提供便捷,比如微信、QQ、微博登录等等。
Laravel,作为一个优雅的PHP框架,已经集成了诸多第三方登录插件。
本文,将详细论述如何在Laravel框架中,实现QQ登录。
1. 准备工作
进行开发之前,首先需要在QQ互联平台创建应用
。
1、前往QQ互联中心
(网址:https://connect.qq.com/manage.html#/)登录注册,并完成开发者实名认证
。
2、点击下方的创建应用
按钮,弹出框选择创建网站应用
3、填写应用的基本资料
这里注意,
网站名称
需要是网站ICP备案
号的名称,否则审核不通过。
4、完善资料
,然后点击创建应用
即可。
这里注意:
网站回调地址
,可以填写多个,这个要记住,开发过程要用这个地址。比如:http://www.domain.com/oauth/qq提供方
,即域名备案的主体
,个人即为姓名。
5、等待审核通过。
5、应用审核通过后,点击应用的查看
按钮,即可看到应用的APP ID
和APP Key
。
6、应用接口
处,unionid接口
,选择接入
。
至此,前期准备工作完成,开发过程中,至需要三个参数:
- APP ID
- APP Key
- 网站回调地址
2. 实现QQ登录,并获取用户基本信息
1、创建一个Laravel项目
。
如何创建?点击此处查看
2、添加依赖插件/服务
:
打开Terminal
,使用如下 composer
命令即可添加
composer require socialiteproviders/qq
如图:
3、添加服务提供器
Service Provider
打开文件 config/app.php
,找到 provider
字典,添加的内容如下:
'providers' => [//Laravel\Socialite\SocialiteServiceProvider::classo //有博文说,如果有这行,请注释掉SocialiteProviders\Manager\ServiceProvider::class,//添加这样
],
4、添加门面
Facades Aliase
同样在 config/app.php
中,往下翻,即可看到 aliases
字典,添加的内容如下:
'aliases' => ['Socialite' => Laravel\Socialite\Facades\Socialite::class,//追加这行
],
5、添加事件处理器
EventServiceProvider
在文件 app/Providers/EventServiceProvider.php
中,找到 $listen
数组,添加内容如下:
protected $listen = [//添加下面这个处理器'SocialiteProviders\Manager\SocialiteWasCalled' => ['SocialiteProviders\QQ\QqExtendSocialite@handle',],
];
6、配置参数
在上一节的末尾,说明了需要的参数。
在配置文件 config/services.php
中,添加如下内容:
'qq' => ['client_id' => env('QQ_KEY'),'client_secret' => env('QQ_SECRET'),'redirect' => env('QQ_REDIRECT_URI'),
],
然后在 .env
文件中,设置参数
QQ_KEY=APP ID
QQ_SECRET=APP Key
QQ_REDIRECT_URI="网站回调地址"
7、添加路由
在 web.php
路由文件中,添加如下路由,其中各个路由的说明见注释。
//qq回调的路径,和QQ互联平台一直
Route::get('/plugin/qqlogin/callback.php','AuthController@callback');
//qq登录的路径,可以自定义
Route::get('/login/qq','AuthController@qqLogin');
8、创建控制类
php artisan make:controller AuthController
9、编写控制类内容,并测试:
<?phpnamespace App\Http\Controllers;use Illuminate\Http\Request;
use Laravel\Socialite\Facades\Socialite;class AuthController extends Controller
{////跳转QQ登录按钮public function qqLogin(){return Socialite::driver('qq')->redirect();}//登录的回调public function callback(){//获取回调信息$userInfo = Socialite::driver('qq')->user();//打印返回的信息,有基本信息字段和详细信息数组//dd($userInfo);// 获取基本信息echo '用户ID:' . $userInfo->getId() . '<br>';echo '用户头像URL:' . $userInfo->getAvatar() . '<br>';echo '用户昵称:' . $userInfo->getNickname() . '<br>';//获取更加详细的西乡$user = $userInfo->user;echo '性别:' . $user['gender'] . '<br>';echo '性别:' . $user['gender_type'] . '<br>';echo '省份:' . $user['province'] . '<br>';echo '城市:' . $user['city'] . '<br>';echo '年:' . $user['year'] . '<br>';}
}
3. 效果测试
1、访问登录页面,路由中已设置网址为:http://yourdomain.com/login/qq
2、自动跳转至登录QQ官方的授权登录页面
3、扫码或者快捷登录后,即可跳转至回调页面:http://yourdomain.com/plugin/qqlogin/callback.php
如果跳转后,出现 CURL出现code ERROR 60错误,请看最后一节。
4、如上源码,将回调信息,使用dd
函数,打印出来,是这样的:
5、可以对一些关键信息打印,如上源码注释,打印信息如下:
4. 获取unionid
在上面的结果图片中,通过dd
函数,打印的返回结果,最后的unionid
值为空。
所以,需要单独获取该用户的unionid
,只需要一个get请求
即可搞定。
官网获取unionid
的介绍:https://wiki.connect.qq.com/unionid%E4%BB%8B%E7%BB%8D
首先,修改回调控制类
的方法,修改如下:
//登录的回调public function callback(){//获取基本信息$userInfo = Socialite::driver('qq')->user();//打印返回的信息,有基本信息字段和详细信息数组//dd($userInfo);//通过dd打印,可以看出,基本信息中的 unionid 为空,可以发送get请求获取//发送get请求,获取 unionid$userInfo2 = Http::get('https://graph.qq.com/oauth2.0/me?access_token=' . $userInfo->accessTokenResponseBody['access_token'] . '&unionid=1&fmt=json');$userInfo2 = json_decode($userInfo2, true);//dd($userInfo2);$unionid = $userInfo2['unionid'];// 获取基本信息echo '用户ID:' . $userInfo->getId() . '<br>';echo '用户unionid:' . $unionid . '<br>';echo '用户头像URL:' . $userInfo->getAvatar() . '<br>';echo '用户昵称:' . $userInfo->getNickname() . '<br>';//获取更加详细的信息$user = $userInfo->user;echo '性别:' . $user['gender'] . '<br>';echo '性别:' . $user['gender_type'] . '<br>';echo '省份:' . $user['province'] . '<br>';echo '城市:' . $user['city'] . '<br>';echo '年:' . $user['year'] . '<br>';}
其实只添加了三行代码。
然后,第19行
,即打印获取的unionid
,截图如下:
这里注意,代码第12行处的
get 请求
,参考自:https://learnku.com/articles/47768
5、测试阶段的一个问题
参考自:https://my.oschina.net/u/4346195/blog/3499485
1、访问https://curl.haxx.se/ca/cacert.pem 下载名为 cacert.pem
的文件
2、将该文件放在某个文件夹下(比如桌面),然后复制其路径,如:C:\Users\zhangsan\Desktop\cacert.pem
3、然后打开 php.ini
文件,找到最后面的 curl.cainfo =
,将其取消注释,并修改为 curl.cainfo = cacert.pem文件路径
,保存即可。如:
[curl]
; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo = "C:\Users\zhangsan\Desktop\cacert.pem"
重启phpstudy。
参考资料:
- https://learnku.com/articles/24984
- https://my.oschina.net/u/4346195/blog/3499485
- https://learnku.com/articles/47768
- https://wiki.connect.qq.com/unionid%E4%BB%8B%E7%BB%8D