public function refresh(OAuthUserToken $token)
 {
     // BE CAREFUL !!! argument order is very important !
     // if you change the order of parameters, refresh will not work and the API will give a client credential error.
     $url = $this->remoteApiUrl . "/oauth/v2/token?" . "client_secret=" . $this->remoteApiSecret . "&client_id=" . $this->remoteApiId . "&refresh_token=" . $token->getRefreshToken() . "&grant_type=refresh_token";
     $ch = curl_init();
     curl_setopt($ch, CURLOPT_URL, $url);
     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
     $apiResponse = json_decode(curl_exec($ch));
     curl_close($ch);
     if (isset($apiResponse->access_token)) {
         $token->setOAuthToken($apiResponse->access_token);
         $token->setRefreshToken($apiResponse->refresh_token);
         $token->setTokenType($apiResponse->token_type);
         // We take 3 minutes less (180 seconds) just to be sure.
         $token->setExpireTime(time() + $apiResponse->expires_in - 180);
     } elseif (isset($apiResponse->error_description)) {
         throw new AuthenticationException($apiResponse->error_description);
     } else {
         throw new AuthenticationException('The OAuth refresh failed.');
     }
     return $token;
 }