채팅의 고객 데이터(주문, 배송, 청구서)
AI 어시스턴트가 로그인한 고객 자신의 주문 질문에 답하게 합니다. 서명된 신원과 정확히 정한 필드로 안전하게 처리하며 쇼핑몰에서 조회하거나 가져옵니다.
고객 데이터를 사용하면 AI 어시스턴트가 “내 택배는 어디에 있나요?”, “청구서가 결제되었나요?”, “지난 주문에 무엇이 있었나요?” 같은 질문에 답합니다. 로그인한 고객의 자신의 데이터만 다룹니다. 이 기능은 유료 요금제에서 제공됩니다.
데이터 보호 방식
- 브라우저의 정보는 증명이 되지 않습니다. 주문 번호, 청구서 번호, 이메일 주소, 페이지에 표시되거나 채팅에 작성된 어떤 내용도 접근 권한을 주지 않습니다. 누가 어떤 데이터를 볼 수 있는지는 운영자의 서버가 서명한 신원만으로 결정합니다.
- 번호는 필터일 뿐입니다. 고객이 주문 번호를 말하면 그 고객 자신의 주문 안에서만 조회합니다. 다른 사람의 번호로는 아무것도 반환하지 않습니다.
- 모든 필드는 운영자가 정합니다. 어시스턴트는 활성화한 필드만 받습니다. 그 밖의 정보는 쇼핑몰에서 보내더라도 도착 즉시 폐기합니다.
- 조회 시 당사에 저장하지 않습니다. 조회 방식에서는 reactive.chat이 질문마다 쇼핑몰에 요청하고 응답을 저장하지 않습니다. 가져오기 방식에서는 당사에 암호화해 저장하며 늦어도 90일 후에 삭제합니다.
- 자체 서버만 사용합니다. 데이터는 당사 AI 서버 또는 운영자의 자체 AI 노드에만 전달되며 타사 AI 서비스에는 전달되지 않습니다.
전제 조건: 본인 확인
어시스턴트는 운영자의 서버가 신원을 확인한 방문자의 고객 데이터만 사용합니다. 계정의 프로젝트 → 본인 확인에서 시크릿을 설정합니다. 시크릿은 서버에만 두고 브라우저나 스니펫에 넣어서는 안 됩니다.
서버는 로그인한 고객마다 만료 시각(최대 24시간 후)이 포함된 해시를 계산해 위젯에 전달합니다.
$userId = (string) $customer->id;
$exp = time() + 3600;
$hash = hash_hmac('sha256', $userId . '.' . $exp, getenv('RC_IDENT_SECRET'));
echo "<script>ReactiveChat('identify', { userId: " . json_encode($userId)
. ", userHash: " . json_encode($hash) . ", exp: " . $exp . " });</script>";
const crypto = require('crypto');
const exp = Math.floor(Date.now() / 1000) + 3600;
const hash = crypto.createHmac('sha256', process.env.RC_IDENT_SECRET)
.update(String(user.id) + '.' + exp).digest('hex');
// in the template: ReactiveChat('identify', { userId: '<id>', userHash: '<hash>', exp: <exp> });
exp가 없는 해시도 방문자를 확인합니다(예: 대화 기록용). 하지만 고객 데이터에는 충분하지 않습니다. 시크릿을 갱신하면 이전 시크릿은 24시간 동안 유효합니다.
이메일에도 서명하기(일정 예약과 이메일 기반 연동용). 해시 옆의 email은 서명에 포함되어야 확인된 것으로 간주합니다. userHash = HMAC-SHA256(secret, userId + "." + exp + "." + email)이며 주소는 identify에 전달하는 그대로여야 합니다. 포함하지 않으면 방문자는 로그인 상태를 유지하지만 어시스턴트는 그 주소로 일정을 예약하지 않고 연동에서도 조회하지 않습니다. 기존 userId + "." + exp 형식은 그대로 작동합니다.
조회, 가져오기 또는 둘 다
프로젝트 → 고객 데이터에서 어시스턴트의 데이터 출처를 선택합니다.
- 쇼핑몰에서 조회 – reactive.chat이 해당 질문마다 엔드포인트를 호출합니다. 데이터는 운영자 측에 남습니다. 권장 방식입니다.
- API로 가져오기 – 쇼핑몰이 고객의 주문을 reactive.chat에 보냅니다. 쇼핑몰에서 엔드포인트를 제공할 수 없을 때 유용합니다.
- 둘 다 – 먼저 가져온 데이터를 확인하고 없으면 조회합니다.
어시스턴트가 받을 수 있는 데이터
각 필드를 개별적으로 활성화합니다. 기본값은 일반적인 질문을 지원합니다.
bestellung.nummer– 주문 번호. 기본값: 항상 켜짐. 용도: 필수 – 번호 없는 주문은 허용하지 않음bestellung.datum– 주문일(YYYY-MM-DD). 기본값: 켜짐. 용도: “언제 주문했나요?”bestellung.status– 텍스트 형식의 주문 상태. 기본값: 켜짐. 용도: “주문이 발송되었나요?”bestellung.summe– 총액. 기본값: 켜짐. 용도: “얼마를 결제했나요?”bestellung.waehrung– 통화(ISO, 예: EUR). 기본값: 켜짐. 용도: 총액과 함께만 사용positionen.name– 주문 항목 이름. 기본값: 켜짐. 용도: “주문에 무엇이 있었나요?”positionen.menge– 항목별 수량. 기본값: 켜짐. 용도: “몇 개 주문했나요?”versand.dienst– 배송사. 기본값: 켜짐. 용도: “누가 택배를 배송하나요?”versand.sendungsnummer– 운송장 번호. 기본값: 켜짐. 용도: “내 택배는 어디에 있나요?”versand.status– 텍스트 형식의 배송 상태. 기본값: 켜짐. 용도: “배송 중인가요?”versand.ort– 배송지의 도시. 기본값: 꺼짐. 용도: “내 택배는 어디로 가나요?”versand.plz– 배송지의 우편번호. 기본값: 꺼짐. 용도: 위와 같음rechnung.nummer– 청구서 번호. 기본값: 켜짐. 용도: “관련 청구서는 무엇인가요?”rechnung.status– 텍스트 형식의 결제 상태. 기본값: 켜짐. 용도: “청구서가 결제되었나요?”rechnung.faellig_am– 납부 기한. 기본값: 켜짐. 용도: “언제까지 결제해야 하나요?”
비활성 필드는 어시스턴트에 도달하지 않습니다. 조회 시 폐기하고 가져오기 시 아예 저장하지 않습니다. 도시와 우편번호는 명시적으로 활성화해야만 허용됩니다. 도로명과 이름은 항상 제외됩니다.
절대 전달하지 않는 정보
다음 항목은 활성화할 수 없습니다. 쇼핑몰에서 보내면 폐기합니다.
- 도로명, 건물 번호와 추가 주소 줄
- 수취인 또는 고객 이름
- 이메일 주소와 전화번호
- IBAN, BIC, 계좌 번호와 카드 정보
- 생년월일
- 비밀번호, 토큰과 접근 키
- 세금 번호와 신분증 번호
제한
응답당 최대 주문 10개, 주문당 항목 20개, 텍스트 최대 200자, 전체 응답 최대 16 kB입니다. 알 수 없는 필드는 오류 없이 폐기합니다.
조회 엔드포인트
reactive.chat은 POST로 엔드포인트를 호출합니다.
POST https://shop.your-domain.com/rc-customer-data
Content-Type: application/json
X-RC-Zeit: 1791196400
X-RC-Signatur: <hex(HMAC_SHA256(endpoint secret, X-RC-Zeit + "." + body))>
{"user_id":"4711","anliegen":"bestellung","referenz":"2026-0815","sprache":"en","nonce":"..."}
user_id는 본인 확인으로 확인된 고객 ID이며 채팅에서 가져온 값이 아닙니다.anliegen은bestellung(주문),lieferung(배송),rechnung(청구서),retoure(반품) 또는 테스트 버튼용test입니다.referenz는 고객이 언급한 번호이거나 빈 값입니다. 이user_id의 주문 안에서만 조회합니다.
엔드포인트는 다음을 충족해야 합니다.
- 서명을 검증하고(상수 시간 비교),
X-RC-Zeit가 5분 넘게 차이 나는 요청은 거부합니다. - 지정된
user_id의 데이터만 반환합니다. - 공인 주소의 443 포트에서
https로 접근 가능해야 하며 리디렉션은 없어야 합니다. - 3초 안에 응답합니다.
응답:
{
"bestellungen": [
{
"nummer": "2026-0815", "datum": "2026-09-28", "status": "shipped",
"summe": "49.90", "waehrung": "EUR",
"positionen": [ { "name": "Balance bike blue", "menge": 1 } ],
"versand": { "dienst": "DHL", "sendungsnummer": "00340434...", "status": "out for delivery" },
"rechnung": { "nummer": "R-2026-1201", "status": "paid", "faellig_am": "2026-10-12" }
}
]
}
개발자 문서에 완전한 PHP 예제가 있습니다(kundendaten-referenz-endpunkt.php).
연결 테스트로 reactive.chat은 user_id가 rc-test, 요청 유형이 test인 요청을 엔드포인트에 보내고 결과를 표시합니다. 빈 목록이나 샘플 주문을 반환합니다.
API로 가져오기
kundendaten:schreiben 권한이 있는 API 키를 사용합니다.
PUT https://reactive.chat/v1/kundendaten/4711?project_id=123
Authorization: Bearer <API key>
Content-Type: application/json
{"bestellungen":[ ... as above ... ]}
project_id는 프로젝트 번호입니다. 워크스페이스에 프로젝트가 하나뿐이면 생략할 수 있습니다. PUT은 이 고객 ID의 모든 주문(최대 50개)을 대체합니다. DELETE /v1/kundendaten/4711?project_id=123은 제거합니다. 가져온 데이터는 당사에 암호화해 저장하며 마지막 가져오기 후 90일에 삭제합니다. 따라서 상태가 바뀔 때마다 보내는 등 변경 사항을 지속적으로 전송합니다.
로그인하지 않은 방문자
확인된 신원 없이 주문을 질문하면 어시스턴트는 아무 데이터도 조회하지 않습니다. 대신 프로젝트 → 고객 데이터에서 설정한 안내를 표시합니다. 언어별 텍스트와 선택적 로그인 링크입니다. 또는 팀에 질문을 인계합니다.
저장되는 내용
- 조회: 쇼핑몰의 응답은 어시스턴트의 답변 한 번에만 사용하며 대화나 지식 베이스에 저장하지 않습니다.
- 가져오기: 암호화하여 최대 90일 보관하며 프로젝트와 함께 삭제됩니다.
- 어시스턴트의 답변은 다른 메시지처럼 대화 기록에 표시됩니다. 팀은 대시보드에서 봅니다.
문제 해결
- 로그인한 고객에게도 로그인하라고 하는 경우:
exp가 없거나 만료되었거나 해시가 일치하지 않으면 확인된 방문자로 간주하지 않습니다. 시크릿,userId + "." + exp순서와 서버 시계를 확인합니다. - 테스트 버튼에 “허용되지 않는 주소”가 표시되는 경우: 엔드포인트는 공인 주소에서
https로 접근할 수 있어야 합니다. 내부 주소와 다른 포트는 거부됩니다. - 운영자 측 서명 오류: 서명 문자열은 엔드포인트 시크릿을 사용하는
X-RC-Zeit + "." + body입니다. 다시 인코딩한 것이 아니라 받은 그대로의 본문이어야 합니다. - 어시스턴트 답변에 필드가 없는 경우: “어시스턴트가 받을 수 있는 데이터”에서 활성화되어 있나요?
문서에서 더 알아보기
자세한 내용: 고객 데이터 엔드포인트. 모든 장은 문서에서 확인할 수 있습니다.
최종 업데이트: