Files
core/src/kakao/Kakao_REST_API_Helper.php
T
Hide_D 43997b9117 fix: phan 메시지에 따라 수정
- array에 +=를 phan 알아듣기 쉽게 array_merge로
- Util::array_get이 더 이상 필요없으므로 null coalescing
- array로 tuple류를 반환하는 함수에 index를 포함하도록 변경
  - php intelephense에게는 현재 무효
- getPost 일부 값에 int 지정
- 아이템에 id property를 없앴으므로 관련 코드 제거
- enum은 array key로 사용할 수 없으므로 \Ds\Map으로 변경
- KakaoKey PhanRedefineClass 에러 우회
2022-05-09 01:25:12 +09:00

278 lines
8.3 KiB
PHP

<?php
namespace kakao;
class KakaoKeyNull
{
const REST_KEY = '';
const ADMIN_KEY = '';
const REDIRECT_URI = '';
}
if (!class_exists('\\kakao\\KakaoKey')) {
class_alias('\\kakao\\KakaoKeyNull', '\\kakao\\KakaoKey');
}
//https://devtalk.kakao.com/t/php-rest-api/14602/3
//header('Content-Type: application/json; charset=utf-8');
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
class User_Management_Path
{
public static $TOKEN = "/oauth/token";
public static $SIGNUP = "/v1/user/signup";
public static $UNLINK = "/v1/user/unlink";
public static $LOGOUT = "/v1/user/logout";
public static $ME = "/v2/user/me";
public static $UPDATE_PROFILE = "/v1/user/update_profile";
public static $USER_IDS = "/v1/user/ids";
}
class Story_Path
{
public static $PROFILE = "/v1/api/story/profile";
public static $ISSTORYUSER = "/v1/api/story/isstoryuser";
public static $MYSTORIES = "/v1/api/story/mystories";
public static $MYSTORY = "/v1/api/story/mystory";
public static $DELETE_MYSTORY = "/v1/api/story/delete/mystory";
public static $POST_NOTE = "/v1/api/story/post/note";
public static $UPLOAD_MULTI = "/v1/api/story/upload/multi";
public static $POST_PHOTO = "/v1/api/story/post/photo";
public static $LINKINFO = "/v1/api/story/linkinfo";
public static $POST_LINK = "/v1/api/story/post/link";
}
class Talk_Path
{
public static $TALK_PROFILE = "/v1/api/talk/profile";
public static $TALK_TO_ME = "/v2/api/talk/memo/send";
public static $TALK_TO_ME_DEFAULT = "/v2/api/talk/memo/default/send";
}
class Push_Notification_Path
{
public static $REGISTER = "/v1/push/register";
public static $TOKENS = "/v1/push/tokens";
public static $DEREGISTER = "/v1/push/deregister";
public static $SEND = "/v1/push/send";
}
class Kakao_REST_API_Helper
{
public static $OAUTH_HOST = "https://kauth.kakao.com";
public static $API_HOST = "https://kapi.kakao.com";
private static $admin_apis;
private $access_token;
private $admin_key;
public function __construct($access_token = '')
{
if ($access_token) {
$this->access_token = $access_token;
}
self::$admin_apis = array(
User_Management_Path::$USER_IDS,
Push_Notification_Path::$REGISTER,
Push_Notification_Path::$TOKENS,
Push_Notification_Path::$DEREGISTER,
Push_Notification_Path::$SEND
);
}
public function request($api_path, $params = '', $http_method = 'GET')
{
if ($api_path != Story_Path::$UPLOAD_MULTI && is_array($params)) { // except for uploading
$params = http_build_query($params);
}
$requestUrl = ($api_path == '/oauth/token' ? self::$OAUTH_HOST : self::$API_HOST) . $api_path;
if (($http_method == 'GET' || $http_method == 'DELETE') && !empty($params)) {
$requestUrl .= '?' . $params;
}
$opts = [
CURLOPT_URL => $requestUrl,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSLVERSION => CURL_SSLVERSION_TLSv1,
];
if ($api_path != '/oauth/token') {
if (in_array($api_path, self::$admin_apis)) {
if (!$this->admin_key) {
throw new \Exception('admin key should not be null or empty.');
}
$headers = array('Authorization: KakaoAK ' . $this->admin_key);
} else {
if (!$this->access_token) {
throw new \Exception('access token should not be null or empty.');
}
$headers = array('Authorization: Bearer ' . $this->access_token);
}
$opts[CURLOPT_HEADER] = false;
$opts[CURLOPT_HTTPHEADER] = $headers;
}
if ($http_method == 'POST') {
$opts[CURLOPT_POST] = true;
if ($params) {
$opts[CURLOPT_POSTFIELDS] = $params;
}
} elseif ($http_method == 'DELETE') {
$opts[CURLOPT_CUSTOMREQUEST] = 'DELETE';
}
$curl_session = curl_init();
curl_setopt_array($curl_session, $opts);
$return_data = curl_exec($curl_session);
if (curl_errno($curl_session)) {
throw new \Exception(curl_error($curl_session));
} else {
// 디버깅 시에 주석을 풀고 응답 내용 확인할 때
//print_r(curl_getinfo($curl_session));
curl_close($curl_session);
return json_decode($return_data, true);
}
}
public function set_access_token($access_token)
{
$this->access_token = $access_token;
}
public function set_admin_key($admin_key)
{
$this->admin_key = $admin_key;
}
///////////////////////////////////////////////////////////////
// User Management
///////////////////////////////////////////////////////////////
private function _create_or_refresh_access_token($params)
{
return $this->request(User_Management_Path::$TOKEN, $params, 'POST');
}
public function create_access_token($authorization_code)
{
$this->AUTHORIZATION_CODE = $authorization_code;
$params = [
'grant_type' => 'authorization_code',
'client_id' => $this->REST_KEY,
'redirect_uri' => $this->REDIRECT_URI,
'code' => $this->AUTHORIZATION_CODE
];
$result = $this->_create_or_refresh_access_token($params);
return $result;
}
public function refresh_access_token($refresh_token)
{
$params = [
'grant_type' => 'refresh_token',
'client_id' => $this->REST_KEY,
'refresh_token' => $refresh_token
];
$result = $this->_create_or_refresh_access_token($params);
return $result;
}
public function signup()
{
return $this->request(User_Management_Path::$SIGNUP);
}
public function unlink()
{
return $this->request(User_Management_Path::$UNLINK);
}
public function logout()
{
return $this->request(User_Management_Path::$UNLINK);
}
public function me()
{
return $this->request(User_Management_Path::$ME);
}
public function meWithEmail()
{
$params = [
'property_keys' => '[' .
'"id",' .
'"kakao_account.has_email","kakao_account.email",' .
'"kakao_account.is_email_valid","kakao_account.is_email_verified"' .
']'
];
return $this->request(User_Management_Path::$ME);
}
public function update_profile($params)
{
return $this->request(User_Management_Path::$UPDATE_PROFILE, $params, 'POST');
}
public function user_ids()
{
return $this->request(User_Management_Path::$USER_IDS);
}
///////////////////////////////////////////////////////////////
// Kakao Story
///////////////////////////////////////////////////////////////
public function isstoryuser()
{
return $this->request(Story_Path::$ISSTORYUSER);
}
public function story_profile()
{
return $this->request(Story_Path::$PROFILE);
}
///////////////////////////////////////////////////////////////
// Kakao Talk
///////////////////////////////////////////////////////////////
public function talk_profile()
{
return $this->request(Talk_Path::$TALK_PROFILE);
}
public function talk_to_me_default($req)
{
$params = [
'template_object' => json_encode($req)
];
return $this->request(Talk_Path::$TALK_TO_ME_DEFAULT, $params, 'POST');
}
///////////////////////////////////////////////////////////////
// API Test
///////////////////////////////////////////////////////////////
private $REST_KEY = KakaoKey::REST_KEY; // 디벨로퍼스의 앱 설정에서 확인할 수 있습니다.
private $REDIRECT_URI = KakaoKey::REDIRECT_URI; // 설정에 등록한 사이트 도메인 + redirect uri
private $AUTHORIZATION_CODE = ''; // 동의를 한 후 발급되는 code
private $REFRESH_TOKEN = '';
}