카카오톡 메시지 API는 실제 카카오톡으로 메시지를 보낼 수 있는 API이며 나에게 메시지 보내기와 등록된 친구에게 최대(5명)까지 메시지를 보낼 수 있다. 이번편에서는 간단하게나마 PHP에서 REST API 를 이용한 나에게 메시지 보내기에 대해 알아보도록 하자.
우선 이번 예제에서 사용된 샘플 파일은 아래와 같이 총 5개의 파일로 구성되어 있다.
config.php | 카카오 API를 이용하기 위한 기본 설정을 정의 |
index.php | 카카오 메시지 UI |
oauth.php | 카카오 메시지에 필요한 로그인 인증 토큰 발행 |
send.php | 카카오 메시지를 전송 |
callback.php | 카카오 메시지를 받고 바로가기 클릭 시 보여지는 화면 |
예제는 최대한 간단하게 구성하였으며 나에게 메시지 보내기 절차는 아래와 같이 이루어진다.
|
<?php
session_start();
// 카카오 앱 키
define('KAKAO_JAVASCRIPT', ''); // 자바스크립트 키
define('KAKAO_REST_API', ''); // REST API 키
define('KAKAO_CLIENT_SECRIET', ''); // 토큰 발급 시, 보안을 강화하기 위해 추가 확인하는 코드 > [내 애플리케이션] > [보안]에서 설정 가능
// 카카오 부가설정: 카카오 로그인 > Redirect URI에 설정 필요
define('KAKAO_REDIRECT_URI', ''); // 카카오 로그인 인증 후 이동될 URI
// 카카오 메시지클릭 후 이동될 URL
define('KAKAO_CALLBACK_URL', '');
$requestOauthUrl = 'https://kauth.kakao.com/oauth/authorize?response_type=code&client_id={REST_API_KEY}&redirect_uri={REDIRECT_URI}';
$requestOauthUrl = str_replace(array('{REST_API_KEY}','{REDIRECT_URI}'), array(KAKAO_JAVASCRIPT,KAKAO_REDIRECT_URI), $requestOauthUrl);
// 디버깅 함수
function debug($arr = array()){
echo '<pre>';
print_r($arr);
echo '</pre>';
}
<?php
include __DIR__."/config.php"; // 카카오 설정 변수
$kakaoData = array();
if( !empty($_SESSION['kakaoData'])){
$kakaoData = $_SESSION['kakaoData'];
}
if( !empty($kakaoData['rst']) && $kakaoData['rst'] == 'fail' ){
echo '<h3>응답에러: '.$kakaoData['msg'].'</h3>';
}
// 엑세스토큰 만료시간 체크
if( $kakaoData['tokenData']['expires_time'] < time()){
$kakaoData = array();
}
// 액세스 토큰 체크 하여 처리
if(empty($kakaoData['tokenData']['access_token'])){
echo '<a href="'.$requestOauthUrl.'">엑세스토큰 요청</a>';
exit;
}
?>
<script src="//code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
<form id="form" action="send.php" onsubmit="return send()">
<h1>나에게 카카오 메시지 보내기(텍스트)</h1>
<p><textarea id="msg" name="msg" placeholder="메시지를 입력해주세요" style="width:400px; height:100px; resize:none;"></textarea></p>
<p><input type="submit" value="전송"></p>
<script>
var authSend = true;
function send(){
if( authSend !== true){ return false; }
var $form = $('#form');
var msg = $form.find('#msg').val();
if( !msg){ alert('메시지를 입력해주세요.'); return false;}
authSend = false;
$.ajax({url:$form.attr('action'), data: {msg: msg}, dataType:'json', type:'post'})
.done(function(e){
console.log(e);
alert(e.msg);
if(e.rst == 'success'){
$form.find('#msg').val('');
}
})
.fail(function(e){console.log(e.responseText); alert('시스템 오류'); })
.always(function(e){ authSend = true;})
return false;
}
</script>
<?php
include __DIR__."/config.php"; // 카카오 설정 변수
$response = array();
if( !empty($_SESSION['kakaoData'])) unset($_SESSION['kakaoData']);
try{
if(empty($_GET['code'])){ throw new Exception("`code` 누락");}
$url = 'https://kauth.kakao.com/oauth/token';
$headers = array('Content-Type: application/x-www-form-urlencoded');
$body = array(
'grant_type'=>'authorization_code', // 고정
'client_id'=>KAKAO_REST_API, // REST API 키
'redirect_uri'=>KAKAO_REDIRECT_URI, // 리다렉트 URI
'code'=>$_GET['code'], // 인가코드
'client_secret'=>KAKAO_CLIENT_SECRIET, // 스크릿키 (카카오 앱에서 사용경우에만 전송)
);
// CURL 을통한 통신
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url.'?'.http_build_query($body));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$res = curl_exec($ch);
curl_close($ch);
// 최종결과를 로드
$tokenData = json_decode($res,true);
if( empty($tokenData['access_token'])){ throw new Exception("엑세스 토큰 요청 실패", 1);}
// 응답용 토큰데이터를 처리
$response['tokenData'] = array(
'access_token'=>$tokenData['access_token'],
'expires_time'=>$tokenData['expires_in']+time(),
'refresh_token'=>$tokenData['refresh_token'],
'refresh_token_expires_time'=>$tokenData['refresh_token_expires_in']+time(),
);
$response['rst'] = 'success';
}
catch(Exception $e){
$response['rst'] = 'fail';
$response['msg'] = $e->getMessage().' (Line: '.$e->getLine().')';
}
$_SESSION['kakaoData'] = $response;
die(header('Location: index.php'));
<?php
include __DIR__."/config.php"; // 카카오 설정 변수
$response = array();
$kakaoData = array();
if( !empty($_SESSION['kakaoData'])){
$kakaoData = $_SESSION['kakaoData'];
}
// 엑세스토큰 만료시간 체크
if( $kakaoData['tokenData']['expires_time'] < time()){
$kakaoData = array();
}
try{
if(empty($kakaoData['tokenData'])){ throw new Exception("`tokenData` 누락");}
if( empty($_POST['msg'])){ throw new Exception("메시지를 입력해주세요."); }
$msg = $_POST['msg'];
$url = 'https://kapi.kakao.com/v2/api/talk/memo/default/send';
$headers = array(
'Content-Type: application/x-www-form-urlencoded',
'Authorization: Bearer '.$kakaoData['tokenData']['access_token']
);
$template_object = array(
'object_type'=>'text',
'text'=>$msg,
'link'=>array(
'web_url'=>KAKAO_CALLBACK_URL.'?tokenData='.bin2hex(serialize($kakaoData['tokenData'])),
'mobile_web_url'=>KAKAO_CALLBACK_URL.'?tokenData='.bin2hex(serialize($kakaoData['tokenData'])),
),
'button_title'=>'바로가기',
);
$body = array(
'template_object'=>json_encode($template_object)
);
// CURL 을통한 통신
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($body));
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$res = curl_exec($ch);
curl_close($ch);
// 최종결과를 로드
$tokenData = json_decode($res,true);
if( !isset($tokenData['result_code']) || $tokenData['result_code'] !== 0){
throw new Exception("메시지 전송에 실패하였습니다.");
}
$response['rst'] = 'success';
$response['template_object'] = $template_object;
$response['msg'] = '나에게 메시지 전송이 성공하였습니다.(카카오톡에서 확인해주세요.)';
}
catch(Exception $e){
$response['rst'] = 'fail';
$response['msg'] = $e->getMessage().' (Line: '.$e->getLine().')';
}
die(json_encode($response));
<?php
include __DIR__."/config.php"; // 카카오 설정 변수
$tokenData = array();
if(!empty($_GET['tokenData'])){
$tokenData = unserialize(hex2bin($_GET['tokenData']));
}
if( empty($tokenData['access_token'])){ die('엑세스 토큰이 없습니다.'); }
if( empty($tokenData['expires_time']) || time() > $tokenData['expires_time'] ){ die('엑세스 토큰이 만료되었습니다.'); }
echo '<h1>환영합니다!</h1>';
echo '<h2>엑세스 토큰 만료일['.date('Y-m-d H:i:s',$tokenData['expires_time']).']</h2>';
최종적으로 인증 성공 후 메시지를 받아서 카카오톡에서 확인이 가능하며 메시지의 바로가기 클릭시에는 아래와 같은 화면을 볼 수 있다.