ServiceNow

Contact Center AI 平台 (CCAI 平台) 可与 ServiceNow CRM 集成。

ServiceNow 开发者设置

首选的最低 ServiceNow 版本要求:Tokyo patch 1

设置基本身份验证用户

ServiceNow 管理员账号可能已启用两步验证,并且与该用户相关联。因此,无法使用它在 CCAI Platform 中获取管理员访问权限。您必须在 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 的记录的关联。
  • 用户:与自定义 CRM 的账号的关联。
  • REST API Explorer:测试 API 的好方法。

手动添加自定义字段

在要更改的对象视图中,选择左上角的展开器图标(三条横线)。您可以在自助服务视图或默认视图中执行此操作。

  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. 依次前往全部 > 系统应用 > 所有可用应用 > 全部

  2. 搜索 OpenFrame。

  3. 安装 OpenFrame。

  4. 安装完成后,依次前往全部 > OpenFrame > 配置

  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 添加到值列表中。

为用户启用下一代界面体验

  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. 依次前往系统界面 > 界面操作

  2. 选择创建新操作

  3. 在如图所示的表单中,选择此“点击即拨”功能将属于的表格。

  4. 对于引用了联系人或用户的表单,请使用 g_form.getReference API 访问用户的手机号码。对于自定义表格,参考 ID 和生成的属性可能会有所不同。 与 CCAI 平台的通信将保持不变,因此载荷和数据结构必须与以下内容保持一致:

    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 检索相关值。以下是“用户”表的界面操作示例。对于自定义表格,表单字段名称可能有所不同。 与 CCAI 平台的通信将保持不变,因此载荷和数据结构必须与以下内容保持一致:

    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. 在界面宏中,修改 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. 在“代理平台”部分中,选择 ServiceNow

  3. ServiceNow 网域字段中输入您的 ServiceNow 网域信息。 这可能是开发者实例或供应商实例(根据需要),但与实例直接相关,并且是 ServiceNow 门户网站网址的第一部分:https://{your instance}.servicenow.com

  4. ServiceNow Cloud Selection 字段中,选择 Incident 以获取基本工单类型。如果您选择 Custom,系统会显示其他选项。 突发事件是任务表的扩展;自定义对象应该是突发事件的扩展。

  5. 身份验证凭据字段中,输入您的用户名和密码。

  6. 如果您为“云选择”字段类型选择了 Incident,您将看到以下字段:

    • 查找账号对象包含三个下拉字段:Object TypePhone Number lookup fieldsPhone number primary field
  7. 如果您为“云选择”字段类型选择了 Custom,您将看到以下字段:

    • 查找记录对象
      • 基本记录对象类型:选择 taskincident 表类型。
      • 记录对象类型:如果事件表已扩展,此字段将填充数据,您可以根据需要选择此字段。
    • 查找账号对象包含三个下拉字段:Object TypePhone Number lookup fieldsPhone number primary field
  8. 自定义用户 ID 字段:如果您想为移动或 Web SDK 会话启用自定义用户查找字段,请选中此复选框。

  9. 手机号码格式:可用于选择您希望用于显示手机号码的格式。

  10. 会话元数据文件:选中此框可将会话元数据附加到 CRM 记录。

  11. 点击保存,保存您所做的选择。如果您已勾选自定义用户 ID 字段复选框,则可以选择为记录创建自定义字段。这将在每个 ServiceNow 突发事件的底部(位于页面上的解决代码和解决备注部分下方)添加自定义字段标签页。

记录的自定义字段

这些是已在表单设计器中为 ServiceNow 实例创建的自定义字段。有关如何创建其他自定义字段的说明,请参阅 ServiceNow 文档中的 ServiceNow CRM 设置部分,然后找到手动添加自定义字段部分。

字段 类型 定义
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 字符串 通过网页版 Gmail 发送的电子邮件
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 应用。然后,在开发者设置 > CRM > 身份验证方法下输入凭据(OAuth 客户端 ID 和 OAuth 客户端密钥)。

在 ServiceNow 中创建 OAuth 应用

  1. 在您的 ServiceNow 账号中,依次前往全部 > 系统 OAuth > 应用注册

  2. 创建 OAuth 应用,然后选择为外部客户端创建 OAuth API 端点

  3. 配置以下字段:

    • 名称:输入一个唯一名称。

    • 客户端 ID:客户端 ID 由 ServiceNow OAuth 服务器自动生成。

    • 客户端密钥:这是 OAuth 应用的客户端密钥。 留空即可自动生成。

    • 刷新令牌有效期:刷新令牌的有效时间(以秒为单位)。

    • 访问令牌有效期:访问令牌的有效时间(以秒为单位)。

    • 重定向网址:输入您的环境网址以及子目录。例如 https://servicenow.yourcompany.co/v1/servicenow/oauth_callback

    • 强制执行令牌限制:将访问令牌的使用限制为 ServiceNow 文档中定义的 REST API 访问政策中的 API。取消选择此选项后,您就可以在其他 REST API 中使用访问令牌。

  4. 点击提交

  5. 创建应用后,返回到相应记录并检索客户端 ID 和新创建的客户端密钥

更新开发者设置中的设置

  1. 依次前往开发者设置 > CRM

  2. 请务必按照之前的步骤输入并配置设置。

  3. 在身份验证方法下,点击 OAuth

  4. 输入 OAuth 客户端 ID 和 OAuth 客户端密钥。(请参阅上文中的第 5 步)。

  5. 点击保存

  6. 点击关联凭据

Virtual Agent 的自定义字段映射

如果使用虚拟代理,请在自定义字段映射界面中配置此字段。这样一来,虚拟代理变量便可从虚拟代理会话载荷转移到 ServiceNow。变量名称可以是任意字符串,此处列出的字段标签只是一个示例。

自定义字段映射界面中,配置初始虚拟代理配置中使用的载荷定义所创建的变量与 ServiceNow 中的相关变量之间的连接。

字段映射标题 CRM 字段标签 自定义数据字段标签
虚拟客服反馈 ccaip_custom_field_incident_feedback va_feedback

配置其他设置

您可以在设置下拉菜单下找到其他设置,这些设置可让您将 CCAI 平台正确集成到 ServiceNow 实例中。如需详细了解如何配置每个部分,请参阅以下列表中的链接。

测试输出

现在,您可以点击 CCAI Platform 门户网站界面顶部的相关按钮,验证通话和聊天流程的功能。运行此测试时,请务必确保弹出式窗口拦截器处于停用状态。

您应该会在 ServiceNow 中看到创建的突发事件,并且通话或聊天联系信息会列在突发事件的活动部分。这应显示为工作备注,而不是突发事件评论,这样客户就看不到此后端活动。

系统会自动填充支持请求说明,其中包含“使用 CCAI 平台进行通话”或“使用 CCAI 平台 Chat”,客服人员可能需要更新此说明。

对通话或聊天输出结果满意后,您可以输入解决代码和备注(如果已配置 ServiceNow 解决代码和备注字段),然后关闭支持请求。

如需验证支持请求是否已关闭,您可能需要点击浏览器上的 back 导航按钮。在 ServiceNow 实例中,解决支持请求后,系统会自动关闭该支持请求,并转到客户记录页面,这是预期行为。