Contact Center AI 平台 (CCAI 平台) 可与 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 的好方法。
手动添加自定义字段
在要更改的对象视图中,选择左上角的展开器图标(三条横线)。您可以在自助服务视图或默认视图中执行此操作。
在菜单中,选择配置 > 表单设计以打开表单设计器。
在左侧列中,选择字段类型标签页。
拖动要添加的自定义字段类型。
将字段类型拖放到所需部分后,选择齿轮图标即可查看设置。
在该窗口中,更改标签并记下名称。该名称将用于 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添加到值列表中。
为用户启用下一代界面体验
在导航栏中输入
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,因为如果启用,某些功能将无法正常运行。
将“点击通话”添加到表单顶部
依次前往系统界面 > 界面操作。
选择创建新操作。
在如图所示的表单中,选择此“点击即拨”功能将属于的表格。

对于引用了联系人或用户的表单,请使用
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 Platform 门户将 API 连接到 ServiceNow。
在 CCAI Platform 门户中,依次前往设置 > 开发者设置 > CRM。
在“代理平台”部分中,选择 ServiceNow。
在 ServiceNow 网域字段中输入您的 ServiceNow 网域信息。 这可能是开发者实例或供应商实例(根据需要),但与实例直接相关,并且是 ServiceNow 门户网站网址的第一部分:
https://{your instance}.servicenow.com。在 ServiceNow Cloud Selection 字段中,选择
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 会话启用自定义用户查找字段,请选中此复选框。
手机号码格式:可用于选择您希望用于显示手机号码的格式。
会话元数据文件:选中此框可将会话元数据附加到 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 |
整数 | 客户满意度得分 |
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 应用
在您的 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 的自定义字段映射
如果使用虚拟代理,请在自定义字段映射界面中配置此字段。这样一来,虚拟代理变量便可从虚拟代理会话载荷转移到 ServiceNow。变量名称可以是任意字符串,此处列出的字段标签只是一个示例。
在自定义字段映射界面中,配置初始虚拟代理配置中使用的载荷定义所创建的变量与 ServiceNow 中的相关变量之间的连接。
| 字段映射标题 | CRM 字段标签 | 自定义数据字段标签 |
|---|---|---|
| 虚拟客服反馈 | ccaip_custom_field_incident_feedback |
va_feedback |
配置其他设置
您可以在设置下拉菜单下找到其他设置,这些设置可让您将 CCAI 平台正确集成到 ServiceNow 实例中。如需详细了解如何配置每个部分,请参阅以下列表中的链接。
测试输出
现在,您可以点击 CCAI Platform 门户网站界面顶部的相关按钮,验证通话和聊天流程的功能。运行此测试时,请务必确保弹出式窗口拦截器处于停用状态。
您应该会在 ServiceNow 中看到创建的突发事件,并且通话或聊天联系信息会列在突发事件的活动部分。这应显示为工作备注,而不是突发事件评论,这样客户就看不到此后端活动。
系统会自动填充支持请求说明,其中包含“使用 CCAI 平台进行通话”或“使用 CCAI 平台 Chat”,客服人员可能需要更新此说明。
对通话或聊天输出结果满意后,您可以输入解决代码和备注(如果已配置 ServiceNow 解决代码和备注字段),然后关闭支持请求。
如需验证支持请求是否已关闭,您可能需要点击浏览器上的 back 导航按钮。在 ServiceNow 实例中,解决支持请求后,系统会自动关闭该支持请求,并转到客户记录页面,这是预期行为。