主要用到的文件有
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条)