微信网页授权

首先创建微信的第三方类库 项目是tp5 所以我就放在了\extend\Oauth\wxlogin\WXlogin.php;

<?php
namespace Oauth\wxlogin;use think\Session;/*** 微信登录*/
class WXlogin
{public function __construct(){$this->appID = 'wx0000090'; //微信appid$this->callBackUrl  = 'http://' . $_SERVER['HTTP_HOST'] . '/member/member/wxBack';//回调地址$this->appSecret    = 'ca6a577393a';//密钥}/*** 获取微信url* @return [type] [description]*/public function wxIndexUrl(){//--微信登录-----生成唯一随机串防CSRF攻击$state = md5(uniqid(rand(), true));Session::set('wx_state', $state); //存到SESSION$callback = urlencode($this->callBackUrl);//'https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect';$wxurl = "https://open.weixin.qq.com/connect/qrconnect?appid=". $this->appID . "&redirect_uri=". $callback . "&response_type=code&scope=snsapi_login&state=". $state . "#wechat_redirect";return $wxurl;die;// header("Location: $wxurl");}/*** 获取微信返回信息* @return [type] [description]*/public function wxGetUserInfo(){if ($_GET['state'] != Session::get('wx_state')) {return ['status'=>-1,'msg'=>'请求失败'];}$url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=' . $this->appID . '&secret=' . $this->appSecret . '&code=' . $_GET['code'] . '&grant_type=authorization_code';$arr = Tcurl($url);$arr = json_decode($arr,true);//得到 access_token 与 openid$url       = 'https://api.weixin.qq.com/sns/userinfo?access_token=' . $arr['access_token'] . '&openid=' . $arr['openid'] . '&lang=zh_CN';$user_info = Tcurl($url);$user_info = json_decode($user_info,true);return ['status'=>1,'msg'=>'成功','data'=>$user_info];}
}

然后在控制器中调用  返回微信登录的url && 处理用户的信息

    /*** 获取微信登录url* @return [type] [description]*/public function wxloginUrl(){$Weixin = new \Oauth\wxlogin\WXlogin;$wxurl  = $Weixin->wxIndexUrl();return $wxurl;}
     /*** 微信回调接收用户信息 && 处理登录 && 注册* @return [type] [description]*/public function wxBack(){$Weixin = new \Oauth\wxlogin\WXlogin;$wxData = $Weixin->wxGetUserInfo();if ($wxData['status'] != 1) {jsonEncode('数据有误');}//进行项目逻辑处理开始//结束}

使用qq登录

首先创建qq需要的类库

tp5中 我放在了\extend\Oauth\qqlogin中;里面有两个文件,类库QQconnent.php和调用类库的Qqlogin.php

QQconnect.php内容 主要调用在Qqlogin.php中

<?php
namespace Oauth\qqlogin;/*** qq登录授权*/
class QQconnect
{private $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 => '调试模式无权限',];#接口地址private $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;public function __construct(){$this->appid        = '10789456';//申请的appid  (qq互联)$this->appkey       = 'd6ee34aa24df27';//申请的appkey$this->redirect_uri = request()->domain() . '/member/member/qqaction';}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($this->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($this->LINK['getAccessToken'], $keysArr);$resData = self::qqCurl($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  = $this->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($this->LINK['getOpenid'], ['access_token' => $access_token]);$response = self::qqCurl($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  = $this->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($this->LINK['getUserInfo'], ['access_token'       => $access_token,'oauth_consumer_key' => $this->appid,'openid'             => $openid,]);$resData = self::qqCurl($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请求*/public function qqCurl($url, $type = "GET", $data = ''){$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);curl_setopt($ch, CURLOPT_HEADER, 0);$type = strtolower($type);switch ($type) {case 'get':break;case 'post'://post请求配置curl_setopt($ch, CURLOPT_POST, 1);curl_setopt($ch, CURLOPT_POSTFIELDS, $data);break;}$result = curl_exec($ch);curl_close($ch);return $result;}
}

Qqlogin.php内容

<?php
namespace Oauth\qqlogin;use Oauth\qqlogin\QQconnect;
use think\Session;/*** qq登录授权*/
class Qqlogin
{public function qqloginUrl(){$QQconnect = new \Oauth\qqlogin\QQconnect();$state = md5(uniqid(rand(), TRUE));Session::set('state',$state);return $QQconnect->getOauthUrl($state);}public function getUserInfo(){$code = $_GET['code'];$state = $_GET['state'];if ($state != Session::get('state')) {return ['status'=>-1,'msg'=>'登录有误,请重新登录'];}$QQconnect = new \Oauth\qqlogin\QQconnect();#获取access_token$access_token = $QQconnect->getAccessToken($code);if (!$access_token) {return ['status' => -1, 'msg' => $QQconnect->getError()];}#获取openid$openid = $QQconnect->getUserOpenid($access_token);if (!$openid) {return ['status' => -1, 'msg' => $QQconnect->getError()];}#获取用户基本信息$userinfo = $QQconnect->getUserInfo($access_token, $openid);if (!$userinfo) {return ['status' => -1, 'msg' => $QQconnect->getError()];}$result = array_merge($userinfo, ['openid' => $openid]);return ['status' => 1, 'msg' => '成功', 'data' => $result];}
}

然后在控制器中调用

    /*** qq登录url* @return [type] [description]*/public function qqloginUrl(){$Qqconnect  = new \Oauth\qqlogin\Qqlogin();$qqloginUrl = $Qqconnect->qqloginUrl();return $qqloginUrl;}
    //qq回调public function qqaction(){$Qqconnect = new \Oauth\qqlogin\Qqlogin();$profile   = $Qqconnect->getUserInfo();if ($profile['status'] != 1) {jsonEncode('数据有误');}//逻辑处理}

网站使用微信网页授权,qq登录相关推荐

  1. H5页面使用微信网页授权实现登录认证

    在用H5开发微信公众号页面应用时,往往需要获取微信的用户信息,H5页面在微信属于访问第三方网页,因此通过微信网页授权机制,来获取用户基本信息,此处需要用户确认授权才能获取,用户确认授权后,我们可以认为 ...

  2. 微信公众号开发-使用微信网页授权进行登录并加上过滤器判断是否已登录

    首先你需要阅读一下这篇文档 微信开放文档 你需要去搞一个本地内网穿透,这样你就可以在本地进行调试你的代码. 我用的穿透工具是这个:natapp 你还需要下载一个微信开发者工具 开发者工具下载,因为从手 ...

  3. 【WEB开发】微信网页授权第三方登录接口(WEB登录)

    https://www.cnblogs.com/xuzhengzong/p/8513269.html 本文链接至:http://blog.csdn.net/hxker/article/details/ ...

  4. Vue 微信网页授权自动登录

    项目需求:微信公众号(服务号)访问网页,第一次登录后,再次访问默认自动登录,执行退出后,可重新手动登录. 具体实现如下: 微信公众号 - 设置 - 公众号设置 - 功能设置 - 配置网页授权域名,用于 ...

  5. 微信授权Java重定向前端地址_微信网页授权+分享踩过的坑

    页面用浏览器自带返回和安卓物理返回死循环的话,直接看高潮部分 背景 折磨我两个工作日加周末一天的问题,我觉得还是有必要记录一下,为什么程序员总是加班,就是遇到这些意想不到的问题 需求 领导:我想做两个 ...

  6. php微信授权ajax,ajax 实现微信网页授权登录

    项目背景 因为项目采用前后端完全分离方案,所以,无法使用常规的微信授权登录作法,需要采用 ajax 实现微信授权登录. 需求分析 因为本人是一个PHPer ,所以,微信开发采用的是 EasyWeCha ...

  7. ajax 微信code获取_ajax 实现微信网页授权登录的方法

    项目背景 因为项目采用前后端完全分离方案,所以,无法使用常规的微信授权登录作法,需要采用 ajax 实现微信授权登录. 需求分析 因为本人是一个phper ,所以,微信开发采用的是 EasyWeCha ...

  8. 微信公众号开发(一) 微信网页授权登录

    微信网页授权登录 前期准备 授权登录 获取微信数据 处理授权拒绝 前期准备 1.微信公众号开发,首先要搞一个公众号,开发阶段可以申请一个公众平台测试账号. (进入到微信公众公众平台,找到开发者工具,点 ...

  9. java ajax 微信网页授权_ajax 实现微信网页授权登录的方法

    AJAX 的 ajax 实现微信网页授权登录的方法 项目背景 因为项目采用前后端完全分离方案,所以,无法使用常规的微信授权登录作法,需要采用 ajax 实现微信授权登录. 需求分析 因为本人是一个ph ...

  10. 微信网页授权登录的方法

    微信网页授权登录官方文档 微信网页授权登录的方法–推荐文章一 微信网页授权登录的方法–推荐文章二 总结: 微信授权方式(scope的属性值控制): 应用授权作用域,snsapi_base (不弹出授权 ...

最新文章

  1. 监听发现局域网dropbox客户端broadcast-dropbox-listener
  2. 计算机电缆和控制电缆区别,动力电缆和控制电缆有啥区别?
  3. Windows核心编程 第26章 窗口消 息
  4. Android MediaPlayer
  5. IOS -- UICollectionView里面的cell点击,点击一个cell改变其他cell的状态
  6. mysql5.7压缩包安装教程
  7. 副高 职称计算机 上海,高级职称评定
  8. 服务器文件系统报错处理办法
  9. 移动互联网技术(wifi)
  10. c语言中eof的作用,C语言中,怎么用EOF结束输入?
  11. SMART PLC如何修改运动控制向导生成的点动速度(JOG_SPEED)
  12. 感冒发烧,病毒,细菌,抗生素?
  13. 2022-2028全球快餐肉汤食品行业调研及趋势分析报告
  14. elasticsearch安装和使用
  15. nodejs模拟登陆旧版正方教务系统
  16. Kubernetes阿里云YUM更新源k8s国内源
  17. 软件质量保证测试——共享车位
  18. 阿尔法小蛋机器人热点密码_阿尔法小蛋怎样连接手机热点
  19. 《Java版本二叉树的创建和前序中序后序层次遍历》--递归版本
  20. 【游戏开发实战】手把手教你从零跑一个Skynet,详细教程,含案例讲解(服务端 | Skynet | Ubuntu)

热门文章

  1. List 接口和常用方法
  2. Set 接口实现类-HashSet
  3. Vue的内容抽离过程
  4. 为梦想--不抛弃,不放弃!!!
  5. #pragma comment 用法
  6. Cipher的初应用
  7. 洛阳最新打卡地--洛阳新都汇购物公园变样啦
  8. php如何将excel数据导入到数据库,【PHP】将Excel数据导入到MySQL数据库中
  9. Python大作业-爬取成都链家租房信息(大作业)源码
  10. 高小英和张东健1998年合作出演过爱情片《恋风恋歌