본문 바로가기
카카오 REST API & SDK/공통 사항

PHP 유형별 콜백 부가설명

by kakao-TAM 2021. 4. 15.

카카오에서 제공하는 콜백은 3가지가 있습니다. 알림을 받아 파일로 로그를 남기는 부분만 예제를 작성했습니다.

 

* 연결 끊기 알림 : developers.kakao.com/docs/latest/ko/reference/callback#unlink-callback 

* 카카오톡 채널 관계 알림 : developers.kakao.com/docs/latest/ko/reference/callback#channel-callback

* 카카오링크 전송 성공 알림 : developers.kakao.com/docs/latest/ko/reference/callback#kakaolink-callback

 

연결 끊기 알림

설정 위치 : 내 애플리케이션>제품 설정>카카오 로그인>연결 끊기

연결 끊기 알림은 탈퇴 처리 및 정보 삭제를 요청하는 것이므로, 처리 후 성공 응답을 보내야 합니다.

 

 

연결 끊기 알림을 등록하면 accounts.kakao.com에서 "모든정보삭제" 버튼만 활성화됨

public function unlinkCallBack(){
    $this->unlinkhasAccess();
    //탈퇴처리 추가
    echo json_encode(array('result_code'=>200, 'result'=>'success'));
}    

public function unlinkhasAccess(){
    //Write action to txt log
    $log  = "/REMOTE_ADDR: ".$_SERVER['REMOTE_ADDR'].
            "/user_id: ".$_GET["user_id"].
            "/referrer_type: ".$_GET["referrer_type"].PHP_EOL;
    file_put_contents('./unlinkCallBack_log_'.date("j.n.Y").'.txt', $log, FILE_APPEND);
}       

 

 

카카오톡 채널 관계 알림

설정 위치 : 내 애플리케이션>제품 설정>카카오톡 채널

카카오톡 채널 관계 알림은 사용자의 카카오톡 채널 추가 상태를 최신 정보로 갱신할 수 있습니다.

전달 받는 파라메터 중 id_type은 app_user_id와 id_type가 있고 차이는 정보 제공 동의 여부입니다.
("내 애플리케이션>제품 설정>카카오 로그인>동의항목"의 plusfriends 입니다.)

  1. 정보 제공 동의 했을때 채널 관계 알림을 받으면 app_user_id
  2. 동의 안했을때 채널관계 알림을 받으면 open_id

서비스하시는 앱에 가입되지 않은 사용자가 채널에 가입하여 알림을 받은 경우도 open_id가 전달됩니다.

plusfriends 동의항목

public function callback(){
    $json = file_get_contents('php://input');
    $data = json_decode($json);        
    $this->hasAccess($data);
    echo json_encode(array('result_code'=>200, 'result'=>'success'));
}

public function hasAccess($data){
    $log  = "/REMOTE_ADDR: ".$_SERVER['REMOTE_ADDR'].
            "/event: ".$data->event.
            "/id: ".$data->id.
            "/id_type: ".$data->id_type.
            "/plus_friend_public_id: ".$data->plus_friend_public_id.
            "/plus_friend_uuid: ".$data->plus_friend_uuid.
            "/updated_at: ".$data->updated_at.PHP_EOL;
    file_put_contents('./channel_callback_log_'.date("j.n.Y").'.txt', $log, FILE_APPEND);
}    

 

카카오링크 전송 성공 알림

설정 위치 : 내 애플리케이션>제품 설정>카카오링크

카카오링크 전송 성공 알림은 메시지가 성공적으로 전달된 경우, 콜백 URL로 알려주는 기능입니다.

콜백을 받으려면 링크 메시지를 발송 시, "serverCallbackArgs" 항목을 추가해야합니다.

var test =   Kakao.Link.createDefaultButton({
    container: '#CONTAINER_ID',
    objectType: 'feed',
    content: {
        title: '제목',
        description: '내용',
        imageUrl: 'https://test.com/img.jpg',
        link: {
            mobileWebUrl: "https://test.com",
            webUrl: "https://test.com"
        }
    },
    serverCallbackArgs: '{"callback":"link"}',
    buttons: [{
        title: "버튼",
        link: {
            webUrl: "https://test.com",
            mobileWebUrl: "https://test.com"
        }
    }]
});
public function linkCallBack(){
    $this->linkhasAccess();
    echo json_encode(array('result_code'=>200, 'result'=>'success'));
}    

public function linkhasAccess(){

    $log  = "/REMOTE_ADDR: ".$_SERVER['REMOTE_ADDR'].PHP_EOL;
    file_put_contents('./linkCallBack_log_'.date("j.n.Y").'.txt', $log, FILE_APPEND);
}    

 

 

추가

PHP에서 주소 라우팅

.htaccess

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

index.php

<?php
require(__DIR__ . '/api/common/route.php');
Route::init($_SERVER['REQUEST_URI']);
?>

route.php

<?php
class Route {  
    public static function init($reqUri){
        if(Route::isAPI($reqUri)){
            Route::routeApi($reqUri);
        }
        else{
            Route::routeReact($reqUri);
        }
    }

    private static function isAPI($reqUri){
        if(strlen($reqUri)<4) return false;
        return substr($reqUri,0,4) == '/api' ? true : false;
    }        

    private static function routeApi($reqUri){

        $url = preg_split('#/#', $reqUri);
        require($url[1].'/'.$url[2].'/controller/'.$url[3].'Controller.php');       

        Response::jsonheader();

        $ctr_name = $url[3].'Controller';
        $ctr = new $ctr_name();
        if( isset( $url[4] )){      
            $fullName   = $url[4];
            $searchName = '?';
            $pos        = strpos($fullName, $searchName);           
            if($pos === false) {
                $functionName = $url[4]; 
            } else {
                $functionName = explode( '?', $url[4]); 
                $functionName = $functionName[0];
            }                
            
            $ctr->{$functionName}();
        }
        else{
            $ctr->defaultMethod();
        }
    }

    private static function routeReact($reqUri){
        require('index.html');
    }    
}
?>

/api/kakao/channel/linkCallBack 형태로 호출 시,

/api/kakao/controller/channelController.php 의 linkCallBack함수 호출

댓글