pc网站qq互联登录授权php版

news/2024/5/12 0:40:45/文章来源:https://blog.csdn.net/qq_35231936/article/details/76577636

首先看下工具类

<?php
/*** QQ互联pc网页授权类*/
namespace App\Lib\QQconnect;use App\Lib\Util\Curl;class QQconnect{const err = [0 =>'成功',100000 =>   '缺少参数response_type或response_type非法',100001 =>   '缺少参数client_id',100002 =>   '缺少参数client_secret',100003 =>   'http head中缺少Authorization',100004 =>   '缺少参数grant_type或grant_type非法',100005 =>   '缺少参数code',100006 =>   '缺少refresh token',100007 =>   '缺少access token',100008 =>   '该appid不存在',100009 =>   'client_secret(即appkey)非法',100010 =>   '回调地址不合法,常见原因请见:回调地址常见问题及修改方法',100011 =>   'APP不处于上线状态',100012 =>   'HTTP请求非post方式',100013 =>   'access token非法',100014 =>   'access token过期。 token过期时间为3个月。如果存储的access token过期,请重新走登录流程,根据使用Authorization_Code获取Access_Token或使用Implicit_Grant方式获取Access_Token获取新的access token值',100015 =>   'access token废除。 token被回收,或者被用户删除。请重新走登录流程,根据使用Authorization_Code获取Access_Token或使用Implicit_Grant方式获取Access_Token获取新的access token值',100016 =>   'access token验证失败',100017 =>   '获取appid失败',100018 =>   '获取code值失败',100019 =>   '用code换取access token值失败',100020 =>   'code被重复使用',100021 =>   '获取access token值失败',100022 =>   '获取refresh token值失败',100023 =>   '获取app具有的权限列表失败',100024 =>   '获取某OpenID对某appid的权限列表失败',100025 =>   '获取全量api信息、全量分组信息',100026 =>   '设置用户对某app授权api列表失败',100027 =>   '设置用户对某app授权时间失败',100028 =>   '缺少参数which',100029 =>   '错误的http请求',100030 =>   '用户没有对该api进行授权,或用户在腾讯侧删除了该api的权限。请用户重新走登录、授权流程,对该api进行授权',100031 =>   '第三方应用没有对该api操作的权限。请发送邮件进行OpenAPI权限申请',100032 =>   '过载,一开始未细分时可以用',100033 =>   '缺少UIN参数',100034 =>   '缺少skey参数',100035 =>   '用户未登陆',100036 =>   'RefreshToken失效',100037 =>   'RefreshToken已过期',100038 =>   'RefreshToken已废除',100039 =>   'RefreshToken到达调用上限',100040 =>   'RefreshToken的AppKey非法',100041 =>   'RefreshToken的AppID非法',100042 =>   'RefreshToken非法',100043 =>   'APP处于暂停状态',100044 =>   'Md5校验失败',100045 =>   '用户改密token失效',100046 =>   'g_tk校验失败',100048 =>   '没有设置companyID',100049 =>   'APPID没有权限(get_unionid)',100050 =>   'OPENID解密失败,一般是openid和appid不匹配',100051 =>   '调试模式无权限'];#接口地址const LINK = ['oauth' => 'https://graph.qq.com/oauth2.0/authorize',#获取Authorization Code'getAccessToken' => 'https://graph.qq.com/oauth2.0/token',#获取或刷新Access Token'getOpenid' => 'https://graph.qq.com/oauth2.0/me',#access_token'getUserInfo' => 'https://graph.qq.com/user/get_user_info',#获取用户基本信息];#appidprivate $appid;#appkeyprivate $appkey;#请求用户授权时向用户显示的可进行授权的列表get_user_info,list_album...逗号分开,默认get_user_infoprivate $scope;#回调地址(务必于应用上填写的一致)private $redirect_uri;#错误代码private $errcode;#错误信息private $errmsg;#单例private static $_instance;private function __construct($appid,$appkey){$this->appid = $appid;$this->appkey = $appkey;}private function __clone(){}public static function main(){if(!isset(self::$_instance)){if(func_num_args()<2){exit('实例化-参数个数错误!');}$args = func_get_args();self::$_instance = new self($args[0],$args[1]);}return self::$_instance;}/***获取错误信息代码** @param string|array $flag 1:错误代码,2:错误信息,others:数组* @return  string|array*/public function getError($flag=0){switch ($flag){case 0:$errmsg = $this->errmsg;break;case 1:$errmsg = $this->errcode;break;default:$errmsg = ['errcode' => $this->errcode,'errmsg' => $this->errmsg];break;}return $errmsg;}#设置回调地址public function setRedirectUri($uri){$this->redirect_uri = $uri;}#获取回调地址public function getRedirectUri(){return $this->redirect_uri;}/***setScope 设置授权列表** @param string|array $scope 授权列表,逗号分隔* @return void*/public function setScope($scope){if(is_array($scope)){$scope = implode(',',$scope);}$this->scope =$scope;}#获取授权列表 true 数组,默认false 逗号分隔字符串public function getScope($flag=false){if($flag){return explode(',',$this->scope);}return $this->scope;}/***getOauthUrl 获取授权地址*/public function getOauthUrl($state=null,$display=null){$keysArr = ['response_type' => 'code','client_id' => $this->appid,'state' => $state,'redirect_uri' => urlencode($this->redirect_uri),'display' => $display,'scope' => $this->scope];return self::combineURL(self::LINK['oauth'],$keysArr);}/***getAccessToken 通过code获取access_token** @param string $code 授权获取的code* @return string*/public function getAccessToken($code){$keysArr = ['grant_type' => 'authorization_code','client_id' => $this->appid,'client_secret' => $this->appkey,'redirect_uri' => urlencode($this->redirect_uri),'code' => $code];$link = self::combineURL(self::LINK['getAccessToken'],$keysArr);$resData = Curl::main()->get($link);//--------检测错误是否发生if(strpos($resData, "callback") !== false){$lpos = strpos($resData, "(");$rpos = strrpos($resData, ")");$resData = substr($resData, $lpos + 1, $rpos - $lpos -1);$resData = json_decode($resData,true);if(isset($resData['error'])){$this->errcode = $resData['error'];$this->errmsg = self::err[$resData['error']];return false;}}else{parse_str($resData,$param);return $param['access_token'];}}/***getUserOpenid 通过access_token获取用户openid** @param string $access_token* @return string*/public function getUserOpenid($access_token){$link = self::combineURL(self::LINK['getOpenid'],['access_token'=>$access_token]);$response = Curl::main()->get($link);//--------检测错误是否发生if(strpos($response, "callback") !== false){$lpos = strpos($response, "(");$rpos = strrpos($response, ")");$response = substr($response, $lpos + 1, $rpos - $lpos -1);}$user = json_decode($response,true);if(isset($user['error'])){$this->errcode = $user['code'];$this->errmsg = self::err[$user['code']];return false;}return $user['openid'];}/***getUserInfo 获取用户基本信息** @param string $access_token* @param string $openid* @return boolean|array*/public function getUserInfo($access_token,$openid){$link = self::combineURL(self::LINK['getUserInfo'],['access_token' => $access_token,'oauth_consumer_key' => $this->appid,'openid' => $openid]);$resData = Curl::main()->get($link);return self::checkResult($resData);}/***checkResult 请求结果处理** @param string $resData 待检测数据* @return boolean|array*/public  function checkResult($resData){$resData = json_decode($resData,true);if(!$resData || $resData['ret']!=0){$this->errcode = $resData['ret'];$this->errmsg = $resData['msg'];return false;}else{return $resData;}}/*** combineURL 拼接url* @param string $baseURL   基于的url* @param array  $keysArr   参数列表数组* @return string           返回拼接的url*/public static function combineURL($baseURL,$keysArr){$combined = $baseURL."?";$valueArr = array();foreach($keysArr as $key => $val){$valueArr[] = "$key=$val";}$keyStr = implode("&",$valueArr);$combined .= ($keyStr);return $combined;}
}

注意
* 其中用到Curl类,主要实现get或post请求,file_get_contents效果一样
1. getOauthUrl(),获取授权地址
2. getAccessToken( code)accesstokencode13.getUserOpenid( access_token),获取用户openid,需2中accesstoken
4. getUserInfo( accesstoken, openid),需2,3不中的accesstoken和openid
具体调用方法(laravel版)

<?php
/*** PC网站QQ登录授权**/
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Lib\QQconnect\QQconnect;
use Illuminate\Http\Request;class QQoauthController extends Controller{const APPID = '你自己的appid’;const APPKEY = '你自己的APPKEY ';const REDIRECT_URI = '你自己的回调地址';const SCOPE = 'get_user_info';const STATE = 'test';private $qqconnect;public function __construct(){$this->qqconnect = QQconnect::main(self::APPID,self::APPKEY);$this->qqconnect->setRedirectUri(self::REDIRECT_URI);$this->qqconnect->setScope(self::SCOPE);}/***授权获取code*/public function index(Request $request){if(!$request->has('state')){header('Location:'.$this->qqconnect->getOauthUrl(self::STATE));}else{$code = $request->input('code');$state = $request->input('state');if($state != self::STATE ){exit('非法操作!');}#获取access_token$access_token = $this->qqconnect->getAccessToken($code);if(!$access_token){exit($this->qqconnect->getError());}#获取openid$openid = $this->qqconnect->getUserOpenid($access_token);if(!$openid){exit($this->qqconnect->getError());}#获取用户基本信息$userinfo =$this->qqconnect->getUserInfo($access_token,$openid);if(!$userinfo){exit($this->qqconnect->getError());}session(['userinfo'=>$userinfo]);return redirect()->route('index');}}
}

看到$userinfo如下图,说明你已调用成功

这里写图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_880068.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虚拟机内的homestead环境下的网站项目让局域网内的同事访问

# 登录进虚拟机 $ vagrant ssh # 共享本地域名 $ share apitest.cn如图红框圈住的地址就可以访问了&#xff0c;6666

怎样在织梦dedecms网站上添加漂浮广告

在织梦 dedecms的网站上添加漂浮广告其实很简单&#xff0c;这篇文章主要讲的是在织梦网站首页添加漂浮广告。 我们用本地搭建的织梦默认模板演示。 1、准备一个广告图片 准备一个广告图片&#xff0c;命名为漂浮.gif &#xff0c;设置好图片大小150*150 &#xff0c;之后把图片…

dedecms教程:多款精美分页网站模板pagelist样式

使用dedecms&#xff0c;有时需要自定义分页样式。怎么办呢&#xff1f; 不急&#xff0c;20几款精美分页样式&#xff0c;总有一款你最喜欢。使用很简单&#xff1a; 步骤&#xff1a;三步即可解决 多款精美dede分页样式.zip 1、直接覆盖include/arc.listview.class页 2、把演…

dedecms教程:网站模板自定义表单制作在线订单详细解说

一步首先你要知道自定义表单的后台界面在哪里截图 第二步添加自定义表单 我选择完全公开就是说访客提交的时候他们也是可以看到我们的自定义信息的 数据表 模板根据你的模板自定义即可 我们先look下 下面就是自定义的内容了 我随便举例给大家演示下 首先返回界面 点击红圈来添加…

dedecms教程:织梦做中英文(多语言)网站详解

对于多语言网站&#xff0c;可能许多人都想进行制作&#xff0c;可又不明白其中的道理&#xff1b;因为多语言网站不仅仅只是一个网站站点&#xff0c;具有多个而且是不同语言&#xff1b;它也不是站群&#xff0c;就是一个网站的一部分&#xff01; 首先实现多语言站点提供两种…

[原创]DEDE 织梦建站,仿站(包含5套正版建站软件)

教程包括&#xff1a; 3、dedecms仿站进门教程 本教程适用于&#xff1a; 网易博客安全提醒&#xff1a;系统检测到您当前密码的安全性较低&#xff0c;为了您的账号安全&#xff0c;建议您适时修改密码 立即修改 | 封闭 5、dedecms综合学习资料汇编&#xff1b; 重要提醒&…

简单解释网站是如何进行访问的

今天学习的时候看到一个值得记录的面试题&#xff1a; 一个网站是如何进行访问的 首先输入网址域名&#xff0c;回车&#xff1a; 1.检查本机的C:\Windows\System32\drivers\etc\hosts配置文件里有没有这个网址的域名映射 如果有&#xff0c;则直接返回对应的ip地址&#xf…

Javaweb Listener监听器的简单应用:统计网站在线人数

Listener监听器实现统计网站在线人数 开发环境&#xff1a; IntelliJ IDEA 一、什么是监听器 是指专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象&#xff0c;当被监视的对象发生变化时&#xff0c;立即采取相应的行动。 具体参考下文&#xff1a; J…

SEOER都在为网站的“流量增长优化”而迷茫

SEO优化不得不说现在做SEO的工作是非常困难的&#xff0c;而在这个行业里从业多年的SEO经理们&#xff0c;不仅仅要扛着很大的压力、还要面对下属对自己传经授教的一些期盼&#xff0c;对外更不知道搜索引擎&#xff0c;特别是百度又要干什么来剥削你的流量了&#xff01; 但其…

构建自己的网站(一)——uWSGI+Django实现显示图片点击更新

文章目录 目的说明前提遇到的问题及解决通过ip地址端口也访问不到服务器&#xff1f;域名不可用&#xff1f;域名解析后还是不可用&#xff1f;80端口没开放&#xff1f;本地实现点击切换图片djangohtml图片显示不出来&#xff1f;django服务器实现显示图片创建django项目&…

小程序打开网站小程序

呵呵&#xff0c;昨天晚上&#xff0c;快停电了&#xff0c;打开csdn &#xff0c;打开了好多的网页&#xff0c;可是 快停电&#xff0c;关网了&#xff0c;唉 &#xff01;有好多想看的网页&#xff0c;舍不得 不看&#xff0c;于是把网址 保存到一个txt文件里面&#xff0c;…

怎么使用PHP和MySQL创建个性的网站分页

分页起着重要的作用&#xff0c;在任何Web应用程序&#xff0c;具有足够大的数据被分成页。它不仅外观整洁&#xff0c;但也提高了一个网页的加载时间。所以&#xff0c;分页是很重要的一个改进的用户界面&#xff0c;并节省服务器资源。在本教程中&#xff0c;我会告诉你一个简…

谷歌的Javascript bot可以K掉你的网站

近年来由于开发商误导的企图&#xff0c;使网络更有趣的东西&#xff0c;如JavaScript和Ajax的搜索引擎不得不拿出新的工具来访问这些技术背后隐藏的内容。虽然我敢肯定&#xff0c;在Googleplex的人都没有&#xff0c;但发展背后这些先进的爬行技术最好的意图&#xff0c;他们…

转载:50个好网站,从此上网不再虚度!

《意林》&#xff0c;短小精悍的小故事&#xff0c;每次都能打动读者的心扉&#xff01;http://www.yilin.net.cn丁香园&#xff0c;一个生物学和医学专业的挚爱。http://www.dxy.cn生物谷&#xff0c;看了名字就知道是生物类的网站。http://www.bioon.com《环球科学》杂志的官…

如何在XAMPP中设置多个网站

xampp 是一个非常方便的本地 apache php mysql 的调试环境&#xff0c;在本地安装测试 WordPress 等各种博客、论坛程序非常方便。今天我们来给大家介绍一下&#xff0c;如何使用 XAMPP 在本地进行安装多个网站。 一般情况下&#xff0c;我们只需要网站程序放到 xampp/htdoc …

Linux云计算之web网站平台——LAMP

Linux Apache MySQL PHP Apache&#xff1a;实现网页共享传输 MySQL&#xff1a;实现数据存储 PHP&#xff1a;实现页面解析的解析器 浏览器&#xff1a; 仅能解析简单的HTML语言&#xff0c;无法直接解析PHP语言 部署方式&#xff1a;yum安装&#xff1a;优点&#xff1…

那些年用node接入微信走过的坑之(四)---微信扫码登录第三方网站

序言 随着微信使用者不断增多&#xff0c;很多网站使用了微信扫码登录功能&#xff0c;这里做一个简单的实现。 第三方网页授权和微信网页端授权 这两个笔者当初区分了好久&#xff0c;有什么区别和联系呢&#xff1f; 相同点&#xff1a; 两者的过程基本是类似的&#xf…

【大型网站技术实践】初级篇:借助…

原文地址&#xff1a;http://www.cnblogs.com/edisonchou/p/4281978.html 一、负载均衡&#xff1a;必不可少的基础手段 1.1 找更多的牛来拉车吧 当前大多数的互联网系统都使用了服务器集群技术&#xff0c;集群即将相同服务部署在多台服务器上构成一个集群整体对外提供服务&am…

【大型网站技术实践】初级篇:借助…

原文地址&#xff1a;http://www.cnblogs.com/edisonchou/p/4126742.html 一、反向代理&#xff1a;Web服务器的“经纪人” 1.1 反向代理初印象 反向代理&#xff08;Reverse Proxy&#xff09;方式是指以代理服务器来接受internet上的连接请求&#xff0c;然后将请求转发给内部…

02 自定义网站的根目录

电脑控制台——》(左键单击)Apache——》httpd.conf单开改文件 打开httpd.conf配置文件 搜索documentRoot 在红色框相应改成自己的文件目录和文件就行了。默认是f:/wamp/www (f:表示安装时的安装目录) 到目前为止还没完。继续如下操作 需要改wamp安装目录下的 wampmanager.ini …