친구목록 불러오기 오류

--------------------------------[kakao_index.php]--------------------------------

// 카카오 개발자 사이트에서 발급받은 클라이언트 ID와 시크릿을 입력하세요.
$client_id = 'xxxxxxxxxxxxxxxxxxxxxxxxx';

// 카카오 로그인 콜백 URL을 입력하세요.
$redirect_uri = 'https://kakaonara.co.kr/kakao_callback.php';

// 카카오 로그인 페이지로 리다이렉트합니다.
$authorize_url = 'https://kauth.kakao.com/oauth/authorize?' . http_build_query([
    'client_id' => $client_id,
    'redirect_uri' => $redirect_uri,
    'response_type' => 'code',
]);

--------------------------------[kakao_callback.php]--------------------------------

$client_id = 'xxxxxxxxxxxxxxxxxxxxxxxxx';
$client_secret = 'lHyyyyyyyyyyyyyyyyyyyyyg';
$redirect_uri = 'https://kakaonara.co.kr/kakao_callback.php';

if (isset($_GET['code'])) {
    $code = $_GET['code'];

    $token_url = 'https://kauth.kakao.com/oauth/token';
    $token_params = [
        'grant_type' => 'authorization_code',
        'client_id' => $client_id,
        'client_secret' => $client_secret,
        'redirect_uri' => $redirect_uri,
        'code' => $code,
    ];

    $ch = curl_init($token_url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $token_params);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    
    $token_response = curl_exec($ch);

    // cURL 오류 정보 출력
    if (curl_errno($ch)) {
        echo 'cURL 오류: ' . curl_error($ch);
    }

    curl_close($ch);

    $token_data = json_decode($token_response, true);

    if (isset($token_data['access_token'])) {
        $api_url = 'https://kapi.kakao.com/v2/user/me';
        $api_params = [
            'access_token' => $token_data['access_token'],
        ];

        $ch = curl_init($api_url . '?' . http_build_query($api_params));
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        
        $user_response = curl_exec($ch);
        curl_close($ch);
        
        $user_data = json_decode($user_response, true);
        echo '<h2>사용자 정보</h2>';
        echo '<pre>';
        print_r($user_data);
        echo '</pre>';
    } else {
        echo '액세스 토큰을 가져오는 데 실패했습니다.';
    }
} else {
    echo '코드를 받아오지 못했습니다.';
}
echo "<a href='$authorize_url'>카카오 계정으로 로그인</a>";

결과
[액세스 토큰을 가져오는 데 실패했습니다.]
이렇게 나와요 어디를 체크해야 할까요?
Redirect URI 확인했고 팀원도 로그인했음

참고로! 처음 몇번은 친구목록이 나왔습니다.

id :1010838
$client_id = ‘a0914fd445ed6c23b09fe5358e817b78’;

문의 시, 사용하시는 개발환경과 디벨로퍼스 앱ID를 알려주세요.


안녕하세요.

토큰 발급은 x-www-form-urlencoded 데이터 형식으로 요청 하셔야 합니다.

curl_setopt($ch, CURLOPT_URL, 'https://kauth.kakao.com/oauth/token');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
    'Content-Type: application/x-www-form-urlencoded',
]);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'grant_type=authorization_code'
                    . '&client_id=' . $cliend_id
                    . '&redirect_uri=' . urlencode($redirect_uri)
                    . '&code=' . $code);

// client_secret 옵션 활성화 하지 않았기에 해당 파라미터 불필요

감사합니다. 아주 잘됩니다.

curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));