我正在关注Instagram API Basic Display文档。我已经创建了Facebook App,配置了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,消息为“您必须提供client_id”。但是,文档中没有关于client_id的信息,Instagram基本显示不提供client_id。
我在做什么错?你们有没有类似的问题?
我设法通过使用GuzzleHttp \ Client这样使我的工作正常。
步骤1。获取授权码$ code
步骤2。获取短暂的AccessToken
短期访问令牌仅在1个小时内有效。
$aAccessToken = $this->fetchAccessToken( $code );
$short_lived_access_token = $aAccessToken[ 'access_token' ];
$user_id = $aAccessToken[ 'user_id' ];
步骤3(可选)
如果您需要有效期为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已过期,在您抓取之前,您应实际检查令牌是否已过期,如果已过期,请交换令牌以获取新的令牌。然后令牌回收开始。
$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方法,仅在标头上添加content-type = application / x-www-form-urlencode确实没有用。选项上的[[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 );
}