본문 바로가기
카카오 REST API & SDK/카카오톡 메세지

[PHP] 카카오톡 메세지 REST API 사용해보기 - 1. 나에게 기본 메세지 보내기

by kakao-TAM 2020. 12. 28.

developers.kakao.com/docs/latest/ko/message/common

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

카카오톡 메세지를 발송하는 방법은 크게 두가지가 있습니다. 본 포스트에는 카카오톡 메세지 API 를 설명하겠습니다.

  • 카카오 링크 : 카카오에서 제공한 SDK를 이용하여 사용가능. 대상 선택과 메세지 발송을 카카오톡을 통해 처리
  • 카카오톡 메세지 API : 카카오 API 서버에 요청하여 목록 조회와 발송 처리

 

1. 나에게 기본 메세지 보내기

POST /v2/api/talk/memo/default/send HTTP/1.1
Host: kapi.kakao.com
Authorization: Bearer {ACCESS_TOKEN}

$_SESSION["accessToken"]에 액세스 토큰이 저장되었다고 전제 합니다. 카카오 로그인으로 액세스 토큰을 세션에 저장하는 방법은 [여기]를 참고하세요. 메세지 보내기의 작동하는 화면은 [여기]를 참고하세요.

 

  • 호출 순서 : kakao_talk_message.php ▶ KakaoAPIService.php (extends KakaoService)

kakao_talk_message.php

<?php
require('KakaoAPIService.php');
$KakaoAPIService = new KakaoAPIService();

$data = 'template_object={
			"object_type": "text",
			"text": "텍스트 영역입니다. 최대 200자 표시 가능합니다.",
			"link": {
					"web_url": "https://developers.kakao.com",
					"mobile_web_url": "https://developers.kakao.com"
			},
			"button_title": "바로 확인"
		}';
$res = $KakaoAPIService->sendMessage($data);
echo($res->result_code);
?>

KakaoAPIService.php

<?php
require('KakaoService.php');
class KakaoAPIService extends KakaoService
{
    public function __construct($return_type="")
    {
        parent::__construct($return_type);
    }
    
    public function sendTalk($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 " . $_SESSION["accessToken"];
        return $this->excuteCurl($callUrl, "POST", $headers, $data);
    }    
}
?>

KakaoService.php

<?php
class KakaoService 
{
    public $JAVASCRIPT_KEY;
    protected $REST_API_KEY;
    protected $ADMIN_KEY;
    protected $CLIENT_SECRET;
    protected $REDIRECT_URI;
    protected $LOGOUT_REDIRECT_URI;
    protected $RETURN_TYPE;

    public function __construct($return_type)
    {   //★ 수정 할 것
        $this->JAVASCRIPT_KEY = ""; // https://developers.kakao.com > 내 애플리케이션 > 앱 설정 > 요약 정보
        $this->REST_API_KEY   = ""; // https://developers.kakao.com > 내 애플리케이션 > 앱 설정 > 요약 정보
        $this->ADMIN_KEY      = ""; // https://developers.kakao.com > 내 애플리케이션 > 앱 설정 > 요약 정보
        $this->CLIENT_SECRET  = ""; // https://developers.kakao.com > 내 애플리케이션 > 제품 설정 > 카카오 로그인 > 보안
        $this->RETURN_TYPE  = $return_type;

        $protocol = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https://" : "http://");
        $this->REDIRECT_URI          = urlencode($protocol . $_SERVER['HTTP_HOST'] . "/your_callback_page");  // 내 애플리케이션 > 제품 설정 > 카카오 로그인
        $this->LOGOUT_REDIRECT_URI   = urlencode($protocol . $_SERVER['HTTP_HOST'] . "/your_logout_callback_page"); // 내 애플리케이션 > 제품 설정 > 카카오 로그인 > 고급 > Logout Redirect URI
        if (session_status() == PHP_SESSION_NONE) {
            session_start();
        }
    }

    protected function excuteCurl($callUrl, $method, $headers = array(), $data = array(), $session_type="")
    {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $callUrl);
        if ($method == "POST") {
            curl_setopt($ch, CURLOPT_POST, true);
        } else {
            curl_setopt($ch, CURLOPT_POST, false);
        }
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        $response = curl_exec($ch);
        $status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);

        if($session_type=="accessToken"){
            //Custom Session설정 : refreshToken은 2개월 보존되며, 1개월 남았을 때 갱신 가능하므로 세션이 아닌 개별 저장소에 저장하는 것이 좋음
            if(isset(json_decode($response["response"])->access_token)){
                $_SESSION["accessToken"] = json_decode($response["response"])->access_token;
            }
            if(isset(json_decode($response["response"])->refresh_token)){
                $_SESSION["refreshToken"] = json_decode($response["response"])->refresh_token;
            }
        }
        if($session_type=="profile"){
            //Custom Session설정 
            if(isset(json_decode($response["response"])->id)){
                $_SESSION["loginProfile"] = json_decode($response["response"]);
            }
        }        

        return $this->rtn(json_decode($response), $status_code);
    }
}
?>

 

kakao_talk_message.php에서 template_object를 교체하면 메세지를 표시 유형별로 발송 할 수 있습니다.

* 피드 템플릿

template_object={
        "object_type": "feed",
        "content": {
            "title": "디저트 사진",
            "description": "아메리카노, 빵, 케익",
            "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",
            "android_execution_params": "contentId=100",
            "ios_execution_params": "contentId=100"
            }
        },
        "social": {
            "like_count": 100,
            "comment_count": 200,
            "shared_count": 300,
            "view_count": 400,
            "subscriber_count": 500
        },
        "buttons": [
            {
            "title": "웹으로 이동",
            "link": {
                "web_url": "http://www.daum.net",
                "mobile_web_url": "http://m.daum.net"
            }
            },
            {
            "title": "앱으로 이동",
            "link": {
                "android_execution_params": "contentId=100",
                "ios_execution_params": "contentId=100"
            }
            }
        ]
    }

* 리스트 템플릿

template_object={
        "object_type": "list",
        "header_title": "WEEKELY MAGAZINE",
        "header_link": {
            "web_url": "http://www.daum.net",
            "mobile_web_url": "http://m.daum.net",
            "android_execution_params": "main",
            "ios_execution_params": "main"
        },
        "contents": [
            {
            "title": "자전거 라이더를 위한 공간",
            "description": "매거진",
            "image_url": "http://mud-kage.kakao.co.kr/dn/QNvGY/btqfD0SKT9m/k4KUlb1m0dKPHxGV8WbIK1/openlink_640x640s.jpg",
            "image_width": 640,
            "image_height": 640,
            "link": {
                "web_url": "http://www.daum.net/contents/1",
                "mobile_web_url": "http://m.daum.net/contents/1",
                "android_execution_params": "/contents/1",
                "ios_execution_params": "/contents/1"
            }
            },
            {
            "title": "비쥬얼이 끝내주는 오레오 카푸치노",
            "description": "매거진",
            "image_url": "http://mud-kage.kakao.co.kr/dn/boVWEm/btqfFGlOpJB/mKsq9z6U2Xpms3NztZgiD1/openlink_640x640s.jpg",
            "image_width": 640,
            "image_height": 640,
            "link": {
                "web_url": "http://www.daum.net/contents/2",
                "mobile_web_url": "http://m.daum.net/contents/2",
                "android_execution_params": "/contents/2",
                "ios_execution_params": "/contents/2"
            }
            },
            {
            "title": "감성이 가득한 분위기",
            "description": "매거진",
            "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/contents/3",
                "mobile_web_url": "http://m.daum.net/contents/3",
                "android_execution_params": "/contents/3",
                "ios_execution_params": "/contents/3"
            }
            }
        ],
        "buttons": [
            {
            "title": "웹으로 이동",
            "link": {
                "web_url": "http://www.daum.net",
                "mobile_web_url": "http://m.daum.net"
            }
            },
            {
            "title": "앱으로 이동",
            "link": {
                "android_execution_params": "main",
                "ios_execution_params": "main"
            }
            }
        ]
    }

* 위치 템플릿

template_object={
        "object_type": "location",
        "content": {
            "title": "카카오 판교오피스",
            "description": "카카오 판교오피스 위치입니다.",
            "image_url": "https://mud-kage.kakao.com/dn/drTdbB/bWYf06POFPf/owUHIt7K7NoGD0hrzFLeW0/kakaolink40_original.png",
            "image_width": 800,
            "image_height": 800,
            "link": {
            "web_url": "https://developers.kakao.com",
            "mobile_web_url": "https://developers.kakao.com/mobile",
            "android_execution_params": "platform=android",
            "ios_execution_params": "platform=ios"
            }
        },
        "buttons": [
            {
            "title": "웹으로 보기",
            "link": {
                "web_url": "https://developers.kakao.com",
                "mobile_web_url": "https://developers.kakao.com/mobile"
            }
            }
        ],
        "address": "경기 성남시 분당구 판교역로 235 에이치스퀘어 N동 7층",
        "address_title": "카카오 판교오피스"
    }

* 커머스 템플릿

template_object={
        "object_type": "commerce",
        "content": {
            "title": "Ivory long dress (4 Color)",
            "image_url": "http://mud-kage.kakao.co.kr/dn/RY8ZN/btqgOGzITp3/uCM1x2xu7GNfr7NS9QvEs0/kakaolink40_original.png",
            "image_width": 640,
            "image_height": 640,
            "link": {
            "web_url": "https://style.kakao.com/main/women/contentId=100",
            "mobile_web_url": "https://style.kakao.com/main/women/contentId=100",
            "android_execution_params": "contentId=100",
            "ios_execution_params": "contentId=100"
            }
        },
        "commerce": {
            "regular_price": 208800,
            "discount_price": 146160,
            "discount_rate": 30
        },
        "buttons": [
            {
            "title": "구매하기",
            "link": {
                "web_url": "https://style.kakao.com/main/women/contentId=100/buy",
                "mobile_web_url": "https://style.kakao.com/main/women/contentId=100/buy",
                "android_execution_params": "contentId=100&buy=true",
                "ios_execution_params": "contentId=100&buy=true"
            }
            },
            {
            "title": "공유하기",
            "link": {
                "web_url": "https://style.kakao.com/main/women/contentId=100/share",
                "mobile_web_url": "https://style.kakao.com/main/women/contentId=100/share",
                "android_execution_params": "contentId=100&share=true",
                "ios_execution_params": "contentId=100&share=true"
            }
            }
        ]
    }

* 텍스트 템플릿

template_object={
        "object_type": "text",
        "text": "텍스트 영역입니다. 최대 200자 표시 가능합니다.",
        "link": {
            "web_url": "https://developers.kakao.com",
            "mobile_web_url": "https://developers.kakao.com"
        },
        "button_title": "바로 확인"
    }

 

 

 

 

 

댓글