Contact Center AI 平台 (CCAI Platform) 提供与 ServiceNow CRM 的集成。
ServiceNow 开发者设置
首选的最低 ServiceNow 版本要求:Tokyo patch 1
设置基本身份验证用户
ServiceNow 管理员账号可能已启用两步验证,并与该用户相关联。因此,它不能用于在 CCAI Platform 中获取管理员访问权限。为此,您必须在 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 Platform 上传到 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添加到值列表中。
为用户启用新版界面体验
在导航栏中输入
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 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 检索相关值。以下是 Users 表的界面操作示例。对于自定义表格,表单字段名称可能会有所不同。 与 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); }
在参考资料旁边添加点击通话功能
必须在表单中修改联系人引用旁边的通话按钮。右键点击相应字段,然后前往 Configure Dictionary(配置字典)。对于属性,请将值
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 Platform 门户将 API 连接到 ServiceNow。
在 CCAI Platform 门户中,依次前往设置 > 开发者设置 > CRM。
在“Agent Platform”部分中,选择 ServiceNow。
在 ServiceNow 网域字段中输入您的 ServiceNow 网域信息。 这可能是开发者实例或供应商实例(视需要而定),但与实例直接相关,并且是 ServiceNow 门户网址中网址的第一部分:
https://{your instance}.servicenow.com。在 ServiceNow 云选择字段中,选择
Incident作为基本工单类型。如果您选择Custom,系统会显示其他选项。 突发事件是任务表的扩展;自定义对象应是突发事件的扩展。在身份验证凭证字段中,输入您的用户名和密码。
如果您为云选择字段类型选择了
Incident,您将看到以下字段:- 查找账号对象包含三个下拉字段:
Object Type、Phone Number lookup fields和Phone number primary field。
- 查找账号对象包含三个下拉字段:
如果您为云选择字段类型选择了
Custom,您将看到以下字段:查找记录对象:
基本记录对象类型:选择
task或incident表类型。记录对象类型:如果突发事件表已扩展,则此字段将填充数据,您可以根据需要选择该字段。
查找账号对象包含三个下拉字段:
Object Type、Phone Number lookup fields和Phone number primary field。
自定义用户 ID 字段:如果您想为移动或 Web SDK 或 Apps API (Chat) 会话启用自定义用户查找字段,请选中此复选框。
手机号码格式:让您能够选择要用于显示手机号码的格式。
会话元数据文件:选中此复选框可将会话元数据附加到 CRM 记录。
点击保存,保存您所做的选择。
记录的自定义字段
这些是已在表单设计器中为 ServiceNow 实例创建的自定义字段,可在 CCAI Platform 中使用。您还可以通过在菜单的“记录的自定义字段”部分中选择创建来创建其他自定义字段。
| 字段 | 类型 | 定义 |
|---|---|---|
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 应用。 然后,在开发者设置 > CRM > 身份验证方法下输入凭证(OAuth 客户端 ID 和 OAuth 客户端密钥)。
在 ServiceNow 中创建 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 步)。
点击保存。
点击关联凭证。
Virtual Agent 的自定义字段映射
如果使用 Virtual Agent,请在自定义字段映射屏幕中配置此字段。这样,Virtual Agent 变量就可以从 Virtual Agent 会话载荷转移到 ServiceNow。变量名称可以是任何字符串,此处列出的字段标签只是一个示例。
在自定义字段映射屏幕中,配置您在初始 Virtual Agent 配置中使用的载荷定义所创建的变量与 ServiceNow 中的相关变量之间的连接。
| 字段映射标题 | CRM 字段标签 | 自定义数据字段标签 |
|---|---|---|
| 虚拟客服反馈 | ccaip_custom_field_incident_feedback |
va_feedback |
添加 CRM 字段映射
前往设置 > 运营管理。
前往 CRM Custom Field Mapping(CRM 自定义字段映射)部分 > 点击 View All(查看全部)。
点击 + 添加 CRM 字段映射链接。
字段映射标题:CCAI Platform 门户中使用的此自定义字段映射的 CCAI Platform 名称。
CRM 字段标签:CRM 中您要映射到的 CRM 字段的标签。
自定义数据字段标签(自定义数据键):您要从中映射的 CCAI Platform 自定义数据载荷中的顶级键名称(例如,SDK 载荷的
device,或 Apps API Chat 载荷的orderId)。此密钥必须由 CCAI Platform Web 或移动 SDK 发送,或者(对于聊天互动)使用 Apps APISend custom data in a chat端点发送。键必须完全匹配(包括大小写)。
点击保存。
配置其他设置
您可以在设置下拉菜单下找到其他设置,以便将 CCAI Platform 正确集成到 ServiceNow 实例中。如需详细了解如何配置每个部分,请参阅以下列表中的链接。
测试输出
现在,您可以点击 CCAI Platform 门户屏幕顶部的相关按钮,验证通话和聊天流程的功能。请务必确保在运行此测试时停用弹窗拦截器。
您应该会在 ServiceNow 中看到创建的突发事件,并且该突发事件的活动部分中会列出通话或聊天联系人。此信息应显示为工作备注,而不是突发事件评论,这样客户就看不到此后端活动。
支持请求说明将自动填充“使用 CCAI Platform 通话”或“使用 CCAI Platform Chat”,并且可能需要由客服人员进行更新。
如果您对通话或聊天的结果感到满意,可以输入解决代码和备注(如果已配置 ServiceNow 解决代码和备注字段),然后关闭支持请求。
如需验证支持请求是否已关闭,您可能需要点击浏览器上的 back 导航按钮。在 ServiceNow 实例中,解决支持请求后,系统会自动关闭该请求并转到客户记录页面,这是正常现象。