13.1개요
본 문서는 WeChat Biz 상담톡(이하, 상담톡) API를 이용하여, 상담을 요청한 사용자와의 채팅에서 메시지를 수신/발신하기 위한 API 문서이다.
본 문서는 https 프로토콜을 통해 데이터를 json 형식으로 가공하여 GET, POST method를 사용하여 전송하고, json형식의 결과 데이터를 parsing하여 처리할 수 있음을 전제로 작성되었다.
13.2용어 정의
13.2.1공중 계정(Sender Key)
WeChat 의 비즈니스용 계정이다.
카카오톡 채널 홈페이지(https://mp.weixin.qq.com/)를 통해 개설 할수 있다.
13.2.2상담 세션(Session)
상담원이 고객에게 메시지를 전송하기 위한 필수 조건으로, 세션이 연결된 상태에서만 상담원은 고객에게 메시지를 전송할 수 있다.
고객의 상담 요청이 WeChat Biz 서버에 정상적으로 전송되면 세션이 생성과 동시에 시작된다.
고객은 상담 버튼을 클릭하여 상담을 요청하거나, 채팅방에서 메시지를 전송하여 상담 요청을 할 수 있다.
상담원이 상담 종료를 요청하면 상담 세션은 종료된다.
13.2.3사용자 키 (User Key)
특정 WeCHat 사용자를 구분하기 위한 key로, 고객이 상담을 요청한 시점에 제공된다.
User Key는 공중계정별로 사용자에 대해 다르게 발급된다. 따라서 User Key는 해당 공중 계정에 대해서만 유효하다.
13.2.4상담원의 정의
상담원은 상담톡 API를 이용하는 주체를 의미하며 반드시 사람을 지칭하는 것은 아닙니다.
상담을 위하여 유저에게 상담원(사람)이 배정 되었는지 여부는 알 수 없습니다.
13.2.5상담 메시지
상담원 유저한테 보낸 대화 메시지, 유저가 상담원한테 보낸 메시지 모두 상담 메시지로 합니다.
13.3선결 조건
메시지 API를 사용하여 메시지 전송을 대행하기 위해 아래의 조건이 선결되어야 한다.
WeChat 공중 계정에 가입되어 있어야 한다.
13.4API 스펙
13.4.1[서버] sip 서버
13.4.2메시지 발신
- [Request]
POST /chat/write
- [Parameter]
키 | 타입 | 필수 | 설명 |
---|---|---|---|
user_key | text(100) | Y | 사용자 키 |
sender_key | text(40) | Y | 발신 프로필 키 |
message_type | text(10) | N | 메시지 타입 (text : 텍스트, image: 이미지, video: 비디오파일, voice: 음성파일, music : 음악URL, news: 뉴스정보, mpnews: 미디어뉴스, msgmenu: 메뉴, wxcard: 쿠폰, BS:봇정보) |
message | json or text | Y/N | 사용자에게 전달할 메시지 message_type이 text 인 경우는 text 로 입력한다. ex) "message" : "안녕하세요." message_type이 text 가 아닌 경우는 json Object 로 입력한다. ex) "message" : { "media_id":"MEDIA_ID" } 상세 설명은 아래 [Parameter] - message 를 참조 |
bot_id | text(128) | N | 넥서스 시나리오 봇 아이디(콜아이디) |
bot_name | text(100) | N | 넥서스 시나리오 봇 이름 |
bot_status | text(10) | N | START: 시작 메시지, ING: 채팅중 , CLOSE:종료, TIMEOUT: 고객 응답 없음, CONNECT: 상담원 연결, BUSY:대기 상담원 없음. EXPIRE: 고객상담종료 |
- [Parameter > Message]
이미지 (message_type : "image")
키 | - | 타입 | 필수 | 설명 |
---|---|---|---|---|
message | - | json | - | json Object |
media_id | text | Y | 미디어 ID (파일 업로드시 반환 되는 값) |
- 예시
{ "media_id": "MEDIA_ID" }
음성 (message_type : "voice")
키 | - | 타입 | 필수 | 설명 |
---|---|---|---|---|
message | - | json | - | json Object |
media_id | text | Y | 미디어 ID (파일 업로드시 반환 되는 값) |
- 예시
{ "media_id": "MEDIA_ID" }
비디오 (message_type : "video")
키 | - | 타입 | 필수 | 설명 |
---|---|---|---|---|
message | - | json | - | json Object |
media_id | text | Y | 미디어 ID (파일 업로드시 반환 되는 값) | |
thumb_media_id | text | |||
title | text | |||
description | text |
- 예시
{ "media_id": "MEDIA_ID", "thumb_media_id": "MEDIA_ID", "title": "TITLE", "description": "DESCRIPTION" }
음악 (message_type : "music")
키 | - | 타입 | 필수 | 설명 |
---|---|---|---|---|
message | - | json | - | json Object |
title | text | 타이틀 | ||
description | text | 상세 설명 | ||
musicurl | text | 음악 URL | ||
hqmusicurl | text | HQ 음악 URL | ||
thumb_media_id | text | Thumb 이미지 미디어 ID |
- 예시
{ "title": "MUSIC_TITLE", "description": "MUSIC_DESCRIPTION", "musicurl": "MUSIC_URL", "hqmusicurl": "HQ_MUSIC_URL", "thumb_media_id": "THUMB_MEDIA_ID" }
NEWS (message_type : "news")
키 | - | 타입 | 필수 | 설명 | |
---|---|---|---|---|---|
message | - | json | - | json Object | |
articles | array | ||||
title | text | 타이틀 | |||
description | text | 상세 설명 | |||
url | text | NEWS URL | |||
picurl | text | NEWS 이미지 URL |
- 예시
{ "articles": [ { "title": "Happy Day", "description": "Is Really A Happy Day", "url": "URL", "picurl": "PIC_URL" } ] }
One Article (message_type : "mpnews")
키 | - | 타입 | 필수 | 설명 |
---|---|---|---|---|
message | - | json | - | json Object |
media_id | text | Y | 미디어 ID (Article 업로드시 반환 되는 값) |
- 예시
{ "media_id": "MEDIA_ID" }
메뉴 (message_type : "msgmenu")
키 | - | 타입 | 필수 | 설명 | |
---|---|---|---|---|---|
message | - | json | - | json Object | |
head_content | text | Y | 타이틀 | ||
list | array | Y | 버튼 배열 | ||
id | text | Y | 버튼 ID | ||
cotent | text | Y | 버튼 이름 | ||
tail_content | text | 하단 타이틀 |
- 예시
{ "head_content": "Are you satisfied with the service? ", "list": [ { "id": "101", "content": "Satisfied" }, { "id": "102", "content": "Dissatisfied" } ], "tail_content": "Looking forward to your visit again" }
버튼을 사용자가 클릭하게 될 경우 메시지가 수신된다.
자세한 내용은 메시지 수신 API 을 참조 .
- [Response]
키 | 타입 | 필수 | 설명 |
---|---|---|---|
code | integer | Y | 처리 결과 코드 (200은 정상 / 나머지는 오류) |
message | text | N | 성공일 경우 "OK" 실패일 경우는 각각의 메시지 |
13.4.3상담톡 발신 메시지 타입
13.4.3.1텍스트 타입
텍스트 타입의 경우 텍스트 메시지 발송만 가능하다.
텍스트 글자수는 1000자 제한
13.4.3.2미디어 임시 업로드
3일 간 서버에 저장 됩니다.
3일 이후에는 만료 됩니다.
- [Request]
POST /media/upload
- [Header]
Content-type: multipart/form-data
- [Parameter]
키 | 타입 | 필수 | 설명 |
---|---|---|---|
sender_key | text | Y | 발신프로필 키 |
media | binary | Y | 업로드할 미디어 파일 |
type | text | N | image : 이미지 voice : 음성 videos : 비디오 thumb : thumbnail 이미지 |
- 미디어 타입
Image: 10 MB. PNG, JPEG, JPG, and GIF formats are supported.
Voice: 2 MB. The maximum length is 60s. AMR and MP3 formats are supported.
Video: 10 MB. The MP4 format supported.
Thumbnail: 64 KB. The JPG format supported.
- [Response]
키 | 타입 | 필수 | 설명 |
---|---|---|---|
type | text | Y | 업로드 type |
media_id | text | Y | media ID |
created_da | timestamp | Y | 업로드 timestamp |
13.4.3.3이미지 업로드(Article 용)
Article 의 본문에 사용되는 이미지를 업로드 한다.
저장 개수 : 5,000 images (공중계정별 )
JPG/PGN 만 지원
1 MB 미만
- [Request]
POST /material/upload/img
- [Header]
Content-type: multipart/form-data
- [Parameter]
키 | 타입 | 필수 | 설명 |
---|---|---|---|
sender_key | text | Y | 발신프로필 키 |
media | binary | Y | 업로드할 파일 |
- [Response]
키 | 타입 | 설명 |
---|---|---|
url | text | 업로드된 이미지 URL |
13.4.3.4미디어 업로드
추가되면 URL과 함께 새로운 영구 이미지가 반환된다.
외부 도메인 이름에서 사용되는 경우 이미지가 숨겨짐
저장한도 : 기사 및 이미지는 5,000개, 기타 유형의 자산은 1,000개
- 지원 이미지 및 용량
Image: 10 MB. BMP, PNG, JPEG, JPG, and GIF formats are supported.
Voice: 2 MB. The maximum length is 60s. MP3, WMA, WAV, and AMR formats are supported.
Video: 10 MB. The MP4 format supported.
Thumbnail: 64 KB. The JPG format supported.
- [Request]
POST /media/upload
- [Header]
Content-type: multipart/form-data
- [Parameter]
키 | 타입 | 필수 | 설명 |
---|---|---|---|
sender_key | text | Y | 발신프로필 키 |
media | binary | Y | 업로드할 미디어 파일 |
type | text | N | image : 이미지 voice : 음성 videos : 비디오 thumb : thumbnail 이미지 |
- [Response]
키 | 타입 | 필수 | 설명 |
---|---|---|---|
type | text | Y | 업로드 type |
media_id | text | Y | media ID |
created_da | timestamp | Y | 업로드 timestamp |
13.4.4블랙리스트
블랙리스트를 관리 할수 있다.
블랙리스트를 조회, 등록 , 삭제 할수 있다.
13.4.4.1조회
- [Request]
GET
한번에 최대 10,000 명을 조회할수 있다.
10,000명 이상일 경우 begin_openid 에 마지막 조회된 사용자를 넣어서 반복적으로 조회 할수 있다.
- [Parameter]
키 | 타입 | 필수 | 설명 |
---|---|---|---|
begin_openid | text | Y | 시작 사용자 키 Default : "" |
- 예시
{ "begin_openid": "OPENID1" }
- [Response]
키 | 타입 | 설명 | |
---|---|---|---|
total | integer | 총 블랙리스트 수 | |
count | integer | 가져온 블랙리스트 수 | |
data | json Object | ||
openid | array | ||
next_openid | text | 다음 조회시 사용하는 사용자 ID |
- 예시
{ "total":23000, "count":10000, "data":{" openid":[ "OPENID1", "OPENID2", ..., "OPENID10000" ] }, "next_openid":"OPENID10000" }
13.4.4.2등록
- [Request]
POST
- [Parameter]
키 | 타입 | 필수 | 설명 |
---|---|---|---|
openid_list | array | Y | 사용자 키 배열 |
- 예시
{ "openid_list": [ "OPENID1", "OPENID2" ] }
- [Response]
키 | 타입 | 필수 | 설명 |
---|---|---|---|
code | integer | Y | 처리 결과 코드 (0은 정상 / 나머지는 오류) |
message | text | N | 오류 메시지 (오류시 존재하는 값) |
13.4.4.3삭제
- [Request]
POST
- [Parameter]
키 | 타입 | 필수 | 설명 |
---|---|---|---|
openid_list | array | Y | 사용자 키 배열 |
- 예시
{ "openid_list": [ "OPENID1", "OPENID2" ] }
- [Response]
키 | 타입 | 필수 | 설명 |
---|---|---|---|
code | integer | Y | 처리 결과 코드 (0은 정상 / 나머지는 오류) |
message | text | N | 오류 메시지 (오류시 존재하는 값) |
13.4.5사용자 정보
버튼등을 통해 채팅방 입장시 사용자 정보가 있을경우 가져올수 있다.
시용자 정보 인증이 먼저 이루어져야 정상적으로 메시지는 상담원에게 보낼수 있다.
13.4.5.1사용자 정보 조회
- [Request]
GET /user/info
- [Parameter]
키 | 타입 | 필수 | 설명 |
---|---|---|---|
sender_key | text(40) | Y | 발신 프로필 키 |
user_key | text(20) | Y | 사용자 키 |
- [Response]
키 | 타입 | 필수 | 설명 |
---|---|---|---|
code | text | Y | 처리 결과 코드 (200은 정상 / 나머지는 오류) |
message | text | N | 처리 메시지 |
sender_key | text | N | 발신 프로필 키 |
user_key | text | N | 사용자 키 |
tel_number | text(20) | N | 사용자 전화번호 |
user_name | text(100) | N | 사용자 이름 |
user_id | text(100) | N | 사용자 ID |
agree_type | int | N | 사용자 인증 구분 0: 지속인증(기본값), 1: 1회성 인증 |
agree_date | text | N | 동의일자: "2019-10-23 17:03:35" |
- [Example]
http://127.0.0.1:8080/user/info?sender_key=da2b0c0d28805157d5355b60beb9493a9b3e5b15&user_key=d14zPgU4yqoO&
{ "code": "200", "message": "OK", "user_key": "d14zPgU4yqoO", "sender_key": "da2b0c0d28805157d5355b60beb9493a9b3e5b150", "user_id": "", "user_name": "", "tel_number": "1112323", "agree_type": 0, "agree_date": "2022-05-11 15:40:04" }
13.4.5.2사용자 정보 인증
- [Request]
POST /user/auth
- [Parameter]
키 | 타입 | 필수 | 설명 |
---|---|---|---|
sender_key | text | Y | 발신 프로필 키 |
user_key | text | Y | 사용자 키 |
tel_number | text(20) | Y | 사용자 전화번호 |
user_name | text(100) | N | 사용자 이름 |
user_id | text(100) | N | 사용자 ID |
agree_type | int | N | 사용자 인증 구분 0: 지속인증(기본값), 1: 1회성 인증 |
- [Response]
키 | 타입 | 필수 | 설명 |
---|---|---|---|
code | text | Y | 처리 결과 코드 (200은 정상 / 나머지는 오류) |
message | text | N | 응답 메시지 |
- [Example]
curl -X POST -H "Content-type: application/json" \ -d '{"user_key":"d74zPgU4yqoO","sender_key":"da2b0c0d28805157d5355b60beb9493a9b3e5b15","app_user_id":null,"user_name":"장형길","user_id":"kenneth","tel_number":"01029113333" }' \ http://127.0.0.1:8080/user/auth
{ "code": "200", "message": "OK" }
13.4.5.3사용자 정보 인증 철회
- [Request]
post /user/auth/delete
- [Parameter]
키 | 타입 | 필수 | 설명 |
---|---|---|---|
sender_key | text | Y | 발신 프로필 키 |
user_key | text | Y | 사용자 키 |
- [Response]
키 | 타입 | 필수 | 설명 |
---|---|---|---|
code | text | Y | 처리 결과 코드 (200은 정상 / 나머지는 오류) |
message | text | N | 응답 메시지 |
- [Example]
curl -X POST -H "Content-type: application/json" \ -d '{"user_key":"d74zPgU4yqoO","sender_key":"da2b0c0d28805157d5355b60beb9493a9b3e5b15" }' \ http://127.0.0.1:8080/user/auth/delete
{ "code": "200", "message": "OK" }
13.4.6메지시 첨부파일 가져오기
메시지 수신시 1000자 이상의 경우 메시지가 첨부파일로 제공 된다.
메시지 첨부파일의 경우 일정시간이 이후 kakao 서버에서 파일이 삭제된다.
삭제전에 미리 저장된 첨부파일을 불러오는 API 다.
13.4.6.1첨부파일 가져오기
- [Request]
GET /message/attachment
- [Parameter]
키 | 타입 | 필수 | 설명 |
---|---|---|---|
attachment_url | text(1024) | Y | 첨부파일 URL |
13.4.7첨부파일 가져오기
일정시간이 지날경우 kakao 서버에 업로드한 파일이 삭제된다.
삭제전에 미리 저장된 첨부파일을 불러오는 API 다.
13.4.7.1첨부파일 가져오기
- [Request]
GET /message/file
- [Parameter]
키 | 타입 | 필수 | 설명 |
---|---|---|---|
file_url | text(1024) | Y | 첨부파일 URL |
13.5코드 정의
13.5.1오류 코드
code | message | 설명 |
---|---|---|
200 | 성공 | 정상코드 |
400 | Bad Request | 요청 데이터에 정상적이지 않음 |
403 | 권한없음 | 지원하지 않는 요청 |
404 | Not Found | Wecha 서버쪽 요청 실패 |
405 | 파라미터 오류 | 필수값 없음 |
508 | 내부처리 실패 | 유효한 값 없음 또는 내부 오류 |