在Codeigniter/PHP框架下,实现腾讯第三方网站接入.接入方式(OAuth2.0)
1. 跟其他第三方接入一样,我们需要申请接入获取 APP ID,KEY信息
首先我们放置一张登陆图片,
<a href="请求地址">
<img src="http://qzonestyle.gtimg.cn/qzone/vas/opensns/res/img/Connect_logo_7.png">
</a>
1.1. 获取access_token
请求地址:
http://graph.qq.com/oauth2.0/authorize?response_type=token&client_id=YOU_APP_ID&redirect_uri=YOU_REDIRECT_URL
返回地址:
http://graph.qq.com/demo/index.jsp?#access_token=FE04************************CCE2&expires_in=7776000
可通过js方法:window.location.hash来获取URL中#后的参数值。传送:如何使用window.location.hash获取#后参数值
1.2. 根据access_token获得对应用户身份的openid
根据回调的地址传递的access_token,在后台获取openid
// 获取OpenID
function getOpenId($access_token)
{
$url = "https://graph.qq.com/oauth2.0/me";
$ch = curl_init();//创建curl会话
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_URL, $url);/*如果需要获取一个URL的内容,传递一个URL给curl_setopt()函数*/
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//终止从服务端进行验证
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);//获得URL站点的内容但不输出在浏览器
curl_setopt($ch, CURLOPT_POSTFIELDS,"access_token=$access_token");
$output = curl_exec($ch);//打印出URL站点的内容
$info = curl_getinfo($ch);//获取最后一次传输的相关信息
if ($output === false || $info['http_code'] != 200)
{
$output = "No cURL data returned for $url [". $info['http_code']. "]";
if (curl_error($ch))
$output .= "\n". curl_error($ch);
}else {
//将json变量 转换成php变量
$str=$output;
preg_match('/\{[^\}]*\}/',$str,$obj);
$tmp = json_decode($obj[0],true);
return $tmp;
}
curl_close($ch);//关闭curl会话
}
1.3. 根据access_token ,openid信息,调用API,下面示例如何获取用户信息API
// 调用 get_user_info API
function get_user_info($access_token,$oauth_consumer_key,$openid)
{
$url = "https://graph.qq.com/user/get_user_info";
$ch = curl_init();//创建curl会话
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_URL, $url);/*如果需要获取一个URL的内容,传递一个URL给curl_setopt()函数*/
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);//终止从服务端进行验证
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);//获得URL站点的内容但不输出在浏览器
curl_setopt($ch, CURLOPT_POSTFIELDS,"access_token=$access_token&oauth_consumer_key=$oauth_consumer_key&openid=$openid");
$output = curl_exec($ch);//打印出URL站点的内容
$info = curl_getinfo($ch);//获取最后一次传输的相关信息
if ($output === false || $info['http_code'] != 200)
{
$output = "No cURL data returned for $url [". $info['http_code']. "]";
if (curl_error($ch))
$output .= "\n". curl_error($ch);
}else {
//将json变量 转换成php变量
$obj = json_decode($output);
return $obj;
}
curl_close($ch);//关闭curl会话
}
//调用QC.Login方法,指定btnId参数将按钮绑定在容器节点中
QC.Login({
btnId:"qqLoginBtn",
scope:"all",
size: "A_M"
}, function(reqData, opts){
//登录成功
var dom = document.getElementById(opts['btnId']),
_logoutTemplate=[
//头像
'<span><img src="{figureurl}" class="{size_key}"/></span>',
//昵称
'<span> {nickname} </span>',
//退出
'<span><a href="javascript:QC.Login.signOut();"> 退出 </a></span>'
].join("");
dom && (dom.innerHTML = QC.String.format(_logoutTemplate, {
nickname : QC.String.escHTML(reqData.nickname),
figureurl : reqData.figureurl
}));
// ajax
var xmlhttp;
if (window.XMLHttpRequest)
{
// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{
// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.onreadystatechange=function()
{
if (xmlhttp.readyState==4 && xmlhttp.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
QC.Login.getMe(function(openId, accessToken){
xmlhttp.open("GET","http://localhost/CI/index.php/SaveInfo/save_qq_openId?openId="+openId+"&accessToken="+accessToken,true);
xmlhttp.send();
});
}, function(opts){//注销成功
//alert('注销成功');
}
);
这段code,,放置了登录Button,并且获取acess_token,openid,以供调用QQ API.并将
acess_token,openid通过ajax传递到后台 .