You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

250 lines
7.2 KiB

3 years ago
<?php
defined('BASE_PATH') OR exit('No direct script access allowed');
class qq
{
public $api_url = 'https://graph.qq.com/';
private $appid = '';
private $appkey = '';
private $access_token = '';
private $scope = '';
/**
* 构造函数
*
* @param unknown $config
* @param unknown $access_token
*/
public function __construct($config, $access_token = NULL)
{
$this->appid = $config['app_id'];
$this->appkey = $config['app_key'];
$this->access_token = $access_token;
$this->scope = 'get_user_info, add_share';
}
/**
* 获取授权地址
*
* @param unknown $info
* @param unknown $url
* @return mixed
*/
public function redirect($callback_url)
{
return $this->login_url($callback_url, $this->scope);
}
/**
* 回调用户数据
*
* @param unknown $info
* @param unknown $url
* @param unknown $code
* @return boolean
*/
public function callback($callback_url, $code)
{
$result = $this->access_token($callback_url, $code);
if (isset($result['access_token']) && $result['access_token'] != '') {
$this->access_token = $result['access_token'];
$openid = $this->get_openid();
// 获取用户信息
$userinfo = $this->get_user_info($openid);
if($userinfo['gender'] == '男'){
$userinfo['gender'] = 1;
}elseif ($userinfo['gender'] == '女'){
$userinfo['gender'] = 2;
}else {
$userinfo['gender'] = 0;
}
$data = array(
'openid' => basename(__FILE__, '.php') . '_' . $openid,
'name' => $this->get_user_name($userinfo),
'sex' => $userinfo['gender'],
'avatar' => $userinfo['figureurl_qq_2'] ? $userinfo['figureurl_qq_2'] : $userinfo['figureurl_qq_1']
);
return $data;
} else {
// echo "授权失败";
return false;
}
}
/**
* 生成授权网址
*
* @param unknown $callback_url
* @param string $scope
* @return string
*/
public function login_url($callback_url, $scope = '')
{
$params = array(
'client_id' => $this->appid,
'redirect_uri' => $callback_url,
'response_type' => 'code',
'scope' => $scope
);
return 'https://graph.qq.com/oauth2.0/authorize?' . http_build_query($params, '', '&');
}
/**
* 获取access token
*
* @param unknown $callback_url
* @param unknown $code
* @return multitype:
*/
public function access_token($callback_url, $code)
{
$params = array(
'grant_type' => 'authorization_code',
'client_id' => $this->appid,
'client_secret' => $this->appkey,
'code' => $code,
'state' => '',
'redirect_uri' => $callback_url
);
$url = 'https://graph.qq.com/oauth2.0/token?' . http_build_query($params, '', '&');
$result_str = $this->http($url);
$json_r = array();
if ($result_str != '')
parse_str($result_str, $json_r);
return $json_r;
}
/**
* 获取登录用户的openid
*
* @return Ambigous <>
*/
public function get_openid()
{
$params = array(
'access_token' => $this->access_token
);
$url = 'https://graph.qq.com/oauth2.0/me?' . http_build_query($params, '', '&');
$result_str = $this->http($url);
$json_r = array();
if ($result_str != '') {
preg_match('/callback\(\s+(.*?)\s+\)/i', $result_str, $result_a);
$json_r = json_decode($result_a[1], true);
}
return $json_r['openid'];
}
/**
* 根据openid获取用户信息
*
* @param unknown $openid
* @return Ambigous <multitype:, mixed>
*/
public function get_user_info($openid)
{
$params = array(
'openid' => $openid
);
return $this->api('user/get_user_info', $params);
}
/**
* 获取用户名
*
* @param unknown $user_info
* @return Ambigous <multitype:, mixed>
*/
public function get_user_name($userinfo)
{
return $userinfo['nickname'];
}
/**
* 发布分享
*
* @param unknown $openid
* @param unknown $title
* @param unknown $url
* @param unknown $site
* @param unknown $fromurl
* @param string $images
* @param string $summary
* @return Ambigous <multitype:, mixed>
*/
public function add_share($openid, $title, $url, $site, $fromurl, $images = '', $summary = '')
{
$params = array(
'openid' => $openid,
'title' => $title,
'url' => $url,
'site' => $site,
'fromurl' => $fromurl,
'images' => $images,
'summary' => $summary
);
return $this->api('share/add_share', $params, 'POST');
}
/**
* 调用接口
*
* @param unknown $url
* @param unknown $params
* @param string $method
* @return Ambigous <multitype:, mixed>
* //示例:根据openid获取用户信息
* $result=$qq->api('user/get_user_info', array('openid'=>$openid), 'GET');
*/
public function api($url, $params = array(), $method = 'GET')
{
$url = $this->api_url . $url;
$params['access_token'] = $this->access_token;
$params['oauth_consumer_key'] = $this->appid;
$params['format'] = 'json';
if ($method == 'GET') {
$query_url = $url . '?' . http_build_query($params, '', '&');
$result_str = $this->http($query_url);
} else {
$query = http_build_query($params, '', '&');
$result_str = $this->http($url, $query, 'POST');
}
$result = array();
if ($result_str != '')
$result = json_decode($result_str, true);
return $result;
}
/**
* 提交请求
*
* @param unknown $url
* @param string $postfields
* @param string $method
* @param unknown $headers
* @return mixed
*/
private function http($url, $postfields = '', $method = 'GET', $headers = array())
{
$ci = curl_init();
curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ci, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ci, CURLOPT_TIMEOUT, 30);
if ($method == 'POST') {
curl_setopt($ci, CURLOPT_POST, TRUE);
if ($postfields != '')
curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
}
$headers[] = 'User-Agent: ECTouch.cn';
curl_setopt($ci, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ci, CURLOPT_URL, $url);
$response = curl_exec($ci);
curl_close($ci);
return $response;
}
}