Business Messages에 등록하면 테스트 에이전트를 대신하여 메시지를 수신할 수 있습니다. 해당 브랜드의 에이전트를 만들고, 확인하고, 실행한 후에 관리하는 브랜드의 메시지를 받을 수 있습니다.
고객이 내가 관리하는 에이전트에게 메시지를 보내면 Business Messages가 웹훅에 다양한 ID, 메시지 콘텐츠, 위치 정보가 포함된 JSON 페이로드를 전송합니다.
비즈니스 커뮤니케이션 개발자 콘솔 로그 페이지를 사용하여 메시지 전송 문제를 디버그하세요.
수신 메일 처리
에이전트가 사용자의 메시지를 처리하고 응답하는 방법은 비즈니스 로직에 따라 크게 달라집니다. 일반적으로 사용자 메시지에 응답하는 단계는 일관적입니다.
메시지 확인
웹훅에서 수신한 메시지를 확인하려면 웹훅으로 전송된 메시지에 유효한 HTTP 응답을 반환합니다.
전송 시간 초과, 웹훅 연결 가능성, 리디렉션 또는 권한 문제로 인해 메시지가 전송되지 않으면 Google에서 7일 동안 또는 웹훅이 메시지를 수신할 때까지 여러 번의 재시도와 함께 메시지를 저장하고 전달합니다.
Google에서 보낸 메시지인지 확인
메시지 콘텐츠를 처리하기 전에 Google에서 메시지를 보냈는지 확인해야 합니다.
수신한 메시지를 Google에서 보냈는지 확인하려면 다음 단계를 따르세요.
- 메시지의
X-Goog-Signature
헤더를 파싱합니다. 메시지 본문 페이로드의 해싱된 base64로 인코딩된 사본입니다. 클라이언트 토큰 (웹훅을 구성할 때 표시됨)을 키로 사용하여 메시지 페이로드의 바이트의 SHA512 HMAC를 만들고 결과를 base64로 인코딩합니다.
X-Goog-Signature
해시를 직접 만든 해시와 비교합니다.- 해시가 일치하면 Google에서 메시지를 보낸 것입니다.
- 해시가 일치하지 않으면 알려진 정상 메시지의 해싱 프로세스를 확인합니다. 해싱 프로세스가 올바르게 작동하고 허위로 전송되었다고 생각하는 메시지를 받는 경우 Google에 문의하세요 (Business Messages Google 계정으로 로그인해야 함).
자바, Node.js, Python의 Echo Bots GitHub 저장소에서 메시지 확인 예시를 참조하세요.
언어 식별
사용자는 여러 위치에서 다양한 언어로 통신합니다. Business Messages는 기기의 언어 설정을 기반으로 하는 resolvedLocale
및 userDeviceLocale
필드를 사용하여 사용자의 언어 환경설정을 나타냅니다.
현지화 및 언어를
참고하세요.
가능한 경우 사용자의 언어 환경설정에 따라 메시지를 라우팅하고 응답을 작성합니다.
컨텍스트에 따라 메시지 라우팅
메시지 컨텍스트는 사용자가 찾고 있는 정보의 종류를 알려줍니다.
예를 들어 사용자가 placeId
값이 포함된 메시지를 보내는 경우 특정 위치 (placeId
로 식별됨)에 메시지를 전송했으며 위치별 질문을 할 가능성이 높습니다. 마찬가지로 메시지에 사용자 근처의 위치를 식별하는 nearPlaceId
값이 있는 경우 사용자는 위치별 정보를 알고 싶어 하지만 상담사는 대화를 시작하기 전에 사용자가 채팅하려는 위치를 확인해야 합니다.
메시지의 컨텍스트 정보를 사용하여 메시지를 보내기에 가장 적합한 위치로 메시지를 라우팅합니다.
- 메시지가 새 대화에 있고 일반적인 질문인 경우 자동화로 답변할 수 있습니다.
- 자동화가 질문을 처리할 수 없는 경우 실제 상담사에게 라우트합니다.
- 메시지 언어가 에이전트의 기본 언어와 일치하지 않으면 해당 언어를 지원할 수 있는 실제 에이전트로 메시지를 라우팅합니다.
- 특정 위치와 관련된 질문인 경우 해당 위치에 관한 정보가 있는 사용자에게 라우트합니다.
- 메시지가 진행 중인 대화의 경우 대화에 참여하는 실시간 상담사에게 라우팅합니다.
사용자가 전송한 메시지 유형 식별
사용자는 다음 세 가지 유형의 메시지를 보낼 수 있습니다.
- 문자 메시지는 자유 형식의 응답입니다.
- 이미지 메시지에는 사용자가 업로드한 이미지의 서명된 URL이 포함됩니다.
- 제안 메시지에는 사용자가 탭한 추천 제안 또는 제안 응답의 포스트백 데이터와 텍스트가 포함됩니다.
메시지 콘텐츠 처리
에이전트가 자동화를 사용하는 경우 사용자 메시지의 콘텐츠는 에이전트의 로직과 대화의 다음 응답을 안내해야 합니다.
사용자 의도를 식별하는 가장 쉬운 방법은 추천된 답장이나 추천 작업의 포스트백 데이터를 사용하는 것입니다. 추천 텍스트와 관련된 텍스트와 관계없이 포스트백 데이터는 컴퓨터가 읽을 수 있습니다.
사용자가 문자 메시지를 보내면 에이전트가 지원되는 키워드에 대한 응답을 파싱하거나 자연어 이해 (예: Dialogflow 통합)를 사용하여 사용자의 메시지를 처리하고 경로를 파악할 수 있습니다.
에이전트가 사용자의 메시지에 응답하는 방법을 모르는 경우 오류 상태로 응답하고 사용자에게 추가 정보를 요청하거나 다른 방식으로 입력을 요청하거나 대화를 실제 상담사에게 넘겨 대화를 계속 진행해야 합니다.
사용자에게 응답하기
에이전트가 자동화 또는 실시간 에이전트를 통해 올바른 응답을 식별하면 메시지를 전송하고 사용자와 대화를 계속 진행합니다.
응답을 작성할 때 사용자의 언어를 고려하세요. 수신하는 각 메시지의 userInfo
객체에서 값을 검색하여 응답을 추가로 맞춤설정할 수 있습니다.
메시지 유형
다음 코드는 에이전트가 메시지를 수신하는 방법을 보여줍니다.
형식 지정 및 값 정보는 UserMessage
을 참조하세요.
텍스트
사용자가 응답하는 가장 일반적인 방법은 일반 텍스트입니다. 문자 메시지의 형식은 다음과 같습니다.
{ "agent": "brands/BRAND_ID/agents/AGENT_ID", "conversationId": "CONVERSATION_ID", "customAgentId": "CUSTOM_AGENT_ID", "requestId": "REQUEST_ID", "message": { "messageId": "MESSAGE_ID", "name": "conversations/CONVERSATION_ID/messages/MESSAGE_ID", "text": "MESSAGE_TEXT", "createTime": "MESSAGE_CREATE_TIME", }, "dialogflowResponse": { "autoResponded": "BOOLEAN", "faqResponse": { "userQuestion": "USER_QUESTION", "answers": [{ "faqQuestion": "FAQ_QUESTION", "faqAnswer": "FAQ_ANSWER", "matchConfidenceLevel": "CONFIDENCE_LEVEL", "matchConfidence": "CONFIDENCE_NUMERIC", }], }, }, "context": { "entryPoint": "CONVERSATION_ENTRYPOINT", "placeId": "LOCATION_PLACE_ID", "resolvedLocale": "MATCH_OF_USER_AND_AGENT_LOCALES", "userInfo": { "displayName": "USER_NAME", "userDeviceLocale": "USER_LOCALE", }, }, "sendTime": "SEND_TIME", }
형식 지정 및 값 옵션은 Message
을 참고하세요.
이미지
사용자는 텍스트를 보내는 것 외에도 이미지를 메시지로 보낼 수 있습니다.
Business Messages는 7일 동안 서명된 URL에 공유 이미지를 저장하며 해당 URL을 메시지 페이로드의 text
필드에 포함합니다.
에이전트에 자동화가 포함된 경우 사용자가 이미지를 공유하면 자동화에서 응답하는 방법을 알아야 합니다. 실시간 에이전트의 경우 이미지가 전달되거나 메시지의 URL을 클릭할 수 있는지 확인하세요.
...
"message": {
"text": "https://storage.googleapis.com/business-messages-us/936640919331/jzsu6cdguNGsBhmGJGuLs1DS?x-goog-algorithm\u003dGOOG4-RSA-SHA256\u0026x-goog-credential\u003duranium%40rcs-uranium.iam.gserviceaccount.com%2F20190826%2Fauto%2Fstorage%2Fgoog4_request\u0026x-goog-date\u003d20190826T201038Z\u0026x-goog-expires\u003d604800\u0026x-goog-signedheaders\u003dhost\u0026x-goog-signature\u003d89dbf7a74d21ab42ad25be071b37840a544a43d68e67270382054e1442d375b0b53d15496dbba12896b9d88a6501cac03b5cfca45d789da3e0cae75b050a89d8f54c1ffb27e467bd6ba1d146b7d42e30504c295c5c372a46e44728f554ba74b7b99bd9c6d3ed45f18588ed1b04522af1a47330cff73a711a6a8c65bb15e3289f480486f6695127e1014727cac949e284a7f74afd8220840159c589d48dddef1cc97b248dfc34802570448242eac4d7190b1b10a008404a330b4ff6f9656fa84e87f9a18ab59dc9b91e54ad11ffdc0ad1dc9d1ccc7855c0d263d93fce6f999971ec79879f922b582cf3bb196a1fedc3eefa226bb412e49af7dfd91cc072608e98"
}
...
형식 지정 및 값 옵션은 Message
을 참고하세요.
제안사항
추천 답장 및 추천 작업을 통해 사용자는 탭 한 번으로 응답하거나 작업을 실행할 수 있습니다. 사용자가 추천을 탭하면 에이전트는 추천 텍스트와 포스트백 데이터가 포함된 페이로드를 수신합니다.
추천 메시지의 형식은 다음과 같습니다.
{ "agent": "brands/BRAND_ID/agents/AGENT_ID", "conversationId": "CONVERSATION_ID", "customAgentId": "CUSTOM_AGENT_ID", "requestId": "REQUEST_ID", "suggestionResponse": { "message": "conversations/CONVERSATION_ID/messages/MESSAGE_ID", "postbackData": "POSTBACK_DATA", "createTime": "RESPONSE_CREATE_TIME", "text": "SUGGESTION_TEXT", "suggestionType": "SUGGESTION_TYPE", } "context": { "entryPoint": "CONVERSATION_ENTRYPOINT", "placeId": "LOCATION_PLACE_ID", "resolvedLocale": "MATCH_OF_USER_AND_AGENT_LOCALES", "userInfo": { "displayName": "USER_NAME", "userDeviceLocale": "USER_LOCALE", }, }, "sendTime": "SEND_TIME", }
형식 지정 및 값 옵션은 SuggestionResponse
을 참고하세요.
인증 요청
인증 요청 제안을 사용하면 사용자가 OAuth 제공업체로 로그인하여 에이전트에 ID 세부정보를 제공하거나 에이전트가 사용자를 대신하여 작업을 수행할 수 있습니다. OAuth로 인증을 참조하세요.
사용자가 지정된 OAuth 제공업체로 로그인하면 에이전트는 승인 코드가 포함된 페이로드를 수신합니다. 사용자가 로그인에 실패하면 에이전트가 오류 세부정보가 포함된 페이로드를 수신합니다.
인증 요청 메시지의 형식은 다음과 같습니다.
{ "agent": "brands/BRAND_ID/agents/AGENT_ID", "conversationId": "CONVERSATION_ID", "customAgentId": "CUSTOM_AGENT_ID", "requestId": "REQUEST_ID", "authenticationResponse": { "code": "AUTHORIZATION_CODE", "redirect_uri": "REDIRECT_URI", "errorDetails": { "error": "ERROR", "errorDescription": "ERROR_DESCRIPTION", }, } "context": { "entryPoint": "CONVERSATION_ENTRYPOINT", "placeId": "LOCATION_PLACE_ID", "resolvedLocale": "MATCH_OF_USER_AND_AGENT_LOCALES", "userInfo": { "displayName": "USER_NAME", "userDeviceLocale": "USER_LOCALE", }, }, "sendTime": "SEND_TIME", }
형식 지정 및 값 옵션은 AuthenticationResponse
을 참고하세요.
메시지 컨텍스트
각 메시지에는 메시지가 시작된 위치에 대한 컨텍스트 정보가 포함되어 있습니다.
... "context": { "customContext": "CUSTOM_CONTEXT", "entryPoint": "CONVERSATION_ENTRYPOINT", "placeId": "LOCATION_PLACE_ID", "nearPlaceId": "NEARBY_LOCATION_PLACE_ID", "deflectedPhoneNumber": "DEFLECTED_PHONE_NUMBER", "resolvedLocale": "MATCH_OF_USER_AND_AGENT_LOCALES", "userInfo": { "displayName": "USER_NAME", "userDeviceLocale": "USER_LOCALE", }, "widget": { "url": "WEBSITE_URL", "widgetContext": "WIDGET_CONTEXT", }, }, ...
필드 | 설명 |
---|---|
customContext |
파트너가 지정한 컨텍스트 데이터입니다. |
entryPoint |
EntryPoint에 정의된 대로 사용자가 대화를 시작한 메시지 노출 영역입니다. |
placeId |
사용자가 메시지를 보낸 위치의 Google 지역 정보 데이터베이스의 고유 식별자입니다. 위치별 진입점의 메시지에만 표시됩니다. |
nearPlaceId |
로컬 팩의 첫 번째 위치에 대한 Google 지역 정보 데이터베이스의 고유 식별자입니다. nearPlaceId 값을 받으면 사용자가 채팅하려는 위치를 확인합니다. |
deflectedPhoneNumber |
Business Messages가 대화를 시작할 때 사용자의 통화에서 벗어나는 전화번호입니다. |
resolvedLocale |
가장 잘 계산된 사용자 언어 ( 언어 값은 올바른 형식의 IETF BCP 47 언어 태그입니다. |
userInfo.displayName |
메시지를 보낸 사용자의 이름입니다. 사용자가 ID 공유를 선택 해제하면 이 필드는 비어 있습니다. |
userInfo.userDeviceLocale |
기기에서 보고한 사용자의 언어로, 올바른 형식의 IETF BCP 47 언어 태그입니다. |
widget.url |
대화형 노출 영역이 시작된 웹사이트의 URL입니다. |
widget.widgetContext |
대화를 시작하는 데 사용되는 위젯의 data-bm-widget-context 속성 값입니다. |
대화 기록
Google에서는 대화 기록을 제공하지 않습니다. 개인정보처리방침 및 권장사항을 준수하는 방식으로 이전 대화를 유지하여 사용자의 향후 메시지에 친절한 응답을 보낼 수 있습니다.