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 的记录关联。
- 用户:与自定义 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
依次前往全部 > 系统应用 > 所有可用应用 > 全部 。
搜索 OpenFrame。
安装 OpenFrame。
安装完成后,依次前往全部 > OpenFrame > 配置 。
使用网址创建配置。如果 Servicenow 实例中有多个配置,您的用户可能无法访问新创建的配置。检查您的群组和 OpenFrame 配置顺序列表,以确定您的用户使用的是哪个配置。
在搜索框中输入
sys_properties.list。修改
glide.ui.concourse.onmessage_enforce_same_origin_whitelist。将新网址添加到值列表中。
修改
sn_openframe.cross.origin.access。将
autoplay添加到值列表中。
为用户启用 Next UI Experience
在导航栏中输入
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。将 autoplay 添加到值列表中。
修改
glide.ui.polaris.experience。更改为 false,因为启用后某些功能无法正常运行。
将“点击通话”添加到表单顶部
依次前往系统界面 > 界面操作 。
选择创建新操作 。
在如图所示的表单中,选择此“点击通话”将成为其一部分的表。

对于引用联系人或用户的表单,请使用
g_form.getReferenceAPI 访问用户的手机号码。对于自定义表,引用 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); }); }对于表单中包含要拨打的号码的表单,请使用
g_form.getValueAPI 检索相关值。这是用户表的界面操作中的一个示例。对于自定义表,表单字段名称可能会有所不同。 与 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); }
在引用旁边添加“点击通话”
必须在表单中修改联系人引用旁边的通话按钮。右键点击相应字段,然后依次前往配置字典 。对于 属性,请将值
show_phone或show_phone_customer_service添加到ref_contributions值。在界面宏中,修改
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 平台门户将 API 连接到 ServiceNow。
在 CCAI 平台门户中,依次前往设置 > 开发者设置 > CRM 。
在“智能体平台”部分中,选择 ServiceNow 。
在 ServiceNow 网域 字段中输入您的 ServiceNow 网域信息。 这可能是开发者实例或供应商实例(根据需要),但与实例直接相关,并且是 ServiceNow 门户网址的第一部分:
https://{your instance}.servicenow.com。在 ServiceNow Cloud 选择 字段中,为基本工单类型选择
Incident。如果您选择Custom,系统会显示其他选项。 事件是任务表的扩展;自定义对象应是事件的扩展。在身份验证凭据 字段中,输入您的用户名和密码。
如果您为 Cloud 选择字段类型选择了
Incident,您将 看到以下字段:- 查找账号对象 包含三个下拉字段:
Object Type、Phone Number lookup fields和Phone number primary field。
- 查找账号对象 包含三个下拉字段:
如果您为 Cloud 选择字段类型选择了
Custom,您将 看到以下字段:- 查找记录对象:
- 基本记录对象类型:选择
task或incident表类型。 - 记录对象类型:如果 事件表已扩展,此字段将填充数据,您可以根据需要选择它。
- 基本记录对象类型:选择
- 查找账号对象 包含三个下拉字段:
Object Type、Phone Number lookup fields和Phone number primary field。
- 查找记录对象:
自定义用户 ID 字段:如果您想为移动或 Web SDK 会话启用自定义用户 查找字段,请选中此复选框。
手机号码格式:允许您选择要用于显示手机号码的格式。
会话元数据文件:选中此复选框可将会话元数据附加到 CRM 记录。
点击保存 ,保存您所做的选择。如果您选中了自定义用户 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 |
整数 | CSAT 评分 |
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 应用。然后,在开发者设置 > CRM > 身份验证方法 下输入凭据(OAuth 客户端 ID 和 OAuth 客户端密钥)。
在 Service Now 中创建 OAuth 应用
在您的 ServiceNow 账号中,依次前往全部 > 系统 OAuth > 应用注册 。
创建 OAuth 应用,然后选择为外部客户端创建 OAuth API 端点 。
配置以下字段:
名称:输入一个唯一名称。
客户端 ID:客户端 ID 由 ServiceNow OAuth 服务器自动生成。
客户端密钥:这是 OAuth 应用的客户端密钥。 留空即可自动生成。
刷新令牌有效期:刷新令牌的有效时间(以秒为单位)。
访问令牌有效期:访问令牌的有效时间(以秒为单位)。
重定向网址:输入您的环境网址以及子目录。例如:
https://servicenow.yourcompany.co/v1/servicenow/oauth_callback强制执行令牌限制:将访问令牌的使用限制为 ServiceNow 文档中 REST API 访问政策中定义的 API。取消选择此选项将允许在其他 REST API 中使用访问令牌。
点击提交 。
创建应用后,返回到记录并检索客户端 ID 和新创建的客户端密钥 。
更新开发者设置中的设置
依次前往开发者设置 > CRM 。
确保按照之前的步骤输入和配置设置。
在“身份验证方法”下,点击 OAuth 。
输入 OAuth 客户端 ID 和 OAuth 客户端密钥。(请参阅上文中的第 5 步。)
点击保存 。
点击关联凭据 。
虚拟客服的自定义字段映射
如果使用虚拟客服,请在自定义字段映射 屏幕中配置此字段。这样,虚拟客服变量就可以从虚拟客服会话载荷传输到 ServiceNow。变量名称可以是任何字符串,此处列出的字段标签仅为示例。
在自定义字段映射 屏幕中,配置您在初始虚拟客服配置中使用的载荷定义创建的变量与 ServiceNow 中的相关变量之间的连接。
| 字段映射标题 | CRM 字段标签 | 自定义数据字段标签 |
|---|---|---|
| 虚拟客服反馈 | ccaip_custom_field_incident_feedback |
va_feedback |
配置其他设置
您可以在设置 下拉菜单中找到其他设置,这些设置可让您将 CCAI 平台正确集成到 ServiceNow 实例中。如需详细了解如何配置每个部分,请参阅以下列表中的链接。
测试输出
现在,您可以点击 CCAI 平台门户屏幕顶部的相关按钮,验证通话和聊天流程的功能。运行此测试时,请务必确保停用弹出式窗口拦截器。
您应该会在 ServiceNow 中看到创建的事件 ,并且通话 或聊天联系人列在事件的活动 部分中。这 应显示为工作备注,而不是事件评论,这样客户就看不到此 后端活动。
工单说明将自动填充“使用 CCAI 平台通话”或“使用 CCAI 平台 Chat”,智能体可能需要更新此说明。
对通话或聊天的输出感到满意后,您可以输入解决方案代码和备注(如果已配置 ServiceNow 解决方案代码和备注字段),然后关闭工单。
如需验证工单是否已关闭,您可能需要点击浏览器上的 back 导航按钮。在 ServiceNow 实例中,解决工单后,系统会自动关闭工单并转到客户记录页面,这是预期行为。