You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Symfony中使用php-upwork-oauth2获取Upwork访问令牌及排错

在Symfony中使用php-upwork-oauth2获取Upwork个人资料的问题解决

一、如何获取accessToken和accessSecret

你需要完整走完Upwork的OAuth2授权流程,具体步骤如下:

  1. 生成授权跳转链接
    在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);
    }
    
  2. 处理授权回调并换取正式凭证
    用户在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('你的资料获取路由');
    }
    
  3. 使用凭证获取个人资料
    完成上述流程后,再执行你原本的代码即可正常获取用户信息。

二、解决"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 00:22:46