php获取qzonetoken,QQ一键登录实现
首先,登錄QQ互聯(lián)平臺獲取QQ一鍵登錄所需的Appkey和Appsecret。
2、下載QQ登錄用的SDK軟件包,可以上QQ互聯(lián)官方網(wǎng)下載。這里用的是Connect_PHP_SDK_for_OAuth2_V1.1.zip
3、在登錄頁面放置QQ登錄的圖標(biāo)。
如
functiontoQzoneLogin()
{
varA=window.open("oauth/qq_login.php","TencentLogin","width=450,height=320,menubar=0,scrollbars=1,resizab
le=1,status=1,titlebar=0,toolbar=0,location=1");
}
4、修改comm/config.php中的4個變量
$_SESSION["appid"];
$_SESSION["appkey"];
$_SESSION["callback"];
$_SESSION["scope"];
5、以下是代碼的【實現(xiàn)】
oauth/qq_login.php
require_once("../comm/config.php");
function qq_login($appid,$scope, $callback)
{
$_SESSION['state'] = md5(uniqid(rand(),TRUE)); //CSRF protection
. $appid ."&redirect_uri=" . urlencode($callback)
. "&state=" .$_SESSION['state']
. "&scope=".$scope;
header("Location:$login_url");
}
//用戶點擊qq登錄按鈕調(diào)用此函數(shù)
qq_login($_SESSION["appid"],$_SESSION["scope"], $_SESSION["callback"]);
?>
//應(yīng)用的APPID
$app_id = "YOUR_APP_ID";
//應(yīng)用的APPKEY
$app_secret = "YOUR_APP_KEY";
//成功授權(quán)后的回調(diào)地址
$my_url = "YOUR_REDIRECT_URL";
//Step1:獲取Authorization Code
session_start();
$code = $_REQUEST["code"];
if(empty($code))
{
//state參數(shù)用于防止CSRF***,成功授權(quán)后回調(diào)時會原樣帶回
$_SESSION['state'] =md5(uniqid(rand(), TRUE));
//拼接URL
. $app_id. "&redirect_uri=" . urlencode($my_url) . "&state="
.$_SESSION['state'];
echo("");
}
//Step2:通過Authorization Code獲取Access Token
if($_REQUEST['state'] == $_SESSION['state'])
{
//拼接URL
. "client_id=" .$app_id . "&redirect_uri=" . urlencode($my_url)
."&client_secret=" . $app_secret . "&code=" . $code;
$response =file_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))
{
echo "
error:
" . $msg->error;echo "
msg ?:
" .$msg->error_description;exit;
}
}
//Step3:使用Access Token來獲取用戶的OpenID
$params = array();
parse_str($response, $params);
$params['access_token'];
$str ?=file_get_contents($graph_url);
if (strpos($str,"callback") !== false)
{
$lpos =strpos($str, "(");
$rpos =strrpos($str, ")");
$str ?=substr($str, $lpos + 1, $rpos - $lpos -1);
}
$user = json_decode($str);
if (isset($user->error))
{
echo"
error:
" . $user->error;echo"
msg ?:
" .$user->error_description;exit;
}
echo("Hello " .$user->openid);
}
else
{
echo("The state does notmatch. You may be a victim of CSRF.");
}
?>
以上是寫好的接口,實際上我們只需要在回調(diào)頁面callback.php修改就可以。
require_once("../config.php");
require_once("../qqConnectAPI.php");
require '../config.inc.php';
require '../uc_client/client.php';
require '../api/uc.php';
$qc = new QC();
$acs=$qc->qq_callback();
global $SESSION;
$SESSION->acs=$acs;
//echo $SESSION->acs."
";
$oid = $qc->get_openid();
$SESSION->oid=$oid;
//echo $SESSION->oid."
";
$qc = new QC($acs,$oid);
$uinfo = $qc->get_user_info();
//var_dump($uinfo);
$SESSION->nickname=$uinfo['nickname'];
$username=$SESSION->nickname;
$link=@mysql_connect("localhost","root","root");
mysql_select_db("moodle");
mysql_query('setnames utf8');
$sql1="select* from mdl_user where username='".$uinfo['nickname']."'";
echo $sql1;
$res1=mysql_query($sql1);
$result=mysql_num_rows($res1);
echo $result;
if($result==0){
$sql="insert into mdl_user(id,auth,username,deleted,mnethostid,firstname,openid) values(null,'manual','".$uinfo['nickname']."',0,1,'".$uinfo['nickname']."','$oid')";
$res=mysql_query($sql);
$mysqli=newmysqli("localhost","root","root","discuz");
$mysqli->query("setnames utf8");
$sql2="insertinto cdb_uc_members (uid,username) values(null,'".$uinfo['nickname']."')";
$mysqli->query($sql2);
}
$user =$DB->get_record('user', array('openid' =>$oid, 'deleted' => 0,'mnethostid' => $CFG->mnet_localhost_id));
//var_dump($user);
$userid=$user->id;
//$password=$user->password;
// echo$password;
//echo$uid;
$mysqli=newmysqli("localhost","root","root","discuz");
$mysqli->query("setnames utf8");
$sql3="select* from cdb_uc_members where username='".$uinfo['nickname']."'";
$res= $mysqli->query($sql3);
$row=mysqli_fetch_assoc($res);
$uid=$row['uid'];
$result2= mysqli_num_rows($res);
if($result2 != 0) {
$username=$uinfo['nickname'];
//list($uid, $username2,$password2, $email)= uc_user_login($username,$password=null);
//ucenter表有此用戶,設(shè)置Cookie,登錄成功,并通知其它應(yīng)用同步登錄
setcookie('Mdl_auth', uc_authcode($uid."\t".$username,'ENCODE'));
//生成同步登錄的代碼
$ucsynlogin = uc_user_synlogin($uid);
echo $ucsynlogin.'';
}
//add_to_log(SITEID,'auth_qq', '', '', $username . '/' . $useremail . '/' . $userid);
//$user =authenticate_user_login($username,$password);
//var_dump($user);
complete_user_login($user);
echo "
window.opener.location.reload();
window.close();
";
?>
總結(jié)
以上是生活随笔為你收集整理的php获取qzonetoken,QQ一键登录实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 消息称华晨雷诺金杯暂停向员工发放工资 社
- 下一篇: java怎么打印进制,java编程思维_