language = $language; return $this; } public function getBaseAuthorizationUrl(): string { return "$this->baseOAuthUri/authorize"; } public function getBaseAccessTokenUrl(array $params): string { return "$this->baseOAuthUri/access_token"; } public function getResourceOwnerDetailsUrl(AccessToken $token): string { $params = [ 'fields' => $this->userFields, 'access_token' => $token->getToken(), 'v' => $this->version, 'lang' => $this->language, ]; $query = $this->buildQueryString($params); $url = "$this->baseUri/users.get?$query"; return $url; } protected function getDefaultScopes(): array { return $this->scopes; } protected function checkResponse(ResponseInterface $response, $data): void { // Metadata info $contentTypeRaw = $response->getHeader('Content-Type'); $contentTypeArray = explode(';', reset($contentTypeRaw)); $contentType = reset($contentTypeArray); // Response info $responseCode = $response->getStatusCode(); $responseMessage = $response->getReasonPhrase(); // Data info $error = !empty($data['error']) ? $data['error'] : null; $errorCode = !empty($error['error_code']) ? $error['error_code'] : $responseCode; $errorDescription = !empty($data['error_description']) ? $data['error_description'] : null; $errorMessage = !empty($error['error_msg']) ? $error['error_msg'] : $errorDescription; $message = (bool) $errorMessage ? $errorMessage : $responseMessage; // Request/meta validation if (399 < $responseCode) { throw new IdentityProviderException($message, $responseCode, $data); } // Content validation if ('application/json' !== $contentType) { throw new IdentityProviderException($message, $responseCode, $data); } if ($error) { throw new IdentityProviderException($errorMessage, $errorCode, $data); } } protected function createResourceOwner(array $response, AccessToken $token): VkUser { $response = reset($response['response']); $additional = $token->getValues(); if (!empty($additional['email'])) { $response['email'] = $additional['email']; } if (!empty($response['uid']) && 4 === (int) floor($this->version)) { $response['id'] = $response['uid']; } if (!empty($additional['user_id'])) { $response['id'] = $additional['user_id']; } return new VkUser($response); } /** * Возвращает массив объектов пользователей. * * @see https://vk.com/dev/users.get */ public function usersGet(array $ids = [], ?AccessToken $token = null, array $params = []): array { if (empty($ids) && null === $token) { throw new \InvalidArgumentException('Some of parameters usersIds OR access_token are required'); } $default = [ 'user_ids' => implode(',', $ids), 'fields' => $this->userFields, 'access_token' => null !== $token ? $token->getToken() : null, 'v' => $this->version, 'lang' => $this->language, ]; $params = array_merge($default, $params); $query = $this->buildQueryString($params); $url = "$this->baseUri/users.get?$query"; $response = $this->getResponse($this->createRequest(static::METHOD_GET, $url, $token, []))['response']; $users = !empty($response['items']) ? $response['items'] : $response; $array2user = function (mixed $userData) { return new VkUser($userData); }; return array_map($array2user, $users); } /** * Возвращает список идентификаторов (id) друзей пользователя, * если параметр fields не использовался. При использовании * параметра fields возвращает список объектов пользователей, * но не более 5000. * * @see https://vk.com/dev/friends.get */ public function friendsGet(int $userId, ?AccessToken $token = null, array $params = []): array { $default = [ 'user_id' => $userId, 'fields' => $this->userFields, 'access_token' => null !== $token ? $token->getToken() : null, 'v' => $this->version, 'lang' => $this->language, ]; $params = array_merge($default, $params); $query = $this->buildQueryString($params); $url = "$this->baseUri/friends.get?$query"; $response = $this->getResponse($this->createRequest(static::METHOD_GET, $url, $token, []))['response']; $friends = !empty($response['items']) ? $response['items'] : $response; $array2friend = function (mixed $friendData) { if (is_numeric($friendData)) { $friendData = ['id' => $friendData]; } return new VkUser($friendData); }; return array_map($array2friend, $friends); } }