/** * @param $code string Auth code returned by qq * @return array if success return access_token, expire_in and refresh_token * if failed return error code and description * 'access_token' => string '313F00C54AC512A7ED1C664EE198B615' (length=32) 'expires_in' => string '7776000' (length=7) 'refresh_token' => string 'A5D30D009A349AA8197C86DECEC77BD8' (length=32) 'code' => int 0 */ public function getAccessToken($code = "") { if (empty($code) && empty($this->refreshToken)) { Logger::ERROR("Try to get access token, but neither code nor refresh token was empty.", "", "", "qq_sdk_err"); return ['code' => -1, 'desc' => "neither code nor refresh token was empty."]; } $url = "https://graph.qq.com/oauth2.0/token"; $isRefresh = !empty($this->refreshToken); $params = ['grant_type' => $isRefresh ? 'refresh_token' : 'authorization_code', 'client_id' => $this->appId, 'client_secret' => $this->appKey, 'redirect_uri' => $this->callback]; if ($isRefresh) { $params['refresh_token'] = $this->refreshToken; } else { $params['code'] = $code; } $response = @file_get_contents($url . "?" . http_build_query($params)); $result = []; if (strpos($response, "callback") !== false) { $lpos = strpos($response, "("); $rpos = strrpos($response, ")"); $response = substr($response, $lpos + 1, $rpos - $lpos - 1); $msg = json_decode($response); if (isset($msg->error)) { $result['code'] = $msg->error; $result['desc'] = $msg->error_description; return $result; } } parse_str($response, $result); $result['code'] = 0; $this->accessToken = $result['access_token']; $this->refreshToken = $result['refresh_token']; $result['expires_in'] += time(); $user = self::getSelfInfo(); if (!$user['openid']) { return $user; } $result['uid'] = $user['openid']; UserApi::saveAccessToken($result); return $result; }