php CI 第三方授权登录 QQ授权登录

2018-03-01 11:09:59来源:oschina作者:bug_lm人点击

分享

申请地址 QQ互联
直接上代码

以下代码是放在application/libraries 如果你不是用的CI 框架也可以直接new
QQ授权配置类 config.php <?php
header('Content-Type: text/html; charset=UTF-8');
/**
* QQ 授权配置账号信息
*/
class Qqconfig {
const QQ_APPID = '******'; //申请到的appid
const QQ_KEY = '***********'; //申请到的appkey
} QQ授权获取数据类 <?php
header('Content-Type: text/html; charset=UTF-8');
/*
* QQ授权登录扩展
*
*/
if (!defined('BASEPATH'))
exit('No direct script access allowed');
include 'qqconfig.php';
include 'qqrecorder.php';
class Qqouath {
const GET_AUTH_CODE_URL = "https://graph.qq.com/oauth2.0/authorize";
const GET_ACCESS_TOKEN_URL = "https://graph.qq.com/oauth2.0/token";
const GET_OPENID_URL = "https://graph.qq.com/oauth2.0/me";
function __construct() {
$this->recorder = new Qqrecorder();
$this->appid = Qqconfig::QQ_APPID;
$this->key = Qqconfig::QQ_KEY;
}
public function qq_login($display = '', $g_ut = 1) {
//-------构造请求参数列表
$keysArr = array(
"response_type" => "code",
"client_id" => $this->appid,
"redirect_uri" => '',
"state" => '',
"scope" => 'get_user_info',
'display' => $display,
'g_ut' => $g_ut
);
$login_url = $this->recorder->combineURL(self::GET_AUTH_CODE_URL, $keysArr);
header("Location:$login_url");
}
public function qq_callback($code = '', $return_state = '') {
$state = $this->recorder->read("state"); //-------请求参数列表
$keysArr = array(
"grant_type" => "authorization_code",
"client_id" => $this->appid,
"redirect_uri" => urlencode(''),
"client_secret" => $this->key,
"code" => $code
);
//------构造请求access_token的url
$token_url = $this->recorder->combineURL(self::GET_ACCESS_TOKEN_URL, $keysArr);
$response = $this->recorder->get_contents($token_url);
if (strpos($response, "callback") !== false) {
$lpos = strpos($response, "(");
$rpos = strrpos($response, ")");
$response = substr($response, $lpos + 1, $rpos - $lpos - 1);
$msg = json_decode($response);
if (isset($msg->error)) {
die('获取数据错误' . $msg->error_description);
}
}
$params = array();
parse_str($response, $params);
return $params["access_token"];
}
public function get_openid($access_token = '') {
//-------请求参数列表
$keysArr = array(
"access_token" => $access_token
);
$graph_url = $this->recorder->combineURL(self::GET_OPENID_URL, $keysArr);
$response = $this->recorder->get_contents($graph_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)) {
die('数据openid错误:' . $user->error_description);
}
return $user->openid;
}
} QQ授权登录 公共方法类 <?php
/* PHP SDK
* @version 2.0.0
* @author [email protected]
* @copyright © 2013, Tencent Corporation. All rights reserved.
*/
class qqrecorder {
private static $data;

/**
* combineURL
* 拼接url
* @param string $baseURL 基于的url
* @param array$keysArr 参数列表数组
* @return string返回拼接的url
*/
public function combineURL($baseURL, $keysArr) {
$combined = $baseURL . "?";
$valueArr = array();
foreach ($keysArr as $key => $val) {
$valueArr[] = "$key=$val";
}
$keyStr = implode("&", $valueArr);
$combined .= ($keyStr);
return $combined;
}
/**
* get_contents
* 服务器通过get请求获得内容
* @param string $url请求的url,拼接后的
* @return string请求返回的内容
*/
public function get_contents($url) {
if (ini_get("allow_url_fopen") == "1") {
$response = file_get_contents($url);
} else {
$ch = curl_init();
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_URL, $url);
$response = curl_exec($ch);
curl_close($ch);
}
//-------请求为空
if (empty($response)) {
$this->error->showError("50001");
}
return $response;
}
/**
* get
* get方式请求资源
* @param string $url 基于的baseUrl
* @param array $keysArr参数列表数组
* @return string返回的资源内容
*/
public function get($url, $keysArr) {
$combined = $this->combineURL($url, $keysArr);
return $this->get_contents($combined);
}
/**
* post
* post方式请求资源
* @param string $url基于的baseUrl
* @param array $keysArr请求的参数列表
* @param int $flag标志位
* @return string返回的资源内容
*/
public function post($url, $keysArr, $flag = 0) {
$ch = curl_init();
if (!$flag)
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_POST, TRUE);
curl_setopt($ch, CURLOPT_POSTFIELDS, $keysArr);
curl_setopt($ch, CURLOPT_URL, $url);
$ret = curl_exec($ch);
curl_close($ch);
return $ret;
}
}

后台调用方法

class test extends CI_Controller {
function __construct() {
parent::__construct();
$this->load->library('qq_login_api/qqoauth');
}
//QQ 登录按钮跳转地址
public function Login_For_QQ_Oauth() {
$this->qqoauth->qq_login();
}
/*
* QQ登录回调地址
* 获取页面返回code
* 通过code获取access_token
* 通过access_token 获取openid
* 判断是否存在该用户
*/
public function Login_For_QQ() {
if (!empty($_GET['code']) ) {
$access_token = $this->qqoauth->qq_callback($_GET['code']);
if (!empty($access_token)) {
$openid = $this->qqoauth->get_openid($access_token);
}
}
}
}
前台调用 window.open("test/Login_For_QQ_Oauth", "TencentLogin", "width=450,height=320,menubar=0,scrollbars=1, resizable=1,status=1,titlebar=0,toolbar=0,location=1");

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台