在我们的项目开发中,第三方登录可以很好的为用户提供便捷,比如微信、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 IDAPP 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。

参考资料:

  1. https://learnku.com/articles/24984
  2. https://my.oschina.net/u/4346195/blog/3499485
  3. https://learnku.com/articles/47768
  4. https://wiki.connect.qq.com/unionid%E4%BB%8B%E7%BB%8D

Laravel第三方登录开发之实现QQ登录相关推荐

  1. java加按钮_如何从零开始对接第三方登录(Java版):QQ登录和微博登录

    阅读本文约需要8分钟 大家好,我是你们的导师,我每天都会在这里给大家分享一些干货内容(当然了,周末也要允许老师休息一下哈).上次老师跟大家分享了HashMap和TreeMap的知识,今天跟大家分享下对 ...

  2. 如何从零开始对接第三方登录(Java版):QQ登录和微博登录

    前言 个人网站最近增加了评论功能,为了方便用户不用注册就可以评论,对接了QQ和微博这2大常用软件的一键登录,总的来说其实都挺简单的,可能会有一点小坑,但不算多,完整记录下来方便后来人快速对接. 后台设 ...

  3. pyqt5登录界面设计——模仿qq登录界面,可登录注册(数据库)

    pyqt5登录界面设计--模仿qq登录界面 一.简单易用的可直接登录的界面--账号密码程序写死 1.1.效果图: 1.2.视频效果图 3.代码说明 4.使用示例 5.全部源码见: 二.带数据库的可登录 ...

  4. Laravel第三方登录开发之实现微博登录

    本文,将详细讲述如何在Laravel框架中,实现微博登录. 1. 准备工作 进行开发之前,首先需要在微博开放平台接入网站. 1.注册一个微博账号(估计大家都有),然后登录微博(https://weib ...

  5. 微信开放平台 公众号第三方平台开发 教程三 一键登录授权给第三方平台

     更多微信技术交流,请加QQ群:289709451.287090836    公众号第三方平台的开放,是为了让公众号运营者,在面向垂直行业需求时,可以一键登录授权给第三方的公众号运营平台,通过第三方开 ...

  6. java中如何实现qq登录与微博登录,如何从零开始对接第三方登录(Java版):QQ登录和微博登录(2)...

    到了这一步基本上涉及第三方的就结束了,是不是很简单?后面无非就是如何插入.如何存放token.写入session等. 有几点注意事项: 相关文档官网已经写得非常细了,但是相当乱: 这个我就不详细讲了, ...

  7. java gui界面设计qq_Java swing界面开发(仿QQ登录界面)

    首先引入包的概念,包:给代码分类,提高的了代码的可读性,封装后方便管理.在包中类的引入:import 包名.类名;包名需小写,多单词用"."隔开.类名的命名规范:首字母大写其后的每 ...

  8. Android开发实现简单QQ登录页面

    Android开发实现极为简单的QQ登录页面 设计一个简单QQ登录页面,无任何功能.然后打包安装到手机. 1.首先创建一个空白页面 2.打开样式设计的页面 在activity_main.xml中写入代 ...

  9. php新浪微博 登录接口文档,qq登录,新浪微博登录接口申请过程中遇到的问题

    接口申请下来了,开发很容易的,参数传到就可以了.以前就做过这方面的开发,但是申请还是第一次,网上有关这方面的东东不是很多,所以记录一下申请过程. 1,qq登录接口申请 申请地址是:http://con ...

最新文章

  1. ffmpeg图片压缩为视频
  2. centos 7挂载windows共享目录
  3. 学习总结——实现生成excel表格(方法二)
  4. android+残留软件包名,关于使用pm hide伪卸载系统软件的一些包名
  5. 当面试官问你了不了解defineProperty的时候。。。
  6. 二进制拆弹实验详解_Population Count算法-求二进制数中1的个数
  7. win7误删计算机,Win7系统下文件数据被误删了怎么办
  8. android日历读取账号,android – Outlook – 读取另一个用户的日历
  9. MAVEN项目标准目录结构(转)
  10. 从yesno模型入门kaldi语音识别
  11. 计算机启动黑屏时间很长,win7开机黑屏时间长怎么办?win7开机黑屏很久解决办法...
  12. android中menu重写哪些方法,在Android中Menu的使用
  13. 入门OJ:郭嘉的消息传递
  14. 服务器win10系统开机慢,win10专业版系统开机启动慢 三种方法帮你敲定
  15. python的pth打开方式_pytorch 加载(.pth)格式的模型实例
  16. AIX 上总有一种压缩方式适合你
  17. 你不逼自己一把 你怎么知道自己有多优秀
  18. selenium打开chrome浏览器无痕模式
  19. 虚拟主机 独立云服务器,虚拟主机 独立云服务器
  20. 五个案例,三大心得,深度学习的实践应用之路

热门文章

  1. Dijkstra(迪杰斯特拉)算法求单源最短路径问题
  2. 电脑知识:台式电脑应该选择品牌和组装,值得收藏
  3. 【论文阅读/翻译笔记】Deep Snake for Real-Time Instance Segmentation
  4. 计算机输入d为啥返回桌面,电脑进入游戏怎么返回桌面
  5. win7与深度(Deepin)linux 双系统启动顺序调整
  6. 【有利可图网】PS实战系列:制作抖音UI图标
  7. linux宝塔面板打不开 ssh也连不上,SSH能访问,但是宝塔面板打不开,输入bt命令无任何反应!...
  8. 《金蝶ERP-K/3完全使用详解》—— 导读
  9. Speedoffice(PPT)如何设置文字顶部对齐
  10. 一文看懂!百度对话系统PLATO家族