在Symfony中使用php-upwork-oauth2获取Upwork访问令牌及排错
在Symfony中使用php-upwork-oauth2获取Upwork个人资料的问题解决
一、如何获取accessToken和accessSecret
你需要完整走完Upwork的OAuth2授权流程,具体步骤如下:
- 生成授权跳转链接
在Symfony控制器中先初始化不带accessToken/accessSecret的客户端,生成授权地址并保存临时凭证:// 授权初始化控制器方法 public function upworkAuthInit(SessionInterface $session): Response { $config = new \Upwork\API\Config([ 'clientId' => '你的ClientID', 'clientSecret' => '你的ClientSecret', 'redirectUri' => 'https://localhost:8000/upwork', 'debug' => true, ]); $client = new \Upwork\API\Client($config); $auth = new \Upwork\API\Routers\Auth($client); // 生成授权URL,同时保存临时oauth凭证到session $authUrl = $auth->getAuthorizationUrl(); $session->set('oauth_token', $client->getConfig('oauthToken')); $session->set('oauth_token_secret', $client->getConfig('oauthTokenSecret')); return $this->redirect($authUrl); } - 处理授权回调并换取正式凭证
用户在Upwork授权后会跳转到你配置的redirectUri,此时用URL中的code参数换取accessToken和accessSecret:// 授权回调控制器方法 public function upworkAuthCallback(SessionInterface $session): Response { $code = $this->getRequest()->query->get('code'); if (!$code) { throw new BadRequestHttpException('授权码缺失'); } $config = new \Upwork\API\Config([ 'clientId' => '你的ClientID', 'clientSecret' => '你的ClientSecret', 'redirectUri' => 'https://localhost:8000/upwork', 'oauthToken' => $session->get('oauth_token'), 'oauthTokenSecret' => $session->get('oauth_token_secret'), 'debug' => true, ]); $client = new \Upwork\API\Client($config); $auth = new \Upwork\API\Routers\Auth($client); // 换取正式的access token和secret $tokenInfo = $auth->getAccessToken($code); // 保存到session供后续接口调用使用 $session->set('access_token', $tokenInfo['access_token']); $session->set('access_secret', $tokenInfo['access_token_secret']); return $this->redirectToRoute('你的资料获取路由'); } - 使用凭证获取个人资料
完成上述流程后,再执行你原本的代码即可正常获取用户信息。
二、解决"Call to a member function getBody() on string"错误
这个错误的核心原因是未完成授权流程就直接调用getUserInfo:
- 当没有有效accessToken时,API请求返回的是错误字符串而非响应对象,代码尝试调用
getBody()方法自然会抛出异常。 - 必须先走完授权流程,确保session中存在有效的
access_token和access_secret后,再执行获取用户信息的逻辑。
另外需检查:Upwork开发者后台配置的redirectUri必须和代码中的完全一致(包括协议、端口、路径),不一致会导致授权失败,进而引发同类错误。
原错误信息:Call to a member function getBody() on string
内容的提问来源于stack exchange,提问作者Khaled Boussoffara
相关产品推荐
相关产品推荐

