Instagram API 基本显示:请求有问题 access_token

Instagram API Basic Display: Problem with requesting access_token

我正在关注 Instagram API Basic Display 文档。我创建了 Facebook 应用程序,配置了 Instagram 基本显示,添加了测试用户,使用 GET 请求对测试用户进行了身份验证:

https://api.instagram.com/oauth/authorize
  ?app_id={app-id}
  &redirect_uri={redirect-uri}
  &scope=user_profile,user_media
  &response_type=code

但是当我尝试使用文档中的 POST 请求来请求 access_token 时:我收到错误 400 和消息 "You must provide a client_id"。但是,文档没有说明 client_id 并且 Instagram Basic Display 不提供 client_id.

我做错了什么?大家有遇到过类似的问题吗?

我设法通过使用 GuzzleHttp\Client 使我的工作正常。

步骤 1。获取授权码 $code

步骤 2。获取 short-lived AccessToken

Short-Lived 访问令牌的有效期仅为 1 小时。

$aAccessToken = $this->fetchAccessToken( $code );
$short_lived_access_token = $aAccessToken[ 'access_token' ];
$user_id                  = $aAccessToken[ 'user_id' ];

步骤 3(可选)

如果你想要Long-Lived令牌,有效期为60天,你可以立即兑换$short_lived_access_token.

$aLongLivedTokenResult   =           = $this->GetLongLivedToken( $short_lived_access_token );
$long_lived_access_token = $aLongLivedTokenResult[ 'access_token' ];
$expires_in = $aLongLivedTokenResult[ 'expires_in' ];

long_lived_access_token 和 expires_in 可以保存,当令牌在 60 天后过期时,您可以刷新它。

步骤 4 现在你可以像这样获取用户媒体了。

请记住,long_lived_access_token 已过期,在您 FETCH 之前,您应该实际检查令牌是否已过期,如果已过期,请交换它以获取新的。令牌回收开始。

    $aQueryString = [
        'fields'       => 'id,media_url,permalink,timestamp,caption',
        'access_token' => $long_lived_access_token,

    ];
    $uri = 'https://graph.instagram.com/{$user_id}/media?' . http_build_query( $aQueryString ) );

//函数

因为fetchAccessToken函数使用了POST方法,单独在headers上添加content-type = application/x-www-form-urlencoded没有'真的不行。 form_params 选项对我有用。

private function fetchAccessToken(){
    $aOptions = [
      'app_id'       => $this->provider->AppID,
      'app_secret'   => $this->provider->AppSecret,
      'grant_type'   => 'authorization_code',
      'redirect_uri' => $this->provider->getRedirectUri(),
      'code'         => $accessCode,       
    ];

    $client   = new Client( [
        'base_uri' => 'https://api.instagram.com',
        'headers'  => [
            'content-type' => 'application/x-www-form-urlencoded',
        ],
    ] );


    $response = $client->request( 'POST', 'oauth/access_token', [
        'form_params' => $aOptions,
    ] );
    return json_decode( $response->getBody(), true );

}

private function GetLongLivedToken( $access_token )
{

    $aOptions = [
        'grant_type'    => 'ig_exchange_token',
        'client_secret' => $this->provider->AppSecret,
        'access_token'  => $access_token,

    ];

    $response =  new Client( [
        'base_uri' => 'https://graph.instagram.com',
    ] )->request( 'GET', 'access_token?' . http_build_query( $aOptions ) );

    $stream   = $response->getBody();
    $contents = $stream->getContents();
    return json_decode( $contents, true ); 

}

您应该使用 正文 中的参数向 https://api.instagram.com/oauth/access_token 发出 POST 请求,而不是参数。确保 "x-www-form-urlencoded" 选项已启用。

在此处查看更详细的答案: