카카오 REST API 사용법 - kakao REST API sayongbeob

방문자는 공유하기 아이콘을 클릭해, 내 사이트의 콘텐츠(상품, 게시물 등)를 간편하게 메신저, SNS에 공유할 수 있습니다. 이 도움말에서는 카카오톡 공유 및 카카오 스토리 공유를 위한 카카오 API키 발급 및 적용방법을 설명합니다.

중요: 2018년 6월 1일부로 카카오 링크 2.0 정책 변경으로 인해 카카오톡, 카카오 스토리에 공유 기능을 사용하기 위해선 카카오 개발자센터에서 API 키를 발급받아 내 사이트에 적용해야 합니다. 카카오 개발자센터 공지 확인하기

1단계: 카카오 개발자 페이지 접속하기

  1. 카카오 디벨로퍼스에 접속합니다.
  2. 오른쪽 상단의 로그인 버튼을 클릭해 카카오 계정으로 로그인 합니다. *카카오 계정이 없는 경우 새롭게 계정을 생성합니다.

2단계: 내 애플리케이션 만들기

  1. 상단 메뉴에서 내 애플리케이션을 클릭합니다.
  2. 서비스 이용 동의 페이지가 나타나는 경우 필수 항목에 동의하고, 개발자 이름을 입력한 다음 회원가입 버튼을 클릭해 다음 단계로 넘어갑니다. (기존에 서비스 이용 동의한 경우 표시되지 않을 수 있습니다.)
  3. 전체 애플리케이션 페이지가 나타나면, 애플리케이션 추가하기를 클릭합니다.
  4. 앱 아이콘(로고)을 업로드하고, 앱 이름, 회사 이름을 작성합니다.

    카카오 REST API 사용법 - kakao REST API sayongbeob

  5. 저장 버튼을 클릭합니다.

3단계: 플랫폼 설정하기

  1. 전체 애플리케이션 목록으로 돌아가면, 새로 추가한 을 클릭합니다.
  2. 플랫폼 항목에서 플랫폼 설정하기를 클릭합니다.
  3. Web 항목의 Web 플랫폼 등록 버튼을 클릭합니다.
  4. 운영 중인 사이트 주소(URL)를 입력합니다. 여러 개의 도메인을 사용하고 계신 경우, Enter로 구분해 도메인을 모두 입력합니다.

    주의: http:// 및 https:// 를 정확히 구분해 입력해 주세요.

    카카오 REST API 사용법 - kakao REST API sayongbeob

  5. 저장 버튼을 클릭해 적용합니다.

4단계: 발급받은 Javascript 키 복사하기

  1. 왼쪽 탭 메뉴에서 앱 키를 클릭합니다.
  2. JavaScript 키 오른쪽 복사버튼을 클릭합니다.

    카카오 REST API 사용법 - kakao REST API sayongbeob

5단계: 내 사이트에 JavaScript 키 적용하기

  1. 내 사이트 관리자 페이지에 접속합니다. 접속방법
  2. 왼쪽 메뉴에서 [환경설정 > 소셜 로그인 / API 설정]을 클릭합니다.
  3. 상단 공유 및 API 설정 탭 메뉴를 클릭합니다.
  4. 카카오 링크 항목에서 카카오 링크 사용을 선택합니다.
  5. API 키 오른쪽 빈 칸에, 위 4단계에서 복사한 JavaScript 키를 붙여넣습니다.

    카카오 REST API 사용법 - kakao REST API sayongbeob

  6. 저장 버튼을 클릭해 적용합니다.

PHP로 "카카오 로그인, 카카오 친구목록 조회 및 카카오톡 메시지 발송" 테스트 해볼 수 있는 간단한 예제입니다.

kakao_rest_api_example.php.zip (3.2 KB)

[실행방법]

  1. kakao_rest_api_example.php.zip 파일을 받아 압축을 푼 후, php 구동가능한 웹서버 root폴더에 복사합니다.
  2. developers.kakao.com > 내 애플리케이션 > "애플리케이션 추가하기"로 앱을 생성합니다.
  3. 내 애플리케이션 > 앱 설정 > 요약 정보 > "REST API 키"를 복사해서 kakao_rest_api_example.php 파일 $REST_API_KEY 변수에 설정합니다.
  4. http://localhost/kakao_rest_api_example.php 에 접속합니다.

[실행결과]

카카오 REST API 사용법 - kakao REST API sayongbeob

안내에 따라 "내 애플리케이션" 설정을하고 로그인하면 프로필 조회결과를 확인할 수 있습니다.

카카오 REST API 사용법 - kakao REST API sayongbeob

안내에 따라 "팀 멤버" 등록과 등록한 친구의 "로그인, 권한 획득" 하면 메시지 발송 결과를 확인할 수 있습니다.

<?php //공통 : Config
$REST_API_KEY   = ""; // 내 애플리케이션 > 앱 설정 > 요약 정보
$CLIENT_SECRET  = ""; // 내 애플리케이션 > 제품 설정 > 카카오 로그인 > 보안
$REDIRECT_URI   = urlencode("http://localhost/kakao_rest_api_example.php");
?>
<?php //공통 : API Call Function
function Call($callUrl, $method, $headers = array(), $data = array(), $returnType="jsonObject")
{
    echo "<pre>".$callUrl."</pre>";
    try {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $callUrl);
        if ($method == "POST") {
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        } else {
            curl_setopt($ch, CURLOPT_POST, false);
        }
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_HTTP200ALIASES, array(400));
        $response = curl_exec($ch);
        $status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        echo "<pre>".$status_code.":".$response."</pre>";

        if ($returnType=="jsonObject") return json_decode($response);
        else return $response;     
    } catch (Exception $e) {
        echo $e;
    }    
}
?>

<h2>1. 카카오 로그인 및 프로필 조회 예제</h2>
<pre>
- [KOE101, KOE004] 내 애플리케이션>제품 설정>카카오 로그인 > 활성화 설정 : ON
- [KOE006] 내 애플리케이션>제품 설정>카카오 로그인 > Redirect URI : http://localhost/kakao_rest_api_example.php
</pre>
<a href="https://kauth.kakao.com/oauth/authorize?client_id=<?=$REST_API_KEY?>&response_type=code&redirect_uri=<?=$REDIRECT_URI?>"><img src="//k.kakaocdn.net/14/dn/btqCn0WEmI3/nijroPfbpCa4at5EIsjyf0/o.jpg" width="222" /></a>

<?php 
if (!isset($_GET["code"])) die(); //code 받기 전이면 수행 안함

function getToken($REST_API_KEY, $REDIRECT_URI, $CLIENT_SECRET) //로그인 : 토큰 조회
{
    $code = $_GET["code"]; //Redirect URI로 돌아올 때, 받아온 파라메터 
    $callUrl = "https://kauth.kakao.com/oauth/token?grant_type=authorization_code&client_id=".$REST_API_KEY."&redirect_uri=".$REDIRECT_URI."&code=".$code."&client_secret=".$CLIENT_SECRET;
    $res = Call($callUrl, "POST");
    if($res->error_code == "KOE320") die("[KOE320] code 받은 후, 새로고침하면 code 재사용 불가 에러 : 다시 로그인 시도 할 것");
    return $res;
}
function getProfile($ACCESS_TOKEN) //로그인 : 플로필 조회
{
    $callUrl = "https://kapi.kakao.com/v2/user/me";
    $headers[] = "Authorization: Bearer ".$ACCESS_TOKEN;
    $res = Call($callUrl, "POST", $headers);
    if($res->properties == "") die("내 애플리케이션>제품 설정>카카오 로그인> 동의항목 : profile 필수 설정");
    return $res;
}    
?>

<?php 
$ACCESS_TOKEN = getToken($REST_API_KEY, $REDIRECT_URI, $CLIENT_SECRET)->access_token; // 토큰 조회 및 토큰 저장
?>
<?php 
getProfile($ACCESS_TOKEN); // 프로필 조회
?>

<h2>2. 카카오 친구목록 조회 및 카카오톡 메시지 예제</h2>
<pre>
* 로그인한 사용자의 전체 친구 목록을 표시하고 선택한 후, 발송하는 방식은 카카오 링크 참조 (REST API 불가)
* 친구에게 테스트 메시지 발송을 위해서는 "내 애플리케이션>앱 설정>팀 관리"에 카톡친구를 등록해야함.
* 친구 API, 메시지 API는 카톡 친구이며 발신자, 수신자 모두 앱에 로그인하여 <font color="red">권한 동의</font>한 경우만 사용 가능

- [KOE205] 내 애플리케이션>제품 설정>카카오 로그인> 동의항목 : friends,talk_message 선택 동의 or 이용 중 동의 설정
</pre>
<a href="https://kauth.kakao.com/oauth/authorize?client_id=<?=$REST_API_KEY?>&response_type=code&redirect_uri=<?=$REDIRECT_URI?>&scope=friends,talk_message" class="btn btn-primary"><h2>친구목록 조회와 메세지 발송 권한 획득</h2></a>

<?php
   function sendMessage($ACCESS_TOKEN, $data)
    {
        $callUrl = "https://kapi.kakao.com/v2/api/talk/memo/default/send";
        $headers = array('Content-type:application/x-www-form-urlencoded;charset=utf-8');
        $headers[] = "Authorization: Bearer " . $ACCESS_TOKEN;
        return Call($callUrl, "POST", $headers, $data);
    }

    function sendScrap($ACCESS_TOKEN, $request_url)
    {
        $callUrl = "https://kapi.kakao.com/v2/api/talk/memo/scrap/send";
        $headers = array('Content-type:application/x-www-form-urlencoded;charset=utf-8');
        $data = 'request_url='.urlencode($request_url);
        $headers[] = "Authorization: Bearer " . $ACCESS_TOKEN;
        return Call($callUrl, "POST", $headers, $data);
    }

    function sendCustomTemplate($ACCESS_TOKEN, $template_id)
    {
        $callUrl = "https://kapi.kakao.com/v2/api/talk/memo/send?template_id=".$template_id;
        $headers = array('Content-type:application/x-www-form-urlencoded;charset=utf-8');
        $headers[] = "Authorization: Bearer " . $ACCESS_TOKEN;
        return Call($callUrl, "POST", $headers);
    }

    function getFriendsList($ACCESS_TOKEN)
    {
        $callUrl = "https://kapi.kakao.com/v1/api/talk/friends";
        $headers = array();
        $headers[] = "Authorization: Bearer " . $ACCESS_TOKEN;
        return Call($callUrl, "GET", $headers);
    }

    function sendMessageForFriend($ACCESS_TOKEN, $receiver_uuids, $template)
    {
        $callUrl = "https://kapi.kakao.com/v1/api/talk/friends/message/default/send";
        $headers = array('Content-type:application/x-www-form-urlencoded;charset=utf-8');
        $headers[] = "Authorization: Bearer " . $ACCESS_TOKEN;
        $data = $template."&receiver_uuids=".json_encode($receiver_uuids);
        return Call($callUrl, "POST", $headers, $data);
    }

    function sendScrapForFriend($ACCESS_TOKEN, $receiver_uuids, $request_url)
    {
        $callUrl = "https://kapi.kakao.com/v1/api/talk/friends/message/scrap/send";
        $headers = array('Content-type:application/x-www-form-urlencoded;charset=utf-8');
        $headers[] = "Authorization: Bearer " . $ACCESS_TOKEN;
        $data = 'request_url='.urlencode($request_url)."&receiver_uuids=".json_encode($receiver_uuids);
        return Call($callUrl, "POST", $headers, $data);
    }

    function sendCustomTemplateForFriend($ACCESS_TOKEN, $receiver_uuids, $template_id)
    {
        $callUrl = "https://kapi.kakao.com/v1/api/talk/friends/message/send?template_id=".$template_id;
        $headers = array('Content-type:application/x-www-form-urlencoded;charset=utf-8');
        $headers[] = "Authorization: Bearer " . $ACCESS_TOKEN;
        $data = "receiver_uuids=".json_encode($receiver_uuids);
        return Call($callUrl, "POST", $headers, $data);
    }
?>

<?php
$data_feed = 'template_object={
        "object_type": "feed",
        "content": {
                "title": "feed 제목",
                "description": "내용은 두줄 까지 표시 \n 플랫폼>도메인에 등록안된 url 도메인은 연결안됨 등록된 첫번째로 이동함.",
                "image_url": "http://mud-kage.kakao.co.kr/dn/NTmhS/btqfEUdFAUf/FjKzkZsnoeE4o19klTOVI1/openlink_640x640s.jpg",
                "image_width": 640,"image_height": 640,
                "link": {"web_url": "http://www.daum.net","mobile_web_url": "http://m.daum.net"}
        },
        "social": {"like_count": 100,"comment_count": 200,"shared_count": 300},
        "buttons": [
            {
                "title": "도메인에 등록안된 url 버튼은 표시안됨",
                "link": {"web_url": "http://www.daum.net","mobile_web_url": "http://localhost"}
            }
        ]
    }';
sendMessage($ACCESS_TOKEN, $data_feed);
sendScrap($ACCESS_TOKEN,"http://localhost"); //도메인에 등록된 주소 설정 시, 스크랩서버가 접근하여 수집한 미리보기 내용(og태그)을 메시지에 표시함.
//sendCustomTemplate($ACCESS_TOKEN,"12345"); //도구 > 메시지 템플릿에서 템플릿 등록 필수

$res = getFriendsList($ACCESS_TOKEN);
$receiver_uuids = array();
foreach ($res->elements as $obj)
{
    echo $obj->profile_nickname;
    $receiver_uuids[] = $obj->uuid;
}

sendMessageForFriend($ACCESS_TOKEN, $receiver_uuids, $data_feed);
sendScrapForFriend($ACCESS_TOKEN, $receiver_uuids,"http://localhost"); //도메인에 등록된 주소 설정 시, 스크랩서버가 접근하여 수집한 미리보기 내용(og태그)을 메시지에 표시함.
//sendCustomTemplateForFriend($ACCESS_TOKEN, $obj->uuid,"12345"); //도구 > 메시지 템플릿에서 템플릿 등록 필수

?>

로그인에 관한 가이드 : https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api
친구목록 관한 가이드 : https://developers.kakao.com/docs/latest/ko/kakaotalk-social/rest-api#get-friends
메시지에 관한 가이드 : https://developers.kakao.com/docs/latest/ko/message/rest-api

KOE006 에러 : https://devtalk.kakao.com/t/koe006/114778
친구목록, 메시지 API 자주 겪는 에러 : https://devtalk.kakao.com/t/faq-api-api/82152?source_topic_id=109558
메시지 API 권한 신청 방법 : https://devtalk.kakao.com/t/api-how-to-request-permission-for-messaging-api/80421?source_topic_id=115052