이용안내

미니톡 이용과 관련된 도움말을 제공합니다.
미니톡 채팅위젯 회원 연동하기

웹페이지에 삽입된 미니톡 채팅위젯에 기존 홈페이지의 사용하던 회원시스템과 연동하는 방법에 대해 설명합니다.

이 매뉴얼 문서에서는 미니톡 클라이언트의 개발언어와 동일한 PHP 예제로 설명을 하지만, ASP, JSP, PYTHON 등 기존 사용하시던 언어에 맞게 암호화관련 함수를 수정하여 연동하실 수 있습니다.

회원인증에 사용하는 암호화 방식은 ZERO_PADDING 을 이용한 AES-256-CBC 암호화 방식을 사용합니다.


/classes/widget.php 파일 이용하기

미니톡 클라이언트가 설치되어 있는 서버와 동일한 환경에서 미니톡 채팅위젯을 사용할 경우, 미니톡 클라이언트 폴더의 /classes/widget.php 파일을 INCLUDE 하여 손쉽게 연동이 가능합니다.

<?php
REQUIRE_ONCE './classes/widget.php'; // 해당 파일의 위치에 맞게 경로는 알맞게 수정하여 줍니다.

$nickname = $mb['mb_name'] ? $mb['mb_name'] : ''; // 회원이름이 담긴 변수
$nickcon = ''; // 회원 닉이미지 전체경로
$photo = ''; // 회원 사진 전체경로
$level = 1; // 레벨은 1~9까지 정의할 수 있으며 9 레벨이 관리자권한을 의미합니다.
// 유저의 추가정보가 있다면 배열형식으로 담을 수 있습니다.
$extras = array(
'key'=>'value'
);
?>
<script type="text/javascript" src="[미니톡 클라이언트가 설치된 경로]/scripts/minitalk.js"></script>
<script type="text/javascript">
new Minitalk({
    id:"MinitalkPreview", // 페이지내 유니크한 랜덤한 값을 입력합니다.
    channel:"example", // 미니톡 클라이언트 관리자에서 생성한 채널명
    width:"100%",
    height:"100%",
    templet:"default",
    usercode:"<?php echo MinitalkUserCode($nickname,$level,$nickcon,$photo,$extras); ?>"
});
</script>


$nickname 변수는 닉네임은 일부 특수문자(#, @) 밑 따옴표(", ') 그리고 공백을 제외한 30자 이내의 문자로 설정하셔야 합니다.

$nickcon 변수에는 닉이미지로 사용할 이미지의 전체주소 (https://www.yourdomain.com/member/nickname.gif 등) 로 설정하거나, 회원아이콘 및 회원닉네임을 모두 표현하고자 할 때에는 URL 주소 및 {NICKNAME} 치환자를 이용하여, 지정할 수 있습니다.

$nickcon = 'https://www.yourdomain.com/member/icon.gif,{NICKNAME}';

이렇게 설정할 경우 {NICKNAME}부분이 접속자 닉네임으로 치환되고, 접속자 닉네임 앞에 icon.gif 이미지가 추가되어 나오게 됩니다.



암호화코드 함수 직접 작성하기

이 문서에서는 PHP 로 예제를 설명하고 있지만, ZERO_PADDING 을 이용한 AES-256-CBC 암호화 방식은 표준 암호화방식이므로, 다양한 언어에서 지원되고 있습니다.

사용하고 있는 프로그래밍 언어에 따라 아래 함수를 직접 작성하여 사용하시면 됩니다.

<?php
/**
 * 미니톡 클라이언트를 설치할 때 입력한 암호화키를 입력합니다.
 * (서버호스팅의 경우 나의 서비스 관리 페이지에서 클라이언트 비밀키를 사용합니다.)
 */
$_MINITALK_KEY = '미니톡 클라이언트를 설치할 때 입력한 암호화키';

/**
 * 복호화가 가능한 방식(AES-256-CBC)으로 문자열을 암호화한다.
 *
 * @param string $value 암호화할 문자열
 * @return string $ciphertext
 */
function MinitalkEncoder($value) {
    global $_MINITALK_KEY;
   
    $key = md5($_MINITALK_KEY);
    $padSize = 16 - (strlen($value) % 16);
    $value = $value.str_repeat(chr($padSize),$padSize);
   
    $output = openssl_encrypt($value,'AES-256-CBC',$key,OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING,str_repeat(chr(0),16));
   
    return base64_encode($output);
}

/**
 * 복호화가 가능한 방식(AES-256-CBC)으로 암호화된 문자열을 복호화한다.
 *
 * @param string $value 암호화된 문자열
 * @return string $plaintext
 */
function MinitalkDecoder($value) {
    global $_MINITALK_KEY;
   
    $key = md5($_MINITALK_KEY);
    $value = base64_decode(str_replace(' ','+',$value));
   
    $output = openssl_decrypt($value,'AES-256-CBC',$key,OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING,str_repeat(chr(0),16));
    if ($output === false) return false;
   
    $valueLen = strlen($output);
    if ($valueLen % 16 > 0) return false;

    $padSize = ord($output[$valueLen - 1]);
    if (($padSize < 1) || ($padSize > 16)) return false;

    for ($i=0;$i<$padSize;$i++) {
        if (ord($output[$valueLen - $i - 1]) != $padSize) return false;
    }
   
    return substr($output,0,$valueLen-$padSize);
}


/**
 * 클라이언트 아이피를 가져온다.
 * Proxy 서버를 통해 접속하였을 경우에도 가급적 실제 아이피를 가져온다.
 *
 * @return string $ip
 */
function GetClientIp() {
    return isset($_SERVER['HTTP_X_FORWARDED_FOR']) == true ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR'];
}

/**
 * 유저코드를 가져온다.
 *
 * @param string $nickname 닉네임(필수)
 * @param int $level 권한레벨 (1~9, 9 : 최고관리자 / 기본값 : 1)
 * @param string $nickcon 닉이미지 (옵션)
 * @param string $photo 프로필사진 (옵션)
 * @param any[] $extras 유저 추가정보 (옵션, key-value 배열만 가능)
 * @return string $userCode 유저코드
 */
function MinitalkUserCode($nickname,$level=1,$nickcon=null,$photo=null,$extras=array()) {
    $user = array(
        'nickname'=>$nickname,
        'level'=>intval($level),
        'nickcon'=>$nickcon ? $nickcon : null,
        'photo'=>$photo ? $photo : null,
        'extras'=>count($extras) > 0 ? $extras : null,
        'ip'=>GetClientIp()
    );
   
    return MinitalkEncoder(json_encode($user,JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES));
}
?>
최종수정일 :