Instagram API 基本显示:请求 access_token 时出现问题 [英] Instagram API Basic Display: Problem with requesting access_token

查看:103
本文介绍了Instagram API 基本显示:请求 access_token 时出现问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在关注

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

解决方案

我通过像这样使用 GuzzleHttp\Client 设法让我的工作正常工作.

步骤 1.获取授权码 $code

第 2 步.获取短期访问令牌

短期访问令牌的有效期仅为 1 小时.

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

步骤 3(可选)

如果您想要有效期为 60 天的 Long-Lived 令牌,您可以立即兑换 $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 = ['字段' =>'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 方法,所以单独在标头上添加 content-type = application/x-www-form-urlencoded 并没有真正起作用.选项中的 form_params 对我有用.

私有函数fetchAccessToken(){$aOptions = ['app_id' =>$this->provider->AppID,'app_secret' =>$this->provider->AppSecret,'grant_type' =>'授权代码','redirect_uri' =>$this->provider->getRedirectUri(),'代码' =>$访问代码,];$client = 新客户端( ['base_uri' =>'https://api.instagram.com','标题' =>['内容类型' =>'应用程序/x-www-form-urlencoded',],]);$response = $client->request('POST', 'oauth/access_token', ['form_params' =>$a选项,]);返回 json_decode( $response->getBody(), true );}私有函数 GetLongLivedToken( $access_token ){$aOptions = ['grant_type' =>'ig_exchange_token','client_secret' =>$this->provider->AppSecret,'access_token' =>$access_token,];$response = 新客户端( ['base_uri' =>'https://graph.instagram.com',] )-> request( 'GET', 'access_token?' . http_build_query( $aOptions ) );$stream = $response->getBody();$contents = $stream->getContents();返回 json_decode( $contents, true );}

I was following Instagram API Basic Display documentation. I've created Facebook App, configured Instagram Basic Display, added Test User, Authenticated the Test User using GET request:

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

But when I try to request access_token using POST request from the documentation: I receive ERROR 400 with message "You must provide a client_id". However, documentation says nothing about client_id and Instagram Basic Display doesn't provide client_id.

What am I doing wrong? Has any of you had similar problem?

解决方案

I managed to get mine working by using GuzzleHttp\Client like this.

Step 1. get the Authorization Code $code

Step 2. Get the short-lived AccessToken

Short-Lived Access tokens are valid for just 1 hour.

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

Step 3 (optional)

If you want the Long-Lived token, which is valid for 60days, you can immediately exchange the $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 and expires_in can be saved and when the token has expired after 60 days you can refresh it.

Step 4 Now you can fetch the user media like this.

Bear in mind that the long_lived_access_token expires and before you FETCH you should actually check if the token has expired and if it has, exchange it to get a new one. And the token recycling begins.

    $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 ) );

//functions

Because the fetchAccessToken function uses the POST method, Adding content-type = application/x-www-form-urlencoded on the headers alone didn't really work. form_params on the options did the trick for me.

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 ); 

}

这篇关于Instagram API 基本显示:请求 access_token 时出现问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆