ServiceNow

Contact Center AI 平台 (CCAI 平台) 可與 ServiceNow CRM 整合。

ServiceNow 開發人員設定

建議的最低 ServiceNow 版本需求:Tokyo patch 1

設定基本驗證使用者

ServiceNow 管理員帳戶可能已啟用兩步驟驗證,並與該使用者建立關聯。因此無法用來取得 CCAI 平台的管理員存取權。您必須在 ServiceNow 中建立使用者帳戶,才能進行上述作業。

建立具有憑證的基本使用者:

  1. 依序前往「使用者」>「新增」

  2. 填寫詳細資料,然後選取「僅限存取 Web 服務」。

  3. 記下使用者 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 條水平線)。你可以在自助式檢視畫面或預設檢視畫面中執行這項操作。

  1. 在選單中選取「設定」>「表單設計」,開啟表單設計工具。

  2. 選取左欄中的「欄位類型」分頁標籤。

  3. 拖曳要新增的自訂欄位類型。

  4. 將欄位類型拖曳至所需部分後,選取齒輪圖示即可查看「設定」

  5. 在視窗中變更標籤,並記下名稱。這個名稱會用於 CCAI 平台應用程式設定。

  6. 選取畫面右上角的「儲存」

將工作階段資料對應至 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_userincident 回應中的標準欄位位於相同層級。

將檔案從 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

  1. 依序前往「All」(全部) >「System Applications」(系統應用程式) >「All Available Applications」(所有可用應用程式) >「All」(全部)

  2. 搜尋 OpenFrame。

  3. 安裝 OpenFrame。

  4. 安裝完成後,請依序前往「All」>「OpenFrame」>「Configurations」

  5. 使用網址建立設定。如果 ServiceNow 執行個體內有多項設定,使用者可能無法存取新建立的設定。檢查群組和 OpenFrame 設定訂單清單,判斷使用者使用的設定。

  6. 在搜尋欄位中輸入 sys_properties.list

  7. 編輯 glide.ui.concourse.onmessage_enforce_same_origin_whitelist

  8. 將新網址新增至值清單。

  9. 編輯 sn_openframe.cross.origin.access

  10. autoplay 新增至值清單。

為使用者啟用新版 UI 體驗

  1. 在導覽列中輸入 sys_properties.list,然後按下 Enter 鍵。

  2. 將系統屬性 glide.ui.polaris.experience 設為 true

  3. 將系統的使用者偏好設定 glide.ui.polaris.use 設為 false

  4. 將使用者的偏好設定 glide.ui.polaris.use 設為 true。(您可以建立使用者偏好設定列)。

更新系統屬性

  1. 在導覽列中輸入 sys_properties.list,然後按一下 Enter 鍵。

  2. 編輯 glide.ui.concourse.onmessage_enforce_same_origin_whitelist

  3. 將網址新增至值清單。多個值之間必須以半形逗號分隔。

  4. 編輯 sn_openframe.cross.origin.access

  5. 將自動播放新增至值清單。

  6. 編輯 glide.ui.polaris.experience

  7. 變更為 false,因為啟用後部分功能無法運作。

在表單頂端新增「點選通話」

  1. 依序前往「System UI」 >「UI Actions」

  2. 選取「建立新動作」

  3. 如圖所示,在表單中選取這個「按一下即可通話」按鈕所屬的表格。

  4. 如要存取表單中參照的聯絡人或使用者電話號碼,請使用 g_form.getReference API。如果是自訂表格,參考 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);
      });
    }
    
  5. 如要撥打表單中的電話號碼,請使用 g_form.getValue API 擷取相關值。這是使用者資料表 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);
    }
    

在參照資料旁新增「按一下即可撥號」

  1. 聯絡人參照旁的通話按鈕必須在表單中編輯。對著欄位按一下滑鼠右鍵,然後前往「設定字典」。如要新增屬性,請將 show_phoneshow_phone_customer_service 值新增至 ref_contributions 值。

  2. 在 UI 巨集中,編輯 show_phoneshow_phone_customer_service

  3. 更改下列內容:

原規定

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。

  1. 在 CCAI Platform 入口網站中,依序前往「設定」>「開發人員設定」>「CRM」

  2. 在「Agent Platform」(服務專員平台) 部分,選取「ServiceNow」ServiceNow

  3. 在「ServiceNow 網域」欄位中輸入 ServiceNow 網域資訊。 這可能是開發人員執行個體或供應商執行個體 (視需要),但與執行個體直接相關,且是 ServiceNow 入口網站網址的第一部分:https://{your instance}.servicenow.com

  4. 在「ServiceNow Cloud Selection」(ServiceNow 雲端選取) 欄位中,選取 Incident 即可使用基本工單類型。選取 Custom 後,畫面會顯示其他選項。 事件是工作表的擴充功能;自訂物件應是事件的擴充功能。

  5. 在「Authentication Credentials」(驗證憑證) 欄位中,輸入使用者名稱和密碼。

  6. 如果您選取「雲端選取欄位」類型Incident,系統會顯示下列欄位:

    • 「Lookup Account Object」(查詢帳戶物件) 包含三個下拉式欄位:Object TypePhone Number lookup fieldsPhone number primary field
  7. 如果您選取「雲端選取欄位」類型Custom,系統會顯示下列欄位:

    • 查詢記錄物件
      • 基礎記錄物件類型:選取 taskincident 表格類型。
      • 記錄物件類型:如果事件表格已擴充,這個欄位就會填入資料,您可以視需要選取。
    • 「Lookup Account Object」(查詢帳戶物件) 包含三個下拉式欄位:Object TypePhone Number lookup fieldsPhone number primary field
  8. 自訂使用者 ID 欄位:如要為 Mobile 或 Web SDK 工作階段啟用自訂使用者查詢欄位,請勾選這個方塊。

  9. 電話號碼格式:可選取顯示電話號碼時要使用的格式。

  10. 工作階段中繼資料檔案:勾選這個方塊,即可將工作階段中繼資料附加至 CRM 記錄。

  11. 按一下「儲存」即可儲存所選項目。如果您已勾選「自訂使用者 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 應用程式

  1. 在 ServiceNow 帳戶中,依序前往「All」>「System OAuth」>「Application Registry」

  2. 建立 OAuth 應用程式,然後選取「Create an OAuth API endpoint for external clients」(為外部用戶端建立 OAuth API 端點)

  3. 設定下列欄位:

    • 名稱:輸入不重複的名稱。

    • 用戶端 ID:ServiceNow OAuth 伺服器會自動產生用戶端 ID。

    • 用戶端密鑰:這是 OAuth 應用程式的用戶端密鑰。 如要自動產生,請留空。

    • 重新整理權杖的有效時間:重新整理權杖的有效時間 (以秒為單位)。

    • 存取權杖有效時間:存取權杖的有效時間 (以秒為單位)。

    • 重新導向網址:輸入環境網址和子目錄。例如:https://servicenow.yourcompany.co/v1/servicenow/oauth_callback

    • 強制執行權杖限制:將存取權杖的使用限制在 ServiceNow 文件中 REST API 存取政策定義的 API。取消選取這個選項後,您就能在其他 REST API 中使用存取權杖。

  4. 按一下「提交」

  5. 建立應用程式後,請返回記錄並擷取「用戶端 ID」和新建立的「用戶端密碼」

在開發人員設定中更新設定

  1. 依序前往「開發人員設定」>「CRM」

  2. 請務必按照先前的步驟輸入及設定相關設定。

  3. 在驗證方法下方,按一下「OAuth」OAuth

  4. 輸入 OAuth 用戶端 ID 和 OAuth 用戶端密鑰。(請參閱上方的步驟 5)。

  5. 按一下「儲存」

  6. 按一下「連結憑證」

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 執行個體中,解決案件後系統會自動關閉案件,並將您帶往客戶記錄頁面,這是預期行為。