public function GetAccessToken(array $credentials, $code, $redirectUri = null)
{
if (empty($credentials['client_id'])) {
throw new OAuth2Exception('client_id required.');
}
if (empty($credentials['client_secret'])) {
throw new OAuth2Exception('client_secret required.');
}
$redirectUri = !empty($redirectUri) ? $redirectUri : self::DEFAULT_REDIRECT_URI;
$params = array('code' => $code, 'client_id' => $credentials['client_id'], 'client_secret' => $credentials['client_secret'], 'redirect_uri' => $redirectUri, 'grant_type' => 'authorization_code');
$endpoint = $this->GetAccessEndpoint();
$response = $this->MakeRequest($endpoint, $params);
return array_merge($credentials, $response, array('timestamp' => time()));
}