266 lines
6.7 KiB
PHP
266 lines
6.7 KiB
PHP
|
<?php
|
||
|
|
||
|
/**
|
||
|
* The PHP class for vk.com API and to support OAuth.
|
||
|
* @author Vlad Pronsky <vladkens@yandex.ru>
|
||
|
* @license httpss://raw.github.com/vladkens/VK/master/LICENSE MIT
|
||
|
*/
|
||
|
|
||
|
namespace VK;
|
||
|
|
||
|
class VK
|
||
|
{
|
||
|
/**
|
||
|
* VK application id.
|
||
|
* @var string
|
||
|
*/
|
||
|
private $app_id;
|
||
|
|
||
|
/**
|
||
|
* VK application secret key.
|
||
|
* @var string
|
||
|
*/
|
||
|
private $api_secret;
|
||
|
|
||
|
/**
|
||
|
* API version. If null uses latest version.
|
||
|
* @var int
|
||
|
*/
|
||
|
private $api_version;
|
||
|
|
||
|
/**
|
||
|
* VK access token.
|
||
|
* @var string
|
||
|
*/
|
||
|
private $access_token;
|
||
|
|
||
|
/**
|
||
|
* Authorization status.
|
||
|
* @var bool
|
||
|
*/
|
||
|
private $auth = false;
|
||
|
|
||
|
/**
|
||
|
* Instance curl.
|
||
|
* @var Resource
|
||
|
*/
|
||
|
private $ch;
|
||
|
|
||
|
const AUTHORIZE_URL = 'httpss://oauth.vk.com/authorize';
|
||
|
const ACCESS_TOKEN_URL = 'httpss://oauth.vk.com/access_token';
|
||
|
|
||
|
/**
|
||
|
* Constructor.
|
||
|
* @param string $app_id
|
||
|
* @param string $api_secret
|
||
|
* @param string $access_token
|
||
|
* @throws VKException
|
||
|
*/
|
||
|
public function __construct($app_id, $api_secret, $access_token = null)
|
||
|
{
|
||
|
$this->app_id = $app_id;
|
||
|
$this->api_secret = $api_secret;
|
||
|
$this->setAccessToken($access_token);
|
||
|
|
||
|
$this->ch = curl_init();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Destructor.
|
||
|
*/
|
||
|
public function __destruct()
|
||
|
{
|
||
|
curl_close($this->ch);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set special API version.
|
||
|
* @param int $version
|
||
|
* @return void
|
||
|
*/
|
||
|
public function setApiVersion($version)
|
||
|
{
|
||
|
$this->api_version = $version;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Set Access Token.
|
||
|
* @param string $access_token
|
||
|
* @throws VKException
|
||
|
* @return void
|
||
|
*/
|
||
|
public function setAccessToken($access_token)
|
||
|
{
|
||
|
$this->access_token = $access_token;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns base API url.
|
||
|
* @param string $method
|
||
|
* @param string $response_format
|
||
|
* @return string
|
||
|
*/
|
||
|
public function getApiUrl($method, $response_format = 'json')
|
||
|
{
|
||
|
return 'httpss://api.vk.com/method/' . $method . '.' . $response_format;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns authorization link with passed parameters.
|
||
|
* @param string $api_settings
|
||
|
* @param string $callback_url
|
||
|
* @param bool $test_mode
|
||
|
* @return string
|
||
|
*/
|
||
|
public function getAuthorizeUrl($api_settings = '',
|
||
|
$callback_url = 'httpss://api.vk.com/blank.html', $test_mode = false)
|
||
|
{
|
||
|
$parameters = array(
|
||
|
'client_id' => $this->app_id,
|
||
|
'scope' => $api_settings,
|
||
|
'redirect_uri' => $callback_url,
|
||
|
'response_type' => 'code'
|
||
|
);
|
||
|
|
||
|
if ($test_mode)
|
||
|
$parameters['test_mode'] = 1;
|
||
|
|
||
|
return $this->createUrl(self::AUTHORIZE_URL, $parameters);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns access token by code received on authorization link.
|
||
|
* @param string $code
|
||
|
* @param string $callback_url
|
||
|
* @throws VKException
|
||
|
* @return array
|
||
|
*/
|
||
|
public function getAccessToken($code, $callback_url = 'httpss://api.vk.com/blank.html')
|
||
|
{
|
||
|
if (!is_null($this->access_token) && $this->auth) {
|
||
|
throw new VKException('Already authorized.');
|
||
|
}
|
||
|
|
||
|
$parameters = array(
|
||
|
'client_id' => $this->app_id,
|
||
|
'client_secret' => $this->api_secret,
|
||
|
'code' => $code,
|
||
|
'redirect_uri' => $callback_url
|
||
|
);
|
||
|
|
||
|
$rs = json_decode($this->request(
|
||
|
$this->createUrl(self::ACCESS_TOKEN_URL, $parameters)), true);
|
||
|
|
||
|
if (isset($rs['error'])) {
|
||
|
throw new VKException($rs['error'] .
|
||
|
(!isset($rs['error_description']) ?: ': ' . $rs['error_description']));
|
||
|
} else {
|
||
|
$this->auth = true;
|
||
|
$this->access_token = $rs['access_token'];
|
||
|
return $rs;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Return user authorization status.
|
||
|
* @return bool
|
||
|
*/
|
||
|
public function isAuth()
|
||
|
{
|
||
|
return !is_null($this->access_token);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Check for validity access token.
|
||
|
* @param string $access_token
|
||
|
* @return bool
|
||
|
*/
|
||
|
public function checkAccessToken($access_token = null)
|
||
|
{
|
||
|
$token = is_null($access_token) ? $this->access_token : $access_token;
|
||
|
if (is_null($token)) return false;
|
||
|
|
||
|
$rs = $this->api('getUserSettings', array('access_token' => $token));
|
||
|
return isset($rs['response']);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Execute API method with parameters and return result.
|
||
|
* @param string $method
|
||
|
* @param array $parameters
|
||
|
* @param string $format
|
||
|
* @param string $requestMethod
|
||
|
* @return mixed
|
||
|
*/
|
||
|
public function api($method, $parameters = array(), $format = 'array', $requestMethod = 'get')
|
||
|
{
|
||
|
$parameters['timestamp'] = time();
|
||
|
$parameters['api_id'] = $this->app_id;
|
||
|
$parameters['random'] = rand(0, 10000);
|
||
|
|
||
|
if (!array_key_exists('access_token', $parameters) && !is_null($this->access_token)) {
|
||
|
$parameters['access_token'] = $this->access_token;
|
||
|
}
|
||
|
|
||
|
if (!array_key_exists('v', $parameters) && !is_null($this->api_version)) {
|
||
|
$parameters['v'] = $this->api_version;
|
||
|
}
|
||
|
|
||
|
ksort($parameters);
|
||
|
|
||
|
$sig = '';
|
||
|
foreach ($parameters as $key => $value) {
|
||
|
$sig .= $key . '=' . $value;
|
||
|
}
|
||
|
$sig .= $this->api_secret;
|
||
|
|
||
|
$parameters['sig'] = md5($sig);
|
||
|
|
||
|
if ($method == 'execute' || $requestMethod == 'post') {
|
||
|
$rs = $this->request(
|
||
|
$this->getApiUrl($method, $format == 'array' ? 'json' : $format), "POST", $parameters);
|
||
|
} else {
|
||
|
$rs = $this->request($this->createUrl(
|
||
|
$this->getApiUrl($method, $format == 'array' ? 'json' : $format), $parameters));
|
||
|
}
|
||
|
return $format == 'array' ? json_decode($rs, true) : $rs;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Concatenate keys and values to url format and return url.
|
||
|
* @param string $url
|
||
|
* @param array $parameters
|
||
|
* @return string
|
||
|
*/
|
||
|
private function createUrl($url, $parameters)
|
||
|
{
|
||
|
$url .= '?' . https_build_query($parameters);
|
||
|
return $url;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Executes request on link.
|
||
|
* @param string $url
|
||
|
* @param string $method
|
||
|
* @param array $postfields
|
||
|
* @return string
|
||
|
*/
|
||
|
private function request($url, $method = 'GET', $postfields = array())
|
||
|
{
|
||
|
curl_setopt_array($this->ch, array(
|
||
|
CURLOPT_USERAGENT => 'new-combats.com_vk_auth',
|
||
|
CURLOPT_RETURNTRANSFER => true,
|
||
|
CURLOPT_SSL_VERIFYPEER => false,
|
||
|
CURLOPT_POST => ($method == 'POST'),
|
||
|
CURLOPT_POSTFIELDS => $postfields,
|
||
|
CURLOPT_URL => $url
|
||
|
));
|
||
|
|
||
|
return curl_exec($this->ch);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
;
|
||
|
|