Contact Center AI 平台 (CCAI 平台) 可與 ServiceNow CRM 整合。
ServiceNow 開發人員設定
建議的最低 ServiceNow 版本需求:Tokyo patch 1
設定基本驗證使用者
ServiceNow 管理員帳戶可能已啟用兩步驟驗證,並與該使用者建立關聯。因此無法用來取得 CCAI 平台的管理員存取權。您必須在 ServiceNow 中建立使用者帳戶,才能進行上述作業。
建立具有憑證的基本使用者:
依序前往「使用者」>「新增」。
填寫詳細資料,然後選取「僅限存取 Web 服務」。
記下使用者 ID 和密碼。
ServiceNow 中所需的角色
ServiceNow 中的預設角色已預先設定,可在平台中提供特定存取權和權限。管理員可以建立及設定角色,授予特定權限,控管具備該角色的使用者和群組可執行的操作。
如要執行這項整合,您必須在 ServiceNow 中具備下列角色:
user_admin:這個角色適用於需要在 ServiceNow 執行個體中管理使用者、群組、位置和公司的管理員。
sn_incident_read:這個角色提供事件管理應用程式及其相關功能的唯讀存取權。使用者可以透過這個平台查看事件記錄。
sn_incident_write:這個角色可授予事件管理應用程式及其相關函式的寫入權限,讓使用者建立及修改事件記錄。
personalize_dictionary:這個角色可自訂字典項目和標籤,以符合特定業務需求。
function_field_admin:這個角色適用於需要在報表設計工具中建立、編輯及查看函式欄位的使用者。但無法從平台清單或表單建立或刪除函式欄位。
設定執行個體檢視畫面
以下各節說明執行個體檢視區塊所需的設定變更。
(選用) 新增我的最愛
「我的最愛」可讓您在 ServiceNow 執行個體中快速找到最常使用的連結。如要新增最愛項目,請選取「導覽器」面板中欄位旁的星號圖示。如要稍後篩選導覽器面板,只顯示你的最愛,可以在導覽器面板中,選取篩選器導覽器欄位正下方的星號圖示。
實用的「我的最愛」範例:
- 事件:與自訂 CRM 記錄的關聯。
- 使用者:與自訂客戶關係管理系統帳戶的關聯。
- REST API Explorer:測試 API 的好方法。
手動新增自訂欄位
在要變更的物件檢視畫面中,選取左上角的展開器圖示 (3 條水平線)。你可以在自助式檢視畫面或預設檢視畫面中執行這項操作。
在選單中選取「設定」>「表單設計」,開啟表單設計工具。
選取左欄中的「欄位類型」分頁標籤。
拖曳要新增的自訂欄位類型。
將欄位類型拖曳至所需部分後,選取齒輪圖示即可查看「設定」。
在視窗中變更標籤,並記下名稱。這個名稱會用於 CCAI 平台應用程式設定。
選取畫面右上角的「儲存」。
將工作階段資料對應至 CRM
您必須使用 Dialogflow 對應 CCAIP 中的適當工作階段資料,並使用下列參數:
虛擬服務專員資料
{
"ujet": {
"session_variable": {
"capture_target": "payload",
"payload": {
"value_one": "$session.params.payload_value_one"
};
"capture_type": [ "comment", "field" ] // optional, default of ["comment"]
}
}
}
中繼資料
https://INSTANCE.service-now.com/api/now/table/sys_dictionary?sysparm_query=name%3Dsys_user https://INSTANCE.service-now.com/api/now/table/sys_dictionary?sysparm_query=name%3Dincident
標籤:column_label
API 金鑰:element
自訂欄位與 sys_user 或 incident 回應中的標準欄位位於相同層級。
將檔案從 CCAI 平台上傳至 CRM
https://INSTANCE_URL.service-now.com/api/now/attachment/upload
方法:POST
要求資料格式:property
回應資料位置:data.result
類型:Multi-part form
附件類型:Attachment Url
附件網址:download_link
參數:table below
要求範例:
{
file: FILE_DATA,
table_name: incident,
table_sys_id: RECORD_ID
}
整合代理程式轉接程式 (自訂表單)
下列步驟將逐步說明如何在 ServiceNow 執行個體中啟用代理程式介面卡和「按一下即可通話」功能。
安裝及設定 OpenFrame
依序前往「All」(全部) >「System Applications」(系統應用程式) >「All Available Applications」(所有可用應用程式) >「All」(全部)。
搜尋 OpenFrame。
安裝 OpenFrame。
安裝完成後,請依序前往「All」>「OpenFrame」>「Configurations」。
使用網址建立設定。如果 ServiceNow 執行個體內有多項設定,使用者可能無法存取新建立的設定。檢查群組和 OpenFrame 設定訂單清單,判斷使用者使用的設定。
在搜尋欄位中輸入
sys_properties.list。編輯
glide.ui.concourse.onmessage_enforce_same_origin_whitelist。將新網址新增至值清單。
編輯
sn_openframe.cross.origin.access。將
autoplay新增至值清單。
為使用者啟用新版 UI 體驗
在導覽列中輸入
sys_properties.list,然後按下 Enter 鍵。將系統屬性
glide.ui.polaris.experience設為 true。將系統的使用者偏好設定
glide.ui.polaris.use設為 false。將使用者的偏好設定
glide.ui.polaris.use設為 true。(您可以建立使用者偏好設定列)。
更新系統屬性
在導覽列中輸入
sys_properties.list,然後按一下 Enter 鍵。編輯
glide.ui.concourse.onmessage_enforce_same_origin_whitelist。將網址新增至值清單。多個值之間必須以半形逗號分隔。
編輯
sn_openframe.cross.origin.access。將自動播放新增至值清單。
編輯
glide.ui.polaris.experience。變更為 false,因為啟用後部分功能無法運作。
在表單頂端新增「點選通話」
依序前往「System UI」 >「UI Actions」。
選取「建立新動作」。
如圖所示,在表單中選取這個「按一下即可通話」按鈕所屬的表格。

如要存取表單中參照的聯絡人或使用者電話號碼,請使用
g_form.getReferenceAPI。如果是自訂表格,參考 ID 和產生的屬性可能會有所不同。與 CCAI Platform 的通訊方式相同,因此酬載和資料結構必須與下列項目完全一致:function clickToDial() { var user = g_form.getReference('caller_id',function(res) { var phone = res.phone || res.mobile_phone; var payload = {"name": "clicktodial", "number": phone}; var data = {"payload": payload, "method": "openframe_communication" }; CustomEvent.fireAll("openframe_request", data); }); }如要撥打表單中的電話號碼,請使用
g_form.getValueAPI 擷取相關值。這是使用者資料表 UI 動作的範例。如果是自訂表格,表單欄位名稱可能有所不同。 與 CCAI Platform 的通訊方式相同,因此酬載和資料結構必須與下列項目完全一致:function clickToDial() { var phone = g_form.getValue('phone') || g_form.getValue('mobile_phone'); var payload = {"name": "clicktodial", "number": phone}; var context = {"payload": payload, "method" : "openframe_communication" }; CustomEvent.fireAll("openframe_request", context); }
在參照資料旁新增「按一下即可撥號」
聯絡人參照旁的通話按鈕必須在表單中編輯。對著欄位按一下滑鼠右鍵,然後前往「設定字典」。如要新增屬性,請將
show_phone或show_phone_customer_service值新增至ref_contributions值。在 UI 巨集中,編輯
show_phone和show_phone_customer_service。更改下列內容:
原規定:
var task = {"entity": p.attr('data-task-table'), "query" :"sys_id="+p.attr('data-task-id')+"$[AMP]sysparm_view="+p.attr('data-task-view'),"value":p.attr('data-task-value'),"label":p.attr('data-task-label')};
var company = {"entity": p.attr('data-company-table'),"query":"sys_id="+p.attr('data-company-id')+"$[AMP]sysparm_view="+p.attr('data-task-view'),"value":p.attr('data-company-value'),"label":p.attr('data-company-label')};
var caller = {"entity": p.attr('data-caller-table'),"query": "sys_id="+p.attr('data-caller-id')+"$[AMP]sysparm_view="+p.attr('data-task-view'),"value":p.attr('data-caller-value'),"label":p.attr('data-caller-label')};
var callContext = [];
callContext.push(task);
callContext.push(company);
callContext.push(caller);
var metaData = {"phoneNumber":p.attr('data-caller-phone'),"taskId":p.attr('data-task-id')};
var data = {"metaData":metaData , "data": callContext};
var payload = {"type": "OUTGOING_CALL", "data" : data};
var createInteractionData ={};
createInteractionData.interactionSysId = -1;
createInteractionData.direction = 'outbound';
createInteractionData.context_document = p.attr('data-task-id');
createInteractionData.context_table = p.attr('data-task-table');
createInteractionData.account = p.attr('data-company-id');
if(p.attr('data-caller-table') === 'customer_contact')
createInteractionData.contact = p.attr('data-caller-id');
createInteractionData.opened_for = p.attr('data-caller-id');
var ga = new GlideAjax('sn_openframe.OpenFrameAjaxUtility');
ga.addParam('sysparm_name', 'createInteractionWithPropertyCheck');
ga.addParam('context', JSON.stringify(createInteractionData));
ga.getXML(function(serverResponse) {
var result = serverResponse.responseXML.getElementsByTagName("result");
var output = JSON.parse(result[0].getAttribute("data"));
if(output.status == "success"){
var interaction = {"entity": "interaction", "query" :"sys_id="+output.fields.interactionSysId, "value":output.fields.number, "label":"Interaction", "display":false};
payload.data.data.push(interaction);
}
var context = {"payload": payload, "method" : "openframe_communication" };
jslog("context with interaction : "+ JSON.stringify(context));
CustomEvent.fireAll("openframe_request", context);
});
新功能:
var phone = p.attr('data-caller-phone')
var payload = {"name": "clicktodial", "number": phone};
var data = {"payload": payload, "method": "openframe_communication" };
CustomEvent.fireAll("openframe_request", data);
CRM 設定
下列步驟說明如何使用 CCAI Platform 入口網站,將 API 連線至 ServiceNow。
在 CCAI Platform 入口網站中,依序前往「設定」>「開發人員設定」>「CRM」。
在「Agent Platform」(服務專員平台) 部分,選取「ServiceNow」ServiceNow。
在「ServiceNow 網域」欄位中輸入 ServiceNow 網域資訊。 這可能是開發人員執行個體或供應商執行個體 (視需要),但與執行個體直接相關,且是 ServiceNow 入口網站網址的第一部分:
https://{your instance}.servicenow.com。在「ServiceNow Cloud Selection」(ServiceNow 雲端選取) 欄位中,選取
Incident即可使用基本工單類型。選取Custom後,畫面會顯示其他選項。 事件是工作表的擴充功能;自訂物件應是事件的擴充功能。在「Authentication Credentials」(驗證憑證) 欄位中,輸入使用者名稱和密碼。
如果您選取「雲端選取欄位」類型
Incident,系統會顯示下列欄位:- 「Lookup Account Object」(查詢帳戶物件) 包含三個下拉式欄位:
Object Type、Phone Number lookup fields和Phone number primary field。
- 「Lookup Account Object」(查詢帳戶物件) 包含三個下拉式欄位:
如果您選取「雲端選取欄位」類型
Custom,系統會顯示下列欄位:- 查詢記錄物件:
- 基礎記錄物件類型:選取
task或incident表格類型。 - 記錄物件類型:如果事件表格已擴充,這個欄位就會填入資料,您可以視需要選取。
- 基礎記錄物件類型:選取
- 「Lookup Account Object」(查詢帳戶物件) 包含三個下拉式欄位:
Object Type、Phone Number lookup fields和Phone number primary field。
- 查詢記錄物件:
自訂使用者 ID 欄位:如要為 Mobile 或 Web SDK 工作階段啟用自訂使用者查詢欄位,請勾選這個方塊。
電話號碼格式:可選取顯示電話號碼時要使用的格式。
工作階段中繼資料檔案:勾選這個方塊,即可將工作階段中繼資料附加至 CRM 記錄。
按一下「儲存」即可儲存所選項目。如果您已勾選「自訂使用者 ID 欄位」方塊,就能為記錄建立自訂欄位。這樣一來,每個 ServiceNow 事件頁面的解決方案代碼和解決方案附註區段下方,就會新增自訂欄位分頁。
記錄的自訂欄位
這些是您在表單設計工具中,為 ServiceNow 執行個體建立的自訂欄位。如要瞭解如何建立其他自訂欄位,請參閱 ServiceNow 說明文件中的「ServiceNow CRM Setup」(ServiceNow 客戶關係管理設定),以及「Add Custom Fields Manually」(手動新增自訂欄位) 一節。
| 欄位 | 類型 | 定義 |
|---|---|---|
u_ujet_custom_field_after_call_work |
字串 | 話後處理工作時間長度 |
u_ujet_custom_field_call_duration |
字串 | 通話時間長度 |
u_ujet_custom_field_comm_id |
整數 | 通話或即時通訊 ID (視聯絡人類型而定) |
u_ujet_custom_field_rating |
整數 | 顧客滿意度分數 |
u_ujet_custom_field_email_via_web |
字串 | 透過網頁傳送的電子郵件 |
u_ujet_custom_field_feedback |
字串 | 意見回饋 |
u_ujet_custom_field_from_phone_number |
字串 | 來電者的電話號碼 |
u_ujet_custom_field_hold_duration |
字串 | 總保留時間 |
u_ujet_custom_field_menu_path |
字串 | 選單選取 |
u_ujet_custom_field_queue_name |
字串 | 佇列名稱 |
u_ujet_custom_field_session_type |
字串 | 工作階段類型 |
u_ujet_custom_field_verification |
True/False | 確認驗證完成 |
u_ujet_custom_field_wait_time |
字串 | 總等待時間 |
設定 OAuth
如要設定 OAuth,請在 ServiceNow 中建立 OAuth 應用程式。然後在「Developer Settings」(開發人員設定) >「CRM」>「Authentication Method」(驗證方式) 下方,輸入憑證 (OAuth 用戶端 ID 和 OAuth 用戶端密鑰)。
在 ServiceNow 中建立 OAuth 應用程式
在 ServiceNow 帳戶中,依序前往「All」>「System OAuth」>「Application Registry」。
建立 OAuth 應用程式,然後選取「Create an OAuth API endpoint for external clients」(為外部用戶端建立 OAuth API 端點)。
設定下列欄位:
名稱:輸入不重複的名稱。
用戶端 ID:ServiceNow OAuth 伺服器會自動產生用戶端 ID。
用戶端密鑰:這是 OAuth 應用程式的用戶端密鑰。 如要自動產生,請留空。
重新整理權杖的有效時間:重新整理權杖的有效時間 (以秒為單位)。
存取權杖有效時間:存取權杖的有效時間 (以秒為單位)。
重新導向網址:輸入環境網址和子目錄。例如:
https://servicenow.yourcompany.co/v1/servicenow/oauth_callback強制執行權杖限制:將存取權杖的使用限制在 ServiceNow 文件中 REST API 存取政策定義的 API。取消選取這個選項後,您就能在其他 REST API 中使用存取權杖。
按一下「提交」。
建立應用程式後,請返回記錄並擷取「用戶端 ID」和新建立的「用戶端密碼」。
在開發人員設定中更新設定
依序前往「開發人員設定」>「CRM」。
請務必按照先前的步驟輸入及設定相關設定。
在驗證方法下方,按一下「OAuth」OAuth。
輸入 OAuth 用戶端 ID 和 OAuth 用戶端密鑰。(請參閱上方的步驟 5)。
按一下「儲存」。
按一下「連結憑證」。
Virtual Agent 的自訂欄位對應
如果使用虛擬服務專員,請在「自訂欄位對應」畫面中設定這個欄位。這樣一來,虛擬代理程式變數就能從虛擬代理程式工作階段酬載轉移至 ServiceNow。變數名稱可以是任何字串,這裡列出的欄位標籤僅為範例。
在「Custom Field Mappings」(自訂欄位對應) 畫面中,設定初始虛擬助理設定中使用的酬載定義所建立的變數,與 ServiceNow 中相關變數之間的連線。
| 欄位對應標題 | CRM 欄位標籤 | 自訂資料欄位標籤 |
|---|---|---|
| 虛擬服務專員意見回饋 | ccaip_custom_field_incident_feedback |
va_feedback |
設定其他設定
在「設定」下拉式選單中,您會看到其他設定,可讓您將 CCAI Platform 正確整合至 ServiceNow 執行個體。如要進一步瞭解如何設定各個部分,請參閱下列清單中的連結。
測試輸出內容
現在,只要按一下 CCAI 平台入口網站畫面頂端的相關按鈕,即可驗證通話和即時通訊流程的功能。執行這項測試時,請務必停用彈出式視窗封鎖程式。
ServiceNow 應會建立事件,並在事件的「活動」部分列出通話或即時通訊聯絡人。這項資訊應顯示為工作附註,而非事件留言,這樣客戶就不會看到這項後端活動。
案件說明會自動填入「Call using CCAI Platform」(使用 CCAI Platform 通話) 或「Chat using CCAI Platform」(使用 CCAI Platform 即時通訊),但專員可能需要更新。
確認通話或即時通訊的輸出內容符合需求後,即可輸入解決方案代碼和附註 (如果已設定 ServiceNow 解決方案代碼和附註欄位),然後關閉案件。
如要確認案件已結案,可能需要點選瀏覽器的back導覽按鈕。在 ServiceNow 執行個體中,解決案件後系統會自動關閉案件,並將您帶往客戶記錄頁面,這是預期行為。