调用Slack API users.info接口返回user_not_found错误求助
问题根因
核心问题是GET请求传参方式不符合Slack API规则,且cURL配置存在逻辑冲突:
- Slack的
users.info是GET类型接口,只会解析URL查询字符串中的参数,完全忽略请求体携带的内容 - 你的代码虽然显式设置了请求方法为GET,但把
user参数通过CURLOPT_POSTFIELDS传入,这部分参数会被放到请求体中,Slack侧根本读取不到,相当于调用接口时没有携带有效user参数。Slack API对于这类GET接口的参数缺失不会返回明确的missing_argument错误,反而会直接抛user_not_found,非常容易误导排查方向 - 额外隐患:PHP cURL中如果给GET请求设置了
CURLOPT_POSTFIELDS,部分版本会自动覆盖自定义的GET方法配置、实际发送POST请求,进一步加剧接口解析异常。
修复方案
1. 调整getUser方法的参数拼接逻辑
GET请求的参数直接拼接到接口URL末尾,不要通过POSTFIELDS传递:
/* Get User Profile */ public function getUser($userId) { $method = "GET"; $endpoint = "https://slack.com/api/users.info"; $token = ###; $data = array( "user" => $userId ); // GET请求直接把参数拼到URL后 $endpoint .= "?" . http_build_query($data); $response = $this->call_slack_api($token, $method, $endpoint); return $response; }
2. 优化通用API调用方法的传参逻辑
区分不同请求方法的传参规则,GET请求不传递POSTFIELDS,避免逻辑冲突:
/* Call the Slack API */ private function call_slack_api($token, $method, $endpoint, $data = "") { $curl = curl_init(); $headers = array( "Authorization: Bearer " . $token ); // GET请求不需要手动设置表单类型头,cURL会自动处理 if (strtoupper($method) !== "GET") { $headers[] = "Content-type: application/x-www-form-urlencoded"; } $options = array( CURLOPT_CUSTOMREQUEST => strtoupper($method), CURLOPT_URL => $endpoint, CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => $headers, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_TIMEOUT => 10 ); // 只有非GET请求才传POSTFIELDS if (strtoupper($method) !== "GET" && !empty($data)) { $options[CURLOPT_POSTFIELDS] = $data; } curl_setopt_array($curl, $options); $response = curl_exec($curl); $info = curl_getinfo($curl); $this->response_code = $info['http_code']; curl_close($curl); return $response; }
额外排查点(修复后仍报错时核对)
- 确认使用的
xoxb-/xoxp-开头的token所属应用,已经安装到对应用户ID所在的工作区,跨工作区的token无法查询其他工作区的用户 - 确认token已经申请了
users:read权限,权限不足时部分场景也会返回模糊的user_not_found错误而非明确的权限报错 - 如果传入的是企业级组织(Enterprise Grid)下的跨工作区用户ID,需要使用组织级别的token、调用
admin.users.info接口查询,普通工作区token无法查询未加入当前工作区的组织用户
内容的提问来源于stack exchange,提问作者Virik
相关产品推荐
相关产品推荐

