고객 연락처 업데이트 개발 문서
목적
이 문서는 플랫폼(언어 및 프레임워크)에 관계없이 Sidetalk AI 채팅 서비스를 웹사이트에 연동하는 방법을 설명합니다
1. 기본 설치 (Client-Side)
웹사이트의 HTML 코드 내에 스크립트를 로드하고 초기화 함수를 호출합니다. 모든 페이지 또는 채팅 버튼이 노출될 페이지의
</head> 태그 혹은 상황에 따라서 </body> 태그 직전에 삽입하십시오.1.1 스크립트 로드
HTML
<script src="https://pages.sidetalk.ai/sidetalk.js"></script>
1.2 초기화 코드
HTML
<script>
SidetalkAI('init', {
siteKey: 'YOUR_SITE_KEY', // [필수] 관리자 페이지에서 발급받은 Site Key
buttonText: '문의하기', // 버튼 텍스트
buttonBottom: '20px', // 하단 여백
buttonRight: '20px', // 우측 여백
// userInfo: { ... } // 로그인 사용자 정보 (아래 2번 항목 참조)
});
</script>
2. 회원 정보 연동 (User Info)
로그인한 사용자의 정보를 상담창에 자동 연동하기 위해
userInfo 객체를 설정합니다. 보안을 위해 서명(Signature) 값이 반드시 포함되어야 합니다.2.1 userInfo 객체 구조
초기화 코드의
userInfo 속성에 할당할 데이터 구조입니다.| 필드명 | 타입 | 필수 | 설명 |
|---|---|---|---|
| signature | String | O | 서버에서 생성된 보안 인증 토큰 (하단 생성 방법 참조) |
| member_id | String | O | 회원 고유 ID (DB PK 등) |
| user_name | String | X | 회원 이름 |
| user_email | String | X | 회원 이메일 |
| user_phone | String | X | 회원 전화번호 |
3. 서명(Signature) 생성 방법 (Server-Side)
signature는 클라이언트가 아닌 서버에서 생성해야 합니다. Sign Key가 브라우저에 노출되지 않도록 주의하십시오.3.1 생성 알고리즘
- 준비 데이터:
Sign Key: Sidetalk 관리자 설정의 비밀키User Agent: 클라이언트의 User-Agent 헤더 값Expires In: 토큰 만료 시간 (Unix Timestamp, 현재시간 + 3600초 권장)
- 문자열 결합 (순서 엄수):
member_id+user_name+user_email+user_phone+user_agent+sign_key+expires_in - 암호화: 결합된 문자열을
Sign Key를 이용해 HMAC-SHA256 알고리즘으로 해싱 - 인코딩: 결과 데이터를 JSON으로 만든 후 Base64로 인코딩
3.2 언어별 코드 예제
[PHP]
PHP
<?php
function getSidetalkSignature($id, $name, $email, $phone, $signKey) {
$userAgent = $_SERVER['HTTP_USER_AGENT'];
$expiresIn = time() + 3600; // 1시간 유효
// 데이터 결합
$data = $id . $name . $email . $phone . $userAgent . $signKey . $expiresIn;
// HMAC SHA256
$token = hash_hmac('sha256', $data, $signKey);
// JSON -> Base64
$json = json_encode(['expires_in' => $expiresIn, 'token' => $token]);
return base64_encode($json);
}
?>
[Node.js]
JavaScript
const crypto = require('crypto');
function getSidetalkSignature(userInfo, userAgent, signKey) {
const { member_id, user_name, user_email, user_phone } = userInfo;
const expiresIn = Math.floor(Date.now() / 1000) + 3600;
const data = `${member_id}${user_name}${user_email}${user_phone}${userAgent}${signKey}${expiresIn}`;
const token = crypto.createHmac('sha256', signKey)
.update(data)
.digest('hex');
const jsonStr = JSON.stringify({ expires_in: expiresIn, token: token });
return Buffer.from(jsonStr).toString('base64');
}
[TypeScript]
TypeScript
import * as crypto from 'crypto';
interface SidetalkUser {
member_id: string;
user_name: string;
user_email: string;
user_phone: string;
}
function getSidetalkSignature(user: SidetalkUser, userAgent: string, signKey: string): string {
const expiresIn = Math.floor(Date.now() / 1000) + 3600;
const data = `${user.member_id}${user.user_name}${user.user_email}${user.user_phone}${userAgent}${signKey}${expiresIn}`;
const token = crypto.createHmac('sha256', signKey)
.update(data)
.digest('hex');
const jsonStr = JSON.stringify({ expires_in: expiresIn, token: token });
return Buffer.from(jsonStr).toString('base64');
}
[Python]
Python
import hmac
import hashlib
import json
import base64
import time
def get_sidetalk_signature(user_info, user_agent, sign_key):
expires_in = int(time.time()) + 3600
data = "{}{}{}{}{}{}{}".format(
user_info['member_id'],
user_info['user_name'],
user_info['user_email'],
user_info['user_phone'],
user_agent,
sign_key,
expires_in
)
token = hmac.new(
sign_key.encode('utf-8'),
data.encode('utf-8'),
hashlib.sha256
).hexdigest()
json_str = json.dumps({'expires_in': expires_in, 'token': token})
return base64.b64encode(json_str.encode('utf-8')).decode('utf-8')
4. 전체 통합 예시 (HTML)
서버에서 생성한 데이터를 HTML 템플릿에 주입하여 최종적으로 렌더링합니다.
HTML
<!DOCTYPE html>
<html lang="ko">
<body>
<!-- 웹사이트 콘텐츠 -->
<!-- Sidetalk Script -->
<script src="https://pages.sidetalk.ai/sidetalk.js"></script>
<script>
// 서버 사이드 변수 주입 (예시)
// 실제 구현 시에는 사용하는 템플릿 엔진 문법(PHP echo, EJS <%= %> 등)을 사용하세요.
const isLoggedIn = true;
const initOptions = {
siteKey: 'YOUR_SITE_KEY',
buttonText: '상담하기',
buttonBottom: '20px',
buttonRight: '20px'
};
if (isLoggedIn) {
initOptions.userInfo = {
signature: "SERVER_GENERATED_SIGNATURE_STRING", // 서버에서 생성된 값
member_id: "user_123",
user_name: "홍길동",
user_email: "hong@test.com",
user_phone: "010-1234-5678"
};
}
SidetalkAI('init', initOptions);
</script>
</body>
</html>
5. 주의사항
- User-Agent 일치: 서명 생성 시 사용한 User-Agent와 실제 브라우저의 User-Agent가 다를 경우 인증에 실패할 수 있습니다.
- Sign Key 보안:
Sign Key는 절대 HTML 소스나 클라이언트 자바스크립트에 노출되어서는 안 됩니다. - 데이터 순서: 서명 생성 시 문자열 결합 순서가 틀리면 인증되지 않습니다. (
id->name->email->phone->ua->key->expire)
