<?php
namespace Home\Controller;
use Think\Controller;
class QqController extends Controller {
private $appid = '';
private $appkey = '';
private $backurl = '/Home/Qq/backQq'; // 与QQ互联里面的回调地址一致
public function index() {
$url = 'https://graph.qq.com/oauth2.0/authorize';
$state = md5(uniqid(rand(), TRUE));
session('state', $state);
$data = array(
'response_type' => 'code',
'client_id' => $this->appid,
'redirect_uri' => URLEncode("http://".$_SERVER['HTTP_HOST'].$this->backurl),
'state' => $state
);
$login_url = $this->combineURL($url, $data);
header("Location:$login_url");
}
public function getArr($str) {
$text = explode('&', $str);
$data = array();
foreach ($text as $key => $v) {
$va = explode('=',$v);
$data[$va[0]] = $va[1];
}
return $data;
}
//回调并获取Access Token、openid
public function backQq() {
$code = I('code');
$state = I('state');
if($code != '' && $state == session('state') ) {
/*if(checkmobile()) {
$url = 'https://graph.z.qq.com/moc2/token';
$graph_url = 'https://graph.z.qq.com/moc2/me';
} else {
$url = 'https://graph.qq.com/oauth2.0/token';
$graph_url = 'https://graph.qq.com/oauth2.0/me';
}*/
$url = 'https://graph.qq.com/oauth2.0/token';
$graph_url = 'https://graph.qq.com/oauth2.0/me';
$data = array(
'grant_type' => 'authorization_code',
'client_id' => $this->appid,
'client_secret' => $this->appkey,
'code' => $code,
'redirect_uri' => URLEncode("http://".$_SERVER['HTTP_HOST'].$this->backurl),
);
$url = $this->combineURL($url, $data);
//echo $url;exit;
$access = $this->getArr($this->get_contents($url));
//获取openid
$data = array(
'access_token' => $access["access_token"],
);
$graph_url = $this->combineURL($graph_url, $data);
$response = $this->get_contents($graph_url);
//echo $response;
//--------检测错误是否发生
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)){
echo $user->error . $user->error_description;
}
$userinfourl = 'https://graph.qq.com/user/get_user_info?access_token='. $access["access_token"].'&oauth_consumer_key='.$this->appid.'&openid='.$user->openid;
$userinfo = json_decode($this->get_contents($userinfourl),1);
$userinfo['openid'] = $user->openid;
$userinfo['type'] = 1;
session('qc_qqInfo',$userinfo);
session('state',null);
$user = M('user')->where(array('qqid'=>$userinfo['openid']))->find();
if(isset($user) && !empty($user['phone'])){
session("USER_PROFILES",$user);
header("Location:http://".$_SERVER['HTTP_HOST'].'/Home/Users/index');
}else{
header("Location:http://".$_SERVER['HTTP_HOST'].'/Home/Login/binding');
}
}
}
// get远程
private 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)){
echo 50001;
//$this->error->showError("50001");
}
return $response;
}
//拼接字符串
public function combineURL($baseURL,$keysArr){
$combined = $baseURL."?";
$valueArr = array();
foreach($keysArr as $key => $val){
$valueArr[] = "$key=$val";
}
$keyStr = implode("&",$valueArr);
$combined .= ($keyStr);
return $combined;
}
}