99kk1.com login.php,自己写的qq登录功能,无需官方SDK

主要用到的文件有1.自定义异常处理类  HttpException 位于applicationlibexceptionHttpException .php2.配置文件 configqq.php3.自己写的核心文件 Qq.phpTP版

主要用到的文件有

1.自定义异常处理类  HttpException 位于application/lib/exception/HttpException .php

2.配置文件 config/qq.php

3.自己写的核心文件 Qq.php

TP版本V5.1.5

PHP 版本 7.2

对于自定义异常处理类做了很多处理 所以这里就不发了,大家用的时候可以自己扩展一下,也可以参考官方文档自定义一个异常处理

对于配置文件中的重要输入 会用*代替

没有对用户注销做处理,大家可以自己写一下,在用户退出的时候将调用qq登录接口的Session全部删掉就可以了!

Qq.php

/**

* Email: 1614369925@qq

* User: 李昊天

* Date: 2018/3/4

* Time: 10:36

*/

namespace app\user\controller;

use app\lib\exception\HttpException;

use think\facade\Session;

class Qq

{

private $get_code_url = ''; //获取code的地址

private $appId = '';    //appid

private $appKey = '';    //appkey

private $callback = '';  //回调地址

public function __construct()

{

$this->appId = config('qq.appId');

$this->appKey = config('qq.appKey');

$this->callback = config('qq.callback');

}

public function qqLogin()

{

Session::set('qAuthData.state', md5(uniqid(rand(), TRUE)));

$this->get_code_url = sprintf(config('qq.qq_login.get_code_url'), $this->appId, $this->callback, Session::get('qAuthData.state'), 'all');  //获取Code 地址

return $this->get_code_url;

}

public function qq_callback()

{

if (Session::get('qAuthData.state') != input('get.state')) {

throw new HttpException([

'msg' => '参数错误,请重新发起登录请求!'

]);

}

$code = input('get.code');

Session::set('qAuthData.code', $code);

$url = sprintf(config('qq.get_account_token.get_account_token_url'), $this->appId, $this->callback, $this->appKey, $code);

$Result = curl_get($url);

//$response ='callback( {"error":100020,"error_description":"code is reused error"} )';  //请求失败示例

//$response = 'access_token=************&expires_in=7776000&refresh_token=************';  //请求成功示例

if (strpos($Result, "callback") !== false) {

$lpos = strpos($Result, "(");

$rpos = strrpos($Result, ")");

$response = substr($Result, $lpos + 1, $rpos - $lpos - 1);

$error = json_decode($response );

throw new HttpException([

'msg' => $error->error_description,

'errorCode' => $error->error

]);

}

$data = [];

parse_str($Result, $data);

if (!array_key_exists('access_token', $data)) {

throw new HttpException([

'msg' => '获取access_token失败,服务器错误!',

'errorCode' => '500'

]);

}

$access_token = $data['access_token'];

Session::set('qAuthData.access_token', $access_token);

return $data;

}

public function get_openid()

{

$get_openId_url = config('qq.get_openId.get_openId_url') . '?access_token=' . Session::get('qAuthData.access_token');

$result = curl_get($get_openId_url);

//$result = 'callback( {"client_id":"******","openid":"*************"} )'; //请求成功示例

//$result = callback( {"error":100007,"error_description":"param access token is wrong or lost "} ) //请求失败示例

#检测错误是否发生

if (strpos($result, "callback") !== false) {

$l = strpos($result, "(");

$r = strrpos($result, ")");

$Result = substr($result, $l + 1, $r - $l - 1);

}

$user = json_decode($Result);

Session::set('qAuthData.openId', $user->openid);

return $user->openid;

}

public function userinfo()

{

$UserData = Session::get('qAuthData');

if (!array_key_exists('access_token', $UserData)) {

throw new HttpException([

'msg' => 'access_token 不存在 无法获取用户信息!'

]);

}

if (!array_key_exists('openId', $UserData)) {

throw new HttpException([

'msg' => '用户openID不存在,请重新登录!'

]);

}

$access_token = $UserData['access_token'];

$openId = $UserData['openId'];

$get_user_info = sprintf(config('qq.get_user_info.get_user_info_url'), $access_token, $openId, $this->appId);

$UserResult = curl_get($get_user_info);

$res = json_decode($UserResult);

if(!property_exists($res,'ret')){

throw new HttpException([

'msg' => '获取用户信息失败,未知错误'

]);

}

if($res->ret != 0){

throw new HttpException([

'msg' => $res->msg

]);

}

return json($res);

}

}

config/qq.php 文件

/**

* User: 李昊天

* Email: 1614369925@qq

* Date: 2018/2/26

* Time: 13:57

*/

return [

'appId' => '*********',

'appKey' => '*********',

'callback' => '*********',

'qq_login' => [

'get_code_url' => 'https://graph.qq/oauth2.0/authorize?response_type=code&client_id=%s&redirect_uri=%s&state=%s&scope=%s'

],

'get_account_token'=>[

'grant_type' => 'authorization_code',

'get_account_token_url' => 'https://graph.qq/oauth2.0/token?grant_type=authorization_code&client_id=%s&redirect_uri=%s&client_secret=%s&code=%s'

],

'get_openId' => [

'get_openId_url'=>'https://graph.qq/oauth2.0/me'

],

'get_user_info' => [

'get_user_info_url' => 'https://graph.qq/user/get_user_info?format=json&access_token=%s&openid=%s&oauth_consumer_key=%s'

],

];

发布者:admin,转转请注明出处:http://www.yc00.com/web/1754843664a5206089.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信