Instagram Basic Display API无法获取测试用户资料求助
Instagram Basic Display API 获取测试用户username报错问题
已完成OAuth授权流程、获取access token及长效access token,但调用获取username的API接口时返回错误,且返回的Instagram ID以科学计数法格式呈现(包含.和+符号)。
错误返回信息
{"error":{"message":"Unsupported get request. Object with ID '1.7841411138E+16' does not exist, cannot be loaded due to missing permissions, or does not support this operation","type":"IGApiException","code":100,"error_subcode":33,"fbtrace_id":"APM8hPTe1xn1OfjF9GLfHnm"}}
相关代码
// Request 授权跳转函数 public function oAuthBasic() { $instagramBasic = new InstagramBasicDisplay([ 'appId' => Config::get('instagram_basic.app_id'), 'appSecret' => Config::get('instagram_basic.app_secret'), 'redirectUri' => Config::get('instagram_basic.redirect_uri') ]); session()->forget('instagramErrorMessage'); $faceBookLoginUrl = $instagramBasic->getLoginUrl(['user_profile', 'user_media']); return response()->json(['redirectUrl' => $faceBookLoginUrl]); } // Callback 回调处理函数 public function linkBasic(InstagramLinkRequest $instagramRequest) { if (isset($_GET['code'])) { // 获取OAuth回调code $code = $_GET['code']; $ig_atu = "https://api.instagram.com/oauth/access_token"; $ig_data = []; $ig_data['client_id'] = Config::get('instagram_basic.app_id'); $ig_data['client_secret'] = Config::get('instagram_basic.app_secret'); $ig_data['grant_type'] = 'authorization_code'; $ig_data['redirect_uri'] = Config::get('instagram_basic.redirect_uri'); $ig_data['code'] = $code; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $ig_atu); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($ig_data)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $ig_auth_data = curl_exec($ch); curl_close($ch); $ig_auth_data = json_decode($ig_auth_data, true); $access_token = $ig_auth_data['access_token']; $user_id = $ig_auth_data['user_id']; try{ // 换取长效access token $url = 'https://graph.instagram.com/access_token/?'; $data = array( 'client_secret' => Config::get('instagram_basic.app_secret'), 'access_token' => $access_token, 'grant_type' => 'ig_exchange_token' ); $string = http_build_query($data); $ch = curl_init($url.$string); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $resultRow = curl_exec($ch); $result = json_decode($resultRow); $long_lived_access_token = $result->access_token; curl_close($ch); // 获取用户profile(报错环节) $url = 'https://graph.instagram.com/'.$user_id.'/?'; $data = array('access_token' => $long_lived_access_token, 'fields'=> 'username'); $string = http_build_query($data); $ch = curl_init($url.$string); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $result = curl_exec($ch); curl_close($ch); dd($result); }catch (Exception $e){ dd($e->getMessage()); } } }
问题原因及解决方法
问题原因
user_id被解析成了科学计数法格式,而Instagram API要求用户ID必须是完整的纯数字字符串,这种格式会被API识别为无效ID,导致报错。
解决方法
有两种方式可以处理:
- 转换科学计数法为纯数字字符串:
在获取user_id的代码处修改:
// 将科学计数法格式的user_id转为纯数字字符串 $user_id = rtrim(sprintf('%.0f', $ig_auth_data['user_id']), '.');
- json_decode时保留大整数为字符串:
修改json_decode的调用,添加JSON_BIGINT_AS_STRING选项,确保大数值ID以原始字符串形式保留:
$ig_auth_data = json_decode($ig_auth_data, true, 512, JSON_BIGINT_AS_STRING);
处理后user_id会是完整的纯数字字符串,再调用获取用户profile的API即可正常返回username。
内容的提问来源于stack exchange,提问作者TharakaNirmana
相关产品推荐
相关产品推荐

