以Thinkphp3.2为基础的QQ第三方认证登录扩展类
发布时间 - 2020-06-09 00:00:00 点击率:次
基于thinkphp3.2的qq第三方认证登录扩展类
基于Thinkphp3.2的qq第三方认证登录扩展类,其实以下类也是我从TP官网收集整理得来的,稍微做了一下修改和完善。
这里我将文件放存在“/Application/Common/Lib/Qqconnect.class.php”。(其实这个文件路径根据自己喜好来放)
实例化
$Qqconnect = new \Common\Lib\Qqconnect();
在__construct方法中你可以直接写你的app_id、app_key和回调地址
也可以根据自己的喜好,改一下代码传参或者写到配置文件。
调用方法:
1. 在qq的登录按钮的方法中调用getAuthCode方法
$qqobj=new \Org\Util\Qqconnect(); $qqobj->getAuthCode();
2.在回调地址的方法中调用getUsrInfo方法
$qqobj=new \Org\Util\Qqconnect(); $result=$qqobj->getUsrInfo();
3.getAuthCode方法中的参数scope根据自身需要添加值get_user_info,list_album,upload_pic,do_like。
Qqconnect.class.php
// +---------------------------------------------------------------------- namespace Common\Lib; /** * qq第三方登录认证 */ class Qqconnect { private static $data; //APP ID private $app_id=""; //APP KEY private $app_key=""; //回调地址 private $callBackUrl=""; //Authorization Code private $code=""; //access Token private $accessToken=""; private $openid=""; public function __construct(){ $this->app_id=""; $this->app_key=""; $this->callBackUrl=""; //你的回调地址 //检查用户数据 if(empty($_SESSION['QC_userData'])){ self::$data = array(); }else{ self::$data = $_SESSION['QC_userData']; } } //获取Authorization Code public function getAuthCode(){ $url="https://graph.qq.com/oauth2.0/authorize"; $param['response_type']="code"; $param['client_id']=$this->app_id; $param['redirect_uri']=$this->callBackUrl; //生成唯一随机串防CSRF攻击 $state = md5(uniqid(rand(), TRUE)); $_SESSION['state']=$state; $param['state']=$state; $param['scope']="get_user_info"; $param =http_build_query($param,'','&'); $url=$url."?".$param; header("Location:".$url); } //通过Authorization Code获取Access Token private function _getAccessToken(){ $this->code=$_GET['code']; $url="https://graph.qq.com/oauth2.0/token"; $param['grant_type']="authorization_code"; $param['client_id']=$this->app_id; $param['client_secret']=$this->app_key; $param['code']=$this->code; $param['redirect_uri']=$this->callBackUrl; $param =http_build_query($param,'','&'); $url=$url."?".$param; return $this->getUrl($url); } //获取openid public function _setOpenID(){ $rzt=$this->_getAccessToken(); parse_str($rzt,$data); $this->accessToken=$data['access_token']; $url="https://graph.qq.com/oauth2.0/me"; $param['access_token']=$this->accessToken; $param =http_build_query($param,'','&'); $url=$url."?".$param; $response=$this->getUrl($url); //--------检测错误是否发生 if(strpos($response, "callback") !== false){ $lpos = strpos($response, "("); $rpos = strrpos($response, ")"); $response = substr($response, $lpos + 1, $rpos - $lpos -1); } $user = json_decode($response); if(isset($user->error)){ exit("错误代码:100007"); } return $user->openid; } //获取信息 public function getUserInfo(){ if($_GET['state'] != $_SESSION['state']){ exit("错误代码:300001"); } $openid=$this->_setOpenID(); if(empty($openid)){ return false; } session('openid',$openid); $url="https://graph.qq.com/user/get_user_info"; $param['access_token']=$this->accessToken; $param['oauth_consumer_key']=$this->app_id; $param['openid']=$openid; $param =http_build_query($param,'','&'); $url=$url."?".$param; $rzt=$this->getUrl($url); return $rzt; } public function getOpenId(){ if($_GET['state'] != $_SESSION['state']){ exit("错误代码:300001"); } $rzt=$this->_getAccessToken(); parse_str($rzt,$data); $this->accessToken=$data['access_token']; $url="https://graph.qq.com/oauth2.0/me"; $param['access_token']=$this->accessToken; $param =http_build_query($param,'','&'); $url=$url."?".$param; $response=$this->getUrl($url); //--------检测错误是否发生 if(strpos($response, "callback") !== false){ $lpos = strpos($response, "("); $rpos = strrpos($response, ")"); $response = substr($response, $lpos + 1, $rpos - $lpos -1); } $info = object_array(json_decode($response)); $qq['access_token'] = $this->accessToken; $qq['openid'] = $info['openid']; session('qq',$qq); return $info['openid']; } public function getInfo($openid='',$accessToken=''){ $url="https://graph.qq.com/user/get_user_info"; $param['oauth_consumer_key']=$this->app_id; $param['access_token']=$accessToken; $param['openid']=$openid; $param =http_build_query($param,'','&'); $url=$url."?".$param; $rzt=$this->getUrl($url); $info = object_array(json_decode($rzt)); return $info; } //CURL GET private function getUrl($url){ $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 5); if (!empty($options)){ curl_setopt_array($ch, $options); } $data = curl_exec($ch); curl_close($ch); return $data; } //CURL POST private function postUrl($url,$post_data){ $ch = curl_init(); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data); ob_start(); curl_exec($ch); $result = ob_get_contents(); ob_end_clean(); return $result; } }
下面是控制器中的代码
LoginController.class.php该文件主要包含两个方式
点击QQ登陆的时候访问的地址
public function qq_login(){
$Qqconnect = new \Common\Lib\Qqconnect();
$Qqconnect->getAuthCode();
}回调访问地址
public function callback(){
$Qqconnect = new \Common\Lib\Qqconnect();
$openid = $Qqconnect->getOpenId();
$qq = session('qq');
$Member = M('Member');
$map = array();
$map['openid'] = $openid;
$userInfo = $Member->where($map)->find();
if(!empty($userInfo)){
$this->success('登陆成功!',U('Member/index'));
}else{
$Qqconnect = new \Common\Lib\Qqconnect();
$userInfo = $Qqconnect->getInfo($qq['openid'],$qq['access_token']);
print_r($userInfo);
exit;
}以上只是简单的示例,大家可以参考一下再进行修改和完善。如有不明白的地方可以留言讨论。
推荐教程:《PHP视频教程》
# php
# class
# 回调
# 第三方
# 错误代码
# 自己的
# 如有
# 不明白
# 可以直接
# 我将
# 写到
# 可以根据
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
javascript读取文本节点方法小结
JS中对数组元素进行增删改移的方法总结
Android实现代码画虚线边框背景效果
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
零服务器AI建站解决方案:快速部署与云端平台低成本实践
标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析
Python文本处理实践_日志清洗解析【指导】
🚀拖拽式CMS建站能否实现高效与个性化并存?
重庆市网站制作公司,重庆招聘网站哪个好?
Laravel怎么在Controller之外的地方验证数据
Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程
js实现点击每个li节点,都弹出其文本值及修改
如何用花生壳三步快速搭建专属网站?
如何在IIS中新建站点并解决端口绑定冲突?
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
潮流网站制作头像软件下载,适合母子的网名有哪些?
jQuery 常见小例汇总
济南网站建设制作公司,室内设计网站一般都有哪些功能?
绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信
java中使用zxing批量生成二维码立牌
轻松掌握MySQL函数中的last_insert_id()
laravel怎么实现图片的压缩和裁剪_laravel图片压缩与裁剪方法
Laravel Sail是什么_基于Docker的Laravel本地开发环境Sail入门
Laravel如何处理CORS跨域请求?(配置示例)
Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作
在Oracle关闭情况下如何修改spfile的参数
Laravel如何从数据库删除数据_Laravel destroy和delete方法区别
PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】
Laravel如何实现数据库事务?(DB Facade示例)
如何生成腾讯云建站专用兑换码?
深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?
什么是JavaScript解构赋值_解构赋值有哪些实用技巧
Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
如何在服务器上配置二级域名建站?
Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】
Java垃圾回收器的方法和原理总结
Laravel如何记录自定义日志?(Log频道配置)
Laravel如何配置和使用队列处理异步任务_Laravel队列驱动与任务分发实例
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
网站制作大概多少钱一个,做一个平台网站大概多少钱?
Laravel怎么配置自定义表前缀_Laravel数据库迁移与Eloquent表名映射【步骤】
C++时间戳转换成日期时间的步骤和示例代码
夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化
php打包exe后无法访问网络共享_共享权限设置方法【教程】
HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】
Laravel如何配置和使用缓存?(Redis代码示例)
如何快速建站并高效导出源代码?
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?


------------------------------------
namespace Common\Lib;
/**
* qq第三方登录认证
*/
class Qqconnect {
private static $data;
//APP ID
private $app_id="";
//APP KEY
private $app_key="";
//回调地址
private $callBackUrl="";
//Authorization Code
private $code="";
//access Token
private $accessToken="";
private $openid="";
public function __construct(){
$this->app_id="";
$this->app_key="";
$this->callBackUrl=""; //你的回调地址
//检查用户数据
if(empty($_SESSION['QC_userData'])){
self::$data = array();
}else{
self::$data = $_SESSION['QC_userData'];
}
}
//获取Authorization Code
public function getAuthCode(){
$url="https://graph.qq.com/oauth2.0/authorize";
$param['response_type']="code";
$param['client_id']=$this->app_id;
$param['redirect_uri']=$this->callBackUrl;
//生成唯一随机串防CSRF攻击
$state = md5(uniqid(rand(), TRUE));
$_SESSION['state']=$state;
$param['state']=$state;
$param['scope']="get_user_info";
$param =http_build_query($param,'','&');
$url=$url."?".$param;
header("Location:".$url);
}
//通过Authorization Code获取Access Token
private function _getAccessToken(){
$this->code=$_GET['code'];
$url="https://graph.qq.com/oauth2.0/token";
$param['grant_type']="authorization_code";
$param['client_id']=$this->app_id;
$param['client_secret']=$this->app_key;
$param['code']=$this->code;
$param['redirect_uri']=$this->callBackUrl;
$param =http_build_query($param,'','&');
$url=$url."?".$param;
return $this->getUrl($url);
}
//获取openid
public function _setOpenID(){
$rzt=$this->_getAccessToken();
parse_str($rzt,$data);
$this->accessToken=$data['access_token'];
$url="https://graph.qq.com/oauth2.0/me";
$param['access_token']=$this->accessToken;
$param =http_build_query($param,'','&');
$url=$url."?".$param;
$response=$this->getUrl($url);
//--------检测错误是否发生
if(strpos($response, "callback") !== false){
$lpos = strpos($response, "(");
$rpos = strrpos($response, ")");
$response = substr($response, $lpos + 1, $rpos - $lpos -1);
}
$user = json_decode($response);
if(isset($user->error)){
exit("错误代码:100007");
}
return $user->openid;
}
//获取信息
public function getUserInfo(){
if($_GET['state'] != $_SESSION['state']){
exit("错误代码:300001");
}
$openid=$this->_setOpenID();
if(empty($openid)){
return false;
}
session('openid',$openid);
$url="https://graph.qq.com/user/get_user_info";
$param['access_token']=$this->accessToken;
$param['oauth_consumer_key']=$this->app_id;
$param['openid']=$openid;
$param =http_build_query($param,'','&');
$url=$url."?".$param;
$rzt=$this->getUrl($url);
return $rzt;
}
public function getOpenId(){
if($_GET['state'] != $_SESSION['state']){
exit("错误代码:300001");
}
$rzt=$this->_getAccessToken();
parse_str($rzt,$data);
$this->accessToken=$data['access_token'];
$url="https://graph.qq.com/oauth2.0/me";
$param['access_token']=$this->accessToken;
$param =http_build_query($param,'','&');
$url=$url."?".$param;
$response=$this->getUrl($url);
//--------检测错误是否发生
if(strpos($response, "callback") !== false){
$lpos = strpos($response, "(");
$rpos = strrpos($response, ")");
$response = substr($response, $lpos + 1, $rpos - $lpos -1);
}
$info = object_array(json_decode($response));
$qq['access_token'] = $this->accessToken;
$qq['openid'] = $info['openid'];
session('qq',$qq);
return $info['openid'];
}
public function getInfo($openid='',$accessToken=''){
$url="https://graph.qq.com/user/get_user_info";
$param['oauth_consumer_key']=$this->app_id;
$param['access_token']=$accessToken;
$param['openid']=$openid;
$param =http_build_query($param,'','&');
$url=$url."?".$param;
$rzt=$this->getUrl($url);
$info = object_array(json_decode($rzt));
return $info;
}
//CURL GET
private function getUrl($url){
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
if (!empty($options)){
curl_setopt_array($ch, $options);
}
$data = curl_exec($ch);
curl_close($ch);
return $data;
}
//CURL POST
private function postUrl($url,$post_data){
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
ob_start();
curl_exec($ch);
$result = ob_get_contents();
ob_end_clean();
return $result;
}
}