背景
freeswitch动态IVR是通过mod_ivr模块来实现的,呼叫队列是通过mod_callcenter实现。但是常规开发人员对接freeswitch开发有一定难度,无论是源码C修改还是lua等脚本开发。
解决方案
本人通过封装freeswitch形成一个核心产品,功能包括IVR动态导航、坐席动态添加、动态拨号计划、坐席登入、登出、置忙、空闲、通话、呼叫转移、呼叫保持、墙插、强拆、通话记录上传、弹屏上传等功能,只需要调用http接口即可实现呼叫中心业务。同时扩展性好,可扩展智能语音客服、语音识别功能等。业务逻辑采用java封装,二次开发人员可任意修改,修改逻辑简单方便。有意者联系mokeily99@126.com或主页信息
接口文档
呼叫中心接口文档
修改记录
序号 | 内容 | 时间 |
1 | 添加“查询技能组列表”接口 | 2023-08-18 |
2 | “通话记录上传”接口添加record_url录音地址字段 | 2023-08-18 |
3 | 修改“技能组查询”接口地址 | 2023-08-21 |
4 | 增加“2.4通话转移”接口 | 2023-08-21 |
5 | 增加“4.3ivr查询”接口 | 2023-08-22 |
6 | “2.3通话记录上传”请求参数增加操作列表 | 2023-08-24 |
7 | 新增“2.5坐席通话强拆”、“2.6坐席呼叫保持取消”接口 | 2023-08-24 |
8 | “3.6查询技能组列表”接口增加坐席列表返回 | 2023-08-25 |
9 | 新增”2.7回调地址查询”接口 | 2023-08-25 |
10 | 新增”2.8查看账户下注册在线坐席”接口 | 2023-09-14 |
接口统一采用http协议,json传输数据格式
- 令牌获取
- 业务流程
账户通过该接口获取令牌token,其他业务流程请求参数携带token进行校验
- 接口地址
http://ip:port/fs-core/fsInter/getToken
- 请求参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
accId | 否 | 是 | String(500) | 账户ID: fsacc001 | |
accKey | 否 | 是 | String(255) | 账户key: AA39noway |
样例:
{
"accId": "fsacc001",
"accKey": "AA39noway"
}
- 应答参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
resultCode | 否 | 是 | String(4) | 0000:成功 1003: token校验失败 1002: 参数缺失 0001: 账户ID或账户key不能为空 0002: 账户ID或账户key错误 0003: 生成token失败,请重新操作 | |
resultMsg | 否 | 是 | String(255) | 错误信息 | |
resultData | 是 | 否 | Object | 返回信息 | |
token | 是 | resultData | 是 | String(255) | Token令牌 |
样例:
{
"resultCode": "0000",
"resultMsg": "操作成功!",
"resultData": {
"token": "1e94636e06b14c06a7cb80da6dc94f6a"
}
}
- 业务端接口地址上传
- 业务流程
业务端上传fs端调用业务端的接口地址,包括弹屏接收地址、通话记录接收地址等
- 接口地址
http://ip:port/fs-core/fsInter/updateUrlInfo
- 请求参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
token | 否 | 是 | String(500) | Token令牌,令牌获取返回值 | |
urlPath | 否 | 是 | String(255) | 调用地址 | |
urlType | 否 | 是 | String(1) | 地址类型 1:来电弹窗 2:通话记录 |
- 应答参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
resultCode | 否 | 是 | String(4) | 0000:成功 0001: 账户ID或账户key不能为空 0002: 账户不存在 | |
resultMsg | 否 | 是 | String(255) | 错误信息 | |
resultData | 是 | 否 | Object | 返回信息 |
样例:
{
"resultCode": "0000",
"resultMsg": "操作成功!",
"resultData": null
}
- 来电接听通知
- 业务流程
电话接入坐席,坐席接听后系统调用“弹窗地址上传”中传入的地址。该接口为freeswitch调用业务系统
- 接口地址
1.2中上传的弹窗地址
- 请求参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
accId | 否 | 是 | String(500) | 所属账户 | |
callerNo | 否 | 是 | String(255) | 来电号码 | |
calledNo | 否 | 是 | String(255) | 被叫号码 | |
callTime | 否 | 否 | String(255) | 呼叫时间 | |
answerTime | 否 | 否 | String(255) | 应答时间 |
样例:
{
"accId ": " fsacc001",
"callerNo": " 18888888888",
"calledNo": " 1004",
"callTime": "2023-08-02 19:08:25",
"answerTime": "2023-08-02 19:08:30"
}
- 应答参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
resultCode | 否 | 是 | String(4) | 0000:成功 | |
resultMsg | 否 | 是 | String(255) | 错误信息 | |
resultData | 是 | 否 | Object | 返回信息 |
样例:
{
"resultCode": "0000",
"resultMsg": "操作成功!",
"resultData": null
}
- 通话记录上传
- 业务流程
通话完成后fs调用业务端上传的通话记录地址,进行通话记录上传
- 接口地址
1.2中上传的“通话记录”地址
- 请求参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
accId | 否 | 是 | String(500) | 所属账户 | |
uuid | 否 | 是 | String(255) | 通话唯一标识 | |
caller_id_number | 否 | 是 | String(255) | 主叫号码 | |
destination_number | 否 | 是 | String(255) | 被叫号码 | |
start_stamp | 否 | 是 | String(255) | 呼叫时间 | |
answer_stamp | 否 | 否 | String(255) | 应答时间 | |
end_stamp | 否 | 是 | String(255) | 呼叫结束时间 | |
uduration | 否 | 否 | String(255) | 总呼叫持续时间(以微秒为单位) | |
billsec | 否 | 否 | String(255) | 可计费的通话时长(秒) | |
hangup_cause | 否 | 是 | String(255) | 话机原因: NO_ANSWER:被叫无应答 NORMAL_CLEARING:正常挂机 ORIGINATOR_CANCEL:主叫挂断取消 NO_USER_RESPONSE:无用户响应 | |
record_url | 否 | 否 | String(500) | 录音地址 | |
ctr_list | 是 | 否 | List | 通话操作列表 | |
ctr_type | 否 | ctr_list | 是 | List | 操作类型 0强拆1强插2保持3通话转移 |
create_time | 否 | ctr_list | 是 | List | 操作时间 |
样例:
- 应答参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
resultCode | 否 | 是 | String(4) | 0000:成功 | |
resultMsg | 否 | 是 | String(255) | 错误信息 | |
resultData | 是 | 否 | Object | 返回信息 |
样例:
{
"resultCode": "0000",
"resultMsg": "操作成功!",
"resultData": null
}
- 通话转移
- 业务流程
可将当前坐席接听中的电话转移至其他坐席,转移前会判断目标坐席是否有通话,无通话后进行盲转,同时当前坐席自动挂机,目标坐席振铃接听后,目标坐席和用户进行通话
- 接口地址
http://ip:port/fs-core/fsInter/transferConver
- 请求参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
token | 否 | 是 | String(500) | Token令牌,令牌获取返回值 | |
seatFrom | 否 | 是 | String(255) | 转出坐席号 | |
seatTo | 否 | 是 | String(255) | 目标坐席号 | |
phoneNo | 否 | 是 | String(255) | 当前通话号码 |
样例:
{
"token": "377a41dc0be640a18f619d4a64928794",
"seatFrom": "1004",
"seatTo": "1002",
"phoneNo": "13333333333"
}
- 应答参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
resultCode | 否 | 是 | String(4) | 0000:成功 0001: 账户下不存在该坐席seatFrom 0002: 账户下不存在该坐席seatTo 0003: 转出转入坐席不能相同 0004: 被转移坐席正在通话中,无法转接到目的地 0005: 坐席下不存在该通话,无法转接到其他坐席 | |
resultMsg | 否 | 是 | String(255) | 错误信息 | |
resultData | 是 | 否 | Object | 返回信息 |
样例:
{
"resultCode": "0000",
"resultMsg": "操作成功!",
"resultData": null
}
- 坐席通话强拆
- 业务流程
管理员对坐席当前通话进行强拆操作,强拆后双方挂断
- 接口地址
http://ip:port/fs-core/fsInter/ seatConverKill
- 请求参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
token | 否 | 是 | String(500) | Token令牌,令牌获取返回值 | |
seatNo | 否 | 是 | String(255) | 坐席号码 |
样例:
{
"token": "377a41dc0be640a18f619d4a64928794",
"seatNo": "1004"
}
- 应答参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
resultCode | 否 | 是 | String(4) | 0000:成功 0002: 账户下不存在该坐席 0003:坐席下无通话 | |
resultMsg | 否 | 是 | String(255) | 错误信息 | |
resultData | 是 | 否 | Object | 返回信息 |
样例:
{
"resultCode": "0000",
"resultMsg": "操作成功!",
"resultData": null
}
- 坐席呼叫保持取消
- 业务流程
坐席将用户通话进行呼叫保持
- 接口地址
http://ip:port/fs-core/fsInter/seatConverHold
- 请求参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
token | 否 | 是 | String(500) | Token令牌,令牌获取返回值 | |
seatNo | 否 | 是 | String(255) | 坐席号码 | |
phoneNo | 否 | 是 | String(255) | 通话号码 | |
holdType | 否 | 是 | String(255) | 操作码 0取消保持 1呼叫保持 |
样例:
{
"token": "377a41dc0be640a18f619d4a64928794",
"seatNo": "1004",
"phoneNo": "13333333333",
"holdType": "0"
}
- 应答参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
resultCode | 否 | 是 | String(4) | 0000:成功 0002: 账户下不存在该坐席 0003:坐席下通话不存在 0004:操作码错误 | |
resultMsg | 否 | 是 | String(255) | 错误信息 | |
resultData | 是 | 否 | Object | 返回信息 |
样例:
{
"resultCode": "0000",
"resultMsg": "操作成功!",
"resultData": null
}
- 回调地址查询
- 业务流程
查询通话记录、弹屏回调接口地址
- 接口地址
http://ip:port/fs-core/fsInter/queryUrlInfo
- 请求参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
token | 否 | 是 | String(500) | Token令牌,令牌获取返回值 | |
urlType | 否 | 否 | String(1) | 地址类型 1:来电弹窗 2:通话记录 |
样例:
{
"token": "377a41dc0be640a18f619d4a64928794",
"urlType": "2"
}
- 应答参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
resultCode | 否 | 是 | String(4) | 0000:成功 0001:账户下不存在回调地址 | |
resultMsg | 否 | 是 | String(255) | 错误信息 | |
resultData | 是 | 否 | List | 回调地址列表 | |
acc_id | 否 | resultData | 是 | String(255) | 所属账户 |
url_type | 否 | resultData | 是 | String(1) | 地址类型 |
url_path | 否 | resultData | 是 | String(255) | 地址 |
update_time | 否 | resultData | 是 | String(255) | 修改时间 |
样例:
{
"resultCode": "0000",
"resultMsg": "操作成功!",
"resultData": [
{
"update_time": 1692498093000,
"url_type": "2",
"acc_id": "fsacc001",
"url_path": "http://113.4.137.248:8083/phoneCallback/callLog"
},
{
"update_time": 1692262292000,
"url_type": "1",
"acc_id": "fsacc001",
"url_path": "http://113.4.137.248:8083/phoneCallback/callAnswer"
}
]
}
- 坐席操作
- 业务流程
账户添加、修改、删除坐席账号。坐席系统唯一,不能重复。修改和删除会连同修改和删除技能组中绑定关系
- 接口地址
http://ip:port/fs-core/fsInter/ctrlSeat
- 请求参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
token | 否 | 是 | String(500) | Token令牌,令牌获取返回值 | |
ctrlType | 否 | 是 | String(1) | 操作类型 0:添加 1:修改 2:删除 | |
seatNo | 否 | 是 | String(255) | 坐席号 | |
seatPwd | 否 | 否 | String(255) | 坐席密码,ctrlType=0时必传 | |
newSeatNo | 否 | 否 | String(255) | 新坐席号,ctrlType=1时newSeatNo和newSeatPwd必须有一个或两个上传 | |
newSeatPwd | 否 | 否 | String(255) | 新坐席密码,ctrlType=1时newSeatNo和newSeatPwd必须有一个或两个上传 |
样例:
{
"token": "1e94636e06b14c06a7cb80da6dc94f6a",
"ctrlType": "0",
"seatNo": "1002",
"seatPwd": "AA39noway."
}
- 应答参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
resultCode | 否 | 是 | String(4) | 0000:成功 0001: 操作失败,请重新操作 0002: 账户下不存在坐席 0003: 操作类型错误! 0004:新坐席号已存在(修改) 0005:坐席号已存在(添加) | |
resultMsg | 否 | 是 | String(255) | 错误信息 | |
resultData | 是 | 否 | Object | 返回信息 |
样例:
{
"resultCode": "0000",
"resultMsg": "操作成功!",
"resultData": null
}
- 坐席列表查询
- 业务流程
查询账户下所有坐席列表。
- 接口地址
http://ip:port/fs-core/fsInter/querySeatList
- 请求参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
token | 否 | 是 | String(500) | Token令牌,令牌获取返回值 |
样例:
{
"token": "93bc13844b3549588cea206369fe3e59"
}
- 应答参数
字段名称 | 父节点名称 | 是否为父节点 | 是否必传 | 类型 | 备注 |
resultCode | 否 | 是 | String(4) | 0000:成功 | |
resultMsg | 否 | 是 | String(255) | 错误信息 | |
resultData | 是 | 否 | List | 坐席列表 | |
seat_no | resultData | 否 | 是 | String(255) | 坐席工号 |
seat_pwd | resultData | 否 | 是 | String(255) | 密码,考虑是否要返回,有密码泄露风险 |
样例:
{
"resultCode": "0000",
"resultMsg": "操作成功!",
"resultData": [
{
"seat_no": "2007",
"seat_pwd": "AA39noway."
},
{
"seat_no": "2008",
"seat_pwd": "AA39noway."
},
{
"seat_no": "1001",
"seat_pwd": "AA39noway."
},
{
"seat_no": "1004",
"seat_pwd": "AA39noway."
},
{
"seat_no": "2009",
"seat_pwd": "AA39noway."
},
{
"seat_no": "1002",
"seat_pwd": "AA39noway."
},
{
"seat_no": "2005",
"seat_pwd": "AA39noway."
},
{
"seat_no": "2010",
"seat_pwd": "AA39noway."
},
{
"seat_no": "2006",
"seat_pwd": "AA39noway."
}
]
}
- 坐席签入签出
- 业务流程
坐席签入签出操作,签入要打开软电话前提下
- 接口地址
http://ip:port/fs-core/fsInter/setSeatCheck
- 请求参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 | ||||
token | 否 | 是 | String(500) | Token令牌,令牌获取返回值 | |||||
seatNo | 否 | 是 | String(255) | 坐席号 | |||||
checkType | 否 | 是 | String(1) | 操作类型 in:签入 out:签出 | |||||
样例:
{
"token": "1e94636e06b14c06a7cb80da6dc94f6a",
"seatNo": "1004",
"checkType": "out"
}
- 应答参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
resultCode | 否 | 是 | String(4) | 0000:成功 0001: 操作失败,请重新操作 0002: 账户下不存在坐席 0003: 操作类型错误! 0004:新坐席号已存在(修改) 0005:坐席号已存在(添加) | |
resultMsg | 否 | 是 | String(255) | 错误信息 | |
resultData | 是 | 否 | Object | 返回信息 |
样例:
{
"resultCode": "0000",
"resultMsg": "操作成功!",
"resultData": null
}
- 设置坐席状态
- 业务流程
设置坐席置忙、置闲,注:置闲要在签入状态下才会进线。
- 接口地址
http://ip:port/fs-core/fsInter/setSeatState
- 请求参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
token | 否 | 是 | String(500) | Token令牌,令牌获取返回值 | |
seatNo | 否 | 是 | String(255) | 坐席号 | |
stateType | 否 | 是 | String(255) | 状态类型 idle:空闲 busy:忙 |
样例:
{
"token": "1e94636e06b14c06a7cb80da6dc94f6a",
"seatNo": "1004",
"stateType": "idle"
}
- 应答参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
resultCode | 否 | 是 | String(4) | 0000:成功 0001: fs错误 0002: 账户坐席不匹配 0003: 状态类型错误 | |
resultMsg | 否 | 是 | String(255) | 错误信息 | |
resultData | 是 | 否 | Object | 返回信息 |
样例:
{
"resultCode": "0000",
"resultMsg": "操作成功!",
"resultData": null
}
- 技能组操作
- 业务流程
技能组作为一个队列,通话线路进入技能组后可根据呼叫策略呼叫组下坐席成员。坐席组可作为呼叫流程的目标对象
- 接口地址
http://ip:port/fs-core/fsInter/ctrlQueues
- 请求参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
token | 否 | 是 | String(500) | Token令牌,令牌获取返回值 | |
ctrlType | 否 | 是 | String(1) | 操作类型 0:添加 2:删除 | |
queueAcc | 否 | 是 | String(255) | 技能组账户,不能是中文,建议用英文数组组合,技能组账户系统唯一,不能重复 | |
queueName | 否 | 否 | String(255) | 技能组名称,ctrlType=0时必传 | |
strategy | 否 | 否 | String(255) | 呼叫规则,ctrlType=0时必传 random:随机 Ring-all:同时呼叫所有的客户端,某个接听后其它客户端自动挂断 Longest-idle-agent:最大空闲客户端优先 Round-robin:最后一次客户端通话的优先 Top-down:从上倒下查找客户端 agent-with-least-talk-time:最少通话时间的客户端优先 agent-with-fewest-calls:最少通话次数的客户端优先 |
样例:
{
"token": "1e94636e06b14c06a7cb80da6dc94f6a",
"ctrlType": "0",
"queueAcc": "test3",
"queueName": "测试技能组2",
"strategy": "random"
}
- 应答参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
resultCode | 否 | 是 | String(4) | 0000:成功 0001: 操作失败,请重新操作 0002: 账户下不存在技能组(修改) 0003:技能组已存在!(添加) | |
resultMsg | 否 | 是 | String(255) | 错误信息 | |
resultData | 是 | 否 | Object | 返回信息 |
样例:
{
"resultCode": "0000",
"resultMsg": "操作成功!",
"resultData": null
}
- 查询技能组列表
- 业务流程
查询账户下技能组列表
- 接口地址
http://ip:port/fs-core/fsInter/queryQueues
- 请求参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
token | 否 | 是 | String(500) | Token令牌,令牌获取返回值 | |
queueAcc | 否 | 否 | String(500) | 技能组账户 |
样例:
{
"token": "377a41dc0be640a18f619d4a64928794",
"queueAcc": "test2"
}
- 应答参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
resultCode | 否 | 是 | String(4) | 0000:成功 | |
resultMsg | 否 | 是 | String(255) | 错误信息 | |
resultData | 是 | 否 | List | 返回信息 | |
queue_name | 否 | resultData | 是 | String(255) | 技能组名称 |
queue_strategy | 否 | resultData | 是 | String(255) | 呼叫规则 |
queue_acc | 否 | resultData | 是 | String(255) | 技能组账户 |
acc_id | 否 | resultData | 是 | String(255) | 所属账户 |
tier_list | 是 | resultData | 否 | List | 技能组下坐席列表 |
seat_no | 否 | tier_list | 是 | String(255) | 坐席号 |
update_time | 否 | tier_list | 是 | String(255) | 修改时间 |
样例:
{
"resultCode": "0000",
"resultMsg": "操作成功!",
"resultData": [
{
"queue_name": "测试技能组1",
"update_time": 1691218423000,
"queue_strategy": "random",
"tier_list": [
{
"update_time": 1691241377000,
"seat_no": "2006"
},
{
"update_time": 1692939044000,
"seat_no": "8888"
},
{
"update_time": 1691243249000,
"seat_no": "2007"
},
{
"update_time": 1691246747000,
"seat_no": "2010"
},
{
"update_time": 1692940984000,
"seat_no": "1003"
},
{
"update_time": 1692933018000,
"seat_no": "6666"
},
{
"update_time": 1691235932000,
"seat_no": "2005"
},
{
"update_time": 1692940716000,
"seat_no": "1006"
},
{
"update_time": 1691245174000,
"seat_no": "2009"
},
{
"update_time": 1691237028000,
"seat_no": "1004"
},
{
"update_time": 1691243927000,
"seat_no": "2008"
}
],
"maxaccept": "d130987dcbff472db6bbf1f0b7a8e696",
"queue_acc": "support",
"acc_id": "fsacc001"
}
]
}
- 坐席绑定技能组操作
- 业务流程
坐席与技能组绑定和解绑操作,同一个坐席可以绑定到多个技能组中
- 接口地址
http://ip:port/fs-core/fsInter/bindQueue
- 请求参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
token | 否 | 是 | String(500) | Token令牌,令牌获取返回值 | |
ctrlType | 否 | 是 | String(1) | 操作类型 0:绑定 2:解绑 | |
queueAcc | 否 | 是 | String(255) | 技能组账户,“技能组操作”接口中创建的技能组账户 | |
seatNo | 否 | 是 | String(255) | 坐席号 |
样例:
{
"token": "1e94636e06b14c06a7cb80da6dc94f6a",
"ctrlType": "0",
"seatNo": "1001",
"queueAcc": "test2"
}
- 应答参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
resultCode | 否 | 是 | String(4) | 0000:成功 0001: 操作失败,请重新操作 0002: 账户下不存在该技能组 0003: 账户下不存在该坐席 0004: 坐席已经绑定到技能组下,无需重复操作! 0005: 坐席与技能组不存在绑定关系! | |
resultMsg | 否 | 是 | String(255) | 错误信息 | |
resultData | 是 | 否 | Object | 返回信息 |
样例:
{
"resultCode": "0000",
"resultMsg": "操作成功!",
"resultData": null
}
- 查看账户下注册在线坐席
- 业务流程
查询账户下已经注册在线的坐席列表,同时返回注册坐席的签入状态、话机状态等信息
- 接口地址
http://ip:port/fs-core/fsInter/ getSignList
- 请求参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
token | 否 | 是 | String(500) | Token令牌,令牌获取返回值 | |
seatNo | 否 | 否 | String(500) | 坐席号 |
样例:
{
"token": " 337d7f2d8ca54ce1aa0b3146b130dee3"
}
- 应答参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
resultCode | 否 | 是 | String(4) | 0000:成功 0001:账户下不存在该坐席号 | |
resultMsg | 否 | 是 | String(255) | 错误信息 | |
resultData | 是 | 否 | List | 返回信息 | |
acc_id | 否 | resultData | 是 | String(255) | 所属账户 |
seat_no | 否 | resultData | 是 | String(255) | 坐席账号 |
reg_status | 否 | resultData | 是 | String(255) | 签入状态 Available:签入 Logged Out:签出 On Break:无效状态,一般不会有该状态,建议删除坐席重新创建 |
seat_status | 否 | resultData | 是 | String(255) | 坐席状态 Idle:忙 Waiting:闲 Receiving:振铃 In a queue call:通话中 |
样例:
{
"resultCode": "0000",
"resultMsg": "操作成功!",
"resultData": [
{
"reg_status": "Available",
"seat_status": "Waiting",
"seat_no": "1004",
"acc_id": "fsacc001"
}
]
}
- IVR导航类
- IVR上传
- 业务流程
本接口为单个IVR上传,功能包括创建和修改(上传及启用),无论创建还是修改都要提交全部参数,系统会删除原有IVR后重新生成新的IVR,一个账户下会有多个IVR流程,例如:
1、 周一至周五的08:00:00-16:59:59点是上班时间的IVR。
2、 周一至周五的0:00:00-08:00:00点是下班时间IVR
3、 周一至周五的17:00:00-23:59:59点是下班时间IVR,
4、 周六至周日的0:00:00-23:59:59为休息日的IVR。
虽然2、3、4可能都是一样的IVR内容,但是也要单独上传,系统不根据工作或非工作时间区分IVR,只根据时间段区分
- 接口地址
http://ip:port/fs-core/fsInter/createIvr
- 请求参数
字段名称 | 父节点名称 | 是否为父节点 | 是否必传 | 类型 | 备注 |
token | 否 | 是 | String(500) | Token令牌,令牌获取返回值 | |
ivrName | 否 | 是 | String(255) | Ivr名称 | |
ivrCode | 否 | 是 | String(255) | Ivr编码,系统内唯一 | |
weekDays | 否 | 是 | String(255) | 生效时间,用逗号分隔 周日=1 周一=2 周二=3 周三=4 周四=5 周五=6 周六=7 | |
beginTime | 否 | 是 | String(255) | 开始时间hh:mm:ss | |
endTime | 否 | 是 | String(255) | 结束时间hh:mm:ss | |
menuList | 是 | 是 | List | Ivr菜单列表 | |
menuCode | menuList | 否 | 是 | String(255) | 菜单编码,系统内唯一 |
subFlag | menuList | 否 | 是 | String(1) | 主菜单标识1主菜单0非主菜单 |
greetLongType | menuList | 否 | 是 | String(1) | 开场语类型 1文字 2语音文件 目前只支持1文字 |
greetLong | menuList | 否 | 是 | String(500) | 开场语文字 |
greetShortType | menuList | 否 | 是 | String(255) | 重复短文字类型 1文字 2语音文件 目前只支持1文字 |
greetShort | menuList | 否 | 是 | String(500) | 重复短文字,播报后规定时间内无操作播放 |
timeout | menuList | 否 | 否 | String(255) | 等待超时时间,毫秒。可不传,默认10000十秒 |
maxFailures | menuList | 否 | 否 | String(255) | 最大按键失败次数。可不传,默认3次 |
maxTimeouts | menuList | 否 | 否 | String(255) | 最大超时次数。可不传,默认3次 |
entryList | menuList | 是 | 否 | List | 按键条目列表 |
pressType | entryList | 否 | 是 | String(1) | 按键类型 1语音播报 2转技能组 3跳转ivr菜单 4返回上一层 |
pressKey | entryList | 否 | 是 | String(1) | 对应按键数0-9、*。建议*作为返回上一层的按键,有些场景可能导致*成为特殊绑定键无法修改成其他功能键 |
mapperContent | entryList | 否 | 否 | String(500) | 对应按键执行的内容,pressType=1、2、3时必填 pressType=1时填写播报的文字内容 pressType=2时填写技能组账户 pressType=3时填写菜单编码menuCode |
样例:
{
"token": "93bc13844b3549588cea206369fe3e59",
"ivrName": "工作日IVR",
"ivrCode": "d130987dcbff472db6bbf1f0b7a8e696",
"weekDays": "2,3,4,5,6",
"beginTime": "08:00:00",
"endTime": "17:00:00",
"menuList":[{
"menuCode": "034d6fb908ac4c8a9f1a8d391351d970",
"subFlag": "1",
"greetLongType": "1",
"greetLong": "欢迎致电呼叫中心系统",
"greetShortType": "1",
"greetShort": "公司简介请按1,人工坐席请按0",
"timeout": "10000",
"maxFailures": "3",
"maxTimeouts": "3",
"entryList":[{
"pressType": "3",
"pressKey": "1",
"mapperContent": "184d6fb9084d4c8a97da6a391356f9l"
},{
"pressType": "2",
"pressKey": "0",
"mapperContent": "support"
}]
},{
"menuCode": "184d6fb9084d4c8a97da6a391356f9l",
"subFlag": "0",
"greetLongType": "1",
"greetLong": "呼叫中心是在一个相对集中的场所,由一批服务人员组成的服务机构.通常利用计算机通信技术,处理来自企业、顾客的电话垂询,尤其具备同时处理大量来话的能力",
"greetShortType": "1",
"greetShort": "重听请按9,返回上一层请按星号键",
"timeout": "10000",
"maxFailures": "3",
"maxTimeouts": "3",
"entryList":[{
"pressType": "1",
"pressKey": "9",
"mapperContent": "呼叫中心是在一个相对集中的场所,由一批服务人员组成的服务机构.通常利用计算机通信技术,处理来自企业、顾客的电话垂询,尤其具备同时处理大量来话的能力"
},{
"pressType": "4",
"pressKey": "*"
}]
}]
}
- 应答参数
序号 | 字段名称 | 是否为父节点 | 是否必传 | 类型 | 备注 |
10.4.1 | resultCode | 否 | 是 | String(4) | 0000:成功 0001: 菜单列表不能为空 0002: 插入entry表失败 0003: 插入menu表失败 0004: 插入ivr主表失败 |
10.4.2 | resultMsg | 否 | 是 | String(255) | 错误信息 |
10.4.3 | resultData | 是 | 否 | Object | 返回信息 |
样例:
{
"resultCode": "0000",
"resultMsg": "操作成功!",
"resultData": null
}
- IVR状态设置
- 业务流程
设置单个IVR状态,包括启用、禁用、删除(删除无法恢复)。
- 接口地址
http://ip:port/fs-core/fsInter/ivrStatusSet
- 请求参数
字段名称 | 父节点名称 | 是否为父节点 | 是否必传 | 类型 | 备注 |
token | 否 | 是 | String(500) | Token令牌,令牌获取返回值 | |
ivrCode | 否 | 是 | String(255) | Ivr编码,系统内唯一 | |
status | 否 | 是 | String(1) | 设置状态 0:启用 1:禁用 2:删除 |
样例:
{
"token": "93bc13844b3549588cea206369fe3e59",
"ivrCode": "d130987dcbff472db6bbf1f0b7a8e696",
"status": "0"
}
- 应答参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
resultCode | 否 | 是 | String(4) | 0000:成功 0001: 状态码错误 0002:账户下不存在该ivr | |
resultMsg | 否 | 是 | String(255) | 错误信息 | |
resultData | 是 | 否 | Object | 返回信息 |
样例:
{
"resultCode": "0000",
"resultMsg": "操作成功!",
"resultData": null
}
- IVR查询
- 业务流程
查询账户下IVR列表
- 接口地址
http://ip:port/fs-core/fsInter/ivrQuery
- 请求参数
字段名称 | 父节点名称 | 是否为父节点 | 是否必传 | 类型 | 备注 |
token | 否 | 是 | String(500) | Token令牌,令牌获取返回值 | |
ivrCode | 否 | 否 | String(255) | Ivr编码,系统内唯一 |
样例:
{
"token": "93bc13844b3549588cea206369fe3e59"
}
- 应答参数
字段名称 | 是否为父节点 | 父节点名称 | 是否必传 | 类型 | 备注 |
resultCode | 否 | 是 | String(4) | 0000:成功 0001: 状态码错误 0002:账户下不存在该ivr | |
resultMsg | 否 | 是 | String(255) | 错误信息 | |
resultData | 是 | 否 | List | IVR列表 | |
acc_id | 否 | resultData | 是 | String(255) | 所属账户 |
ivr_name | 否 | resultData | 是 | String(255) | Ivr名称 |
ivr_code | 否 | resultData | 是 | String(255) | Ivr编码 |
week_days | 否 | resultData | 是 | String(255) | 生效时间 |
begin_time | 否 | resultData | 是 | String(255) | 开始时间 |
end_time | 否 | resultData | 是 | String(255) | 结束时间 |
able_flag | 否 | resultData | 是 | String(1) | 状态标识 0:启用 1:禁用 |
menu_list | 是 | resultData | 否 | List | 菜单列表 |
menu_code | 否 | menu_list | 是 | String(255) | 菜单编码 |
sub_flag | 否 | menu_list | 是 | String(1) | 主菜单标识 1主菜单0非主菜单 |
greet_long_type | 否 | menu_list | 是 | String(1) | 开场语类型 1文字 2语音文件 目前只支持1文字 |
greet_long | 否 | menu_list | 是 | String(500) | 开场语文字 |
greet_short_type | 否 | menu_list | 是 | String(1) | 重复短文字类型 1文字 2语音文件 目前只支持1文字 |
greet_short | 否 | menu_list | 是 | String(500) | 重复短文字,播报后规定时间内无操作播放 |
max_failures | 否 | menu_list | 是 | String(255) | 最大按键失败次数 |
max_timeouts | 否 | menu_list | 是 | String(255) | 最大超时次数 |
timeout | 否 | menu_list | 是 | String(255) | 等待超时时间,毫秒 |
entry_list | 是 | menu_list | 否 | List | 按键条目列表 |
press_type | 否 | entry_list | 是 | String(1) | 按键类型 1语音播报 2转技能组 3跳转ivr菜单 4返回上一层 |
press_key | 否 | entry_list | 是 | String(1) | 对应按键数0-9、*。 |
mapper_content | 否 | entry_list | 是 | String(500) | 对应按键执行的内容 |
样例:
{
"resultCode": "0000",
"resultMsg": "操作成功!",
"resultData": [
{
"ivr_name": "工作日IVR",
"menu_list": [
{
"greet_long": "欢迎致电呼叫中心系统",
"max_failures": "3",
"greet_short": "公司简介请按1,人工坐席请按0",
"menu_code": "034d6fb908ac4c8a9f1a8d391351d970",
"max_timeouts": "3",
"entry_list": [
{
"press_key": "0",
"press_type": "2",
"mapper_content": "support"
},
{
"press_key": "1",
"press_type": "3",
"mapper_content": "80583401_menu_184d6fb9084d4c8a97da6a391356f9l"
}
],
"sub_flag": "1",
"timeout": "10000",
"greet_long_type": "1",
"greet_short_type": "1"
},
{
"greet_long": "呼叫中心是在一个相对集中的场所,由一批服务人员组成的服务机构.通常利用计算机通信技术,处理来自企业、顾客的电话垂询,尤其具备同时处理大量来话的能力",
"max_failures": "3",
"greet_short": "重听请按9,返回上一层请按星号键",
"menu_code": "184d6fb9084d4c8a97da6a391356f9l",
"max_timeouts": "3",
"entry_list": [
{
"press_key": "*",
"press_type": "4"
},
{
"press_key": "9",
"press_type": "1",
"mapper_content": "呼叫中心是在一个相对集中的场所,由一批服务人员组成的服务机构.通常利用计算机通信技术,处理来自企业、顾客的电话垂询,尤其具备同时处理大量来话的能力"
}
],
"sub_flag": "0",
"timeout": "10000",
"greet_long_type": "1",
"greet_short_type": "1"
}
],
"able_flag": 0,
"end_time": "23:00:00",
"week_days": "1,2,3,4,5,6,7",
"begin_time": "08:00:00",
"ivr_code": "d130987dcbff472db6bbf1f0b7a8e696",
"acc_id": "fsacc001"
}
]
}
错误码 | 错误信息 |
0000 | 成功 |
1002 | 参数缺失 |
1003 | token校验失败 |
9999 | 系统异常 |