Главная » PHP SDK
PHP SDK
2. Подключение в приложении
3. Инициализация
4. Авторизация
    4.1. Authorization Code Flow
        4.1.1. Ключ доступа пользователя
        4.1.2. Ключ доступа сообщества
    4.2. Implicit flow
        4.2.1. Ключ доступа пользователя
        4.2.2. Ключ доступа сообщества
5. Запросы к API
    5.1. Пример запроса
    5.2. Загрузка фото в личное сообщение
    5.3. Загрузка видео
6. События в сообществах
    6.1. Bots Long Poll API
    6.2. Callback API

Страница проекта на Github: https://github.com/VKCOM/vk-php-sdk

PHP SDK — это PHP-библиотека для взаимодействия с API ВКонтакте, включая авторизацию OAuth 2.0 и вызов методов API.
Эта библиотека создана на основе JSON-схемы API ВКонтакте. JSON-схема доступна на этой странице: here. Используется версия API version 5.95.
1. Требования
  • PHP 7.1 или более новый.
2. Подключение в приложении
PHP SDK может быть установлен с помощью следующей команды в Composer:
composer require vkcom/vk-php-sdk
3. Инициализация
Создайте объект VKApiClient с помощью следующего кода:

$vk = new VKApiClient();


Также Вы можете инициализировать VKApiClient с другой версией API или другим языком, например:

$vk = new VKApiClient('5.95');
$vk = new VKApiClient('5.95', VKLanguage::ENGLISH);
4. Авторизация
SDK предоставляет возможность авторизации на основе протокола OAuth 2.0 в API ВКонтакте. Пожалуйста, ознакомьтесь с полной документацией перед началом работы.

4.1. Authorization Code Flow
OAuth 2.0 Authorization Code Flow позволяет обращаться к методам API с серверной стороны Вашего приложения.

Эта схема состоит из двух шагов — получение code и обмен code на ключ доступа. В первую очередь вы должны получить code (инструкция для авторизации пользователя, инструкция для авторизации сообщества), перенаправив пользователя на страницу авторизации следующим образом:

Создайте объект VKOAuth:

$oauth = new VKOAuth();


4.1.1.Ключ доступа пользователя
$oauth = new VKOAuth();
$client_id = 1234567;
$redirect_uri = 'https://example.com/vk'
$display = VKOAuthDisplay::PAGE;
$scope = array(VKOAuthUserScope::WALL, VKOAuthUserScope::GROUPS);
$state = 'secret_state_code';

$browser_url = $oauth->getAuthorizeUrl(VKOAuthResponseType::CODE, $client_id, $redirect_uri, $display, $scope, $state);


4.1.2. Ключ доступа сообщества
$oauth = new VKOAuth();
$client_id = 1234567;
$redirect_uri = 'https://example.com/vk'
$display = VKOAuthDisplay::PAGE;
$scope = array(VKOAuthGroupScope::MESSAGES);
$state = 'secret_state_code';
$groups_ids = array(1, 2);

$browser_url = $oauth->getAuthorizeUrl(VKOAuthResponseType::CODE, $client_id, $redirect_uri, $display, $scope, $state, $groups_ids);


Ключ доступа пользователя и ключ доступа сообщества используют разные значения в массиве scope.

После успешной авторизации браузер перенаправит пользователя на указанный redirect_uri. code будет передан в GET-параметре на указанный Вами адрес:

https://example.com?code=CODE


Затем используйте этот метод для получения access_token:

$oauth = new VKOAuth();
$client_id = 1234567;
$client_secret = 'SDAScasd'
$redirect_uri = 'https://example.com/vk'
$code = 'CODE';

$response = $oauth->getAccessToken($client_id, $client_secret, $redirect_uri, $code);
$access_token = $response['access_token'];


redirect_uri должен совпадать с тем, который использовался на первом шаге.

4.2. Implicit flow
В отличие от Authorization Code Flow, эта схема позволяет получить ключ доступа с ограниченным сроком действия.

Прочитайте подробнее о ключе доступа пользователя и ключе доступа сообщества.

В первую очередь создайте объект VKOauth:

$oauth = new VKOAuth();


4.2.1. Ключ доступа пользователя
$oauth = new VKOAuth();
$client_id = 1234567;
$redirect_uri = 'https://example.com/vk'
$display = VKOAuthDisplay::PAGE;
$scope = array(VKOAuthUserScope::WALL, VKOAuthUserScope::GROUPS);
$state = 'secret_state_code';
$revoke_auth = true;

$browser_url = $oauth->getAuthorizeUrl(VKOAuthResponseType::TOKEN, $client_id, $redirect_uri, $display, $scope, $state, null, $revoke_auth);


Чтобы согласие пользователя запрашивалось в любом случае (даже если он уже давал права приложению), передавайте revoke_auth со значением true.

4.2.2. Ключ доступа сообщества
$oauth = new VKOAuth();
$client_id = 1234567;
$redirect_uri = 'https://example.com/vk'
$display = VKOAuthDisplay::PAGE;
$scope = array(VKOAuthGroupScope::MESSAGES);
$state = 'secret_state_code';
$groups_ids = array(1, 2);

$browser_url = $oauth->getAuthorizeUrl(VKOAuthResponseType::TOKEN, $client_id, $redirect_uri, $display, $scope, $state, $groups_ids);


Параметры аналогичны пункту 4.2.1.

После успешной авторизации браузер перенаправит пользовтаеля на указанный redirect_uri. access_token будет передан как фрагмент на указанный Вами адрес:

Для ключа доступа пользователя

https://example.com#access_token=533bacf01e11f55b536a565b57531ad114461ae8736d6506a3&expires_in=86400&user_id=8492&state=123456


Для ключа доступа сообщества

https://example.com#access_token_XXXXXX=533bacf01e11f55b536a565b57531ad114461ae8736d6506a3&expires_in=86400


access_token — новый ключ доступа.
expires_in — срок действия ключа доступа в секундах.
user_id — идентификатор пользователя.
state — строка, переданная в запросе авторизации.
access_token_XXXXXX — ключ доступа сообщества, где XXXXXX — идентификатор сообщества.
5. Запросы к API
Список всех методов API Вы можете найти на этой странице.

5.1. Пример запроса
Пример вызова метода users.get:

$vk = new VKApiClient();
$response = $vk->users()->get($access_token, array(
    'user_ids' => array(1, 210700286),
    'fields' => array('city', 'photo'),
));


5.2. Загрузка фото в личное сообщение
Пожалуйста, прочитайте полное руководство перед началом работы.

Вызовите photos.getMessagesUploadServer, чтобы получить адрес для загрузки файла:

$vk = new VKApiClient();
$address = $vk->photos()->getMessagesUploadServer('{access_token}');


Затем используйте метод upload(),чтобы отправить файлы на полученный upload_url:

$vk = new VKApiClient();
$photo = $vk->getRequest()->upload($address['upload_url'], 'photo', 'photo.jpg');


В ответе Вы получите JSON-объект с полями server, photo, hash. Чтобы сохранить фотографию, вызовите метод photos.saveMessagesPhoto с этими тремя параметрами:

$vk = new VKApiClient();
$response_save_photo = $vk->photos()->saveMessagesPhoto($access_token, array(
    'server' => $photo['server'],
    'photo' => $photo['photo'],
    'hash' => $photo['hash'],
));


5.3. Загрузка видео
Пожалуйста, прочитайте полное руководство перед началом работы.

Вызовите метод video.save, чтобы получить адрес для загрузки файла:

$vk = new VKApiClient();
$address = $vk->video()->save($access_token, array(
    'name' => 'My video',
));


Затем используйте метод upload(),чтобы отправить файл на полученный upload_url:

$vk = new VKApiClient();
$video = $vk->getRequest()->upload($address['upload_url'], 'video_file', 'video.mp4');


Некоторое время после загрузки видео находится в процессе обработки.
6. События в сообществах
6.1. Long Poll
Включите Bots Long Poll API в Вашем сообществе и укажите события, которые нужно отслеживать, с помощью этого метода:

$vk = new VKApiClient();
$vk->groups()->setLongPollSettings($access_token, array(
  'group_id' => 159895463,
  'enabled' => 1,
  'message_new' => 1,
  'wall_post_new' => 1,
));


Переопределите методы из VKCallbackApiHandler, чтобы отслеживать события:

class CallbackApiMyHandler extends VKCallbackApiHandler {
    public function messageNew($object) {
        echo 'New message: ' . $object['body'];
    }

public function wallPostNew($object) {
        echo 'New wall post: ' . $object['text'];
    }
}


Чтобы начать отслеживание событий в Long Poll, создайте экземпляр класса CallbackApiMyHandler, класа VKCallbackApiLongPollExecutor, и вызовите метод listen():

$vk = new VKApiClient();
$access_token = 'asdj4iht2i4ntokqngoiqn3ripogqr';
$group_id = 159895463;
$wait = 25;

$handler = new CallbackApiMyHandler();
$executor = new VKCallbackApiLongPollExecutor($vk, $access_token, $group_id, $handler, $wait);
$executor->listen();


Параметр wait соответствует периоду «ожидания» запроса.

В вызове функции listen() Вы также можете задать номер события, начиная с которого нужно получать обновления. Значение по умолчанию — номер последнего события.

Пример:

$vk = new VKApiClient();
$access_token = 'asdj4iht2i4ntokqngoiqn3ripogqr';
$group_id = 159895463;
$ts = 12;
$wait = 25;

$executor = new VKCallbackApiLongPollExecutor($vk, $access_token, $group_id, $handler, $wait);
$executor->listen($ts);


6.2. Callback API
Подробную информацию о Callback API Вы можете найти на этой странице.

Вам нужно настроить Callback API в разделе «Управление сообществом» Вашей группы или публичной страницы.

В первую очередь Вам необходимо подтвердить адрес сервера. ВКонтакте отправляет запрос на Ваш сервер с типом события confirmation, в ответ на которое необходимо вернуть контрольную строку (код подтверждения). На все другие типы уведомлений Ваш сервер должен отвечать строкой "ok".

Пример:

use VK\CallbackApi\Server\VKCallbackApiServerHandler;

class ServerHandler extends VKCallbackApiServerHandler {
    const SECRET = 'ab12aba';
    const GROUP_ID = 123999;
    const CONFIRMATION_TOKEN = 'e67anm1';

function confirmation(int $group_id, ?string $secret) {
        if ($secret === static::MY_SECRET && $group_id === static::GROUP_ID) {
            echo static::CONFIRMATION_TOKEN;
        }
    }

public function messageNew(int $group_id, ?string $secret, array $object) {
        echo 'ok';
    }
}

$handler = new ServerHandler();
$data = json_decode(file_get_contents('php://input'));
$handler->parse($data);


Чтобы обрабатывать события, переопределите методы из класса VKCallbackApiServerHandler.

Обработчик события confirmation содержит два аргумента: идентификатор сообщества и секретный ключ. Вам необходимо переопределить его.