呼叫工具条详细说明
呼叫工具条 SDK 登录、加载、事件、方法、Safari/iOS 授权和样式说明。
呼叫工具条
呼叫工具条功能作为一个嵌入式插件提供给需要呼叫工具条的第三方网站使用。建议第三方在需要嵌入的页面加载成功后,通过异步接口向自己服务器端发起请求,获取工具条的SDK地址,并完成工具条SDK加载以及外呼拨号对接后即可使用。在异步接口中,第三方需要根据当前登录的客服,获取客服对应的账号信息,向七鱼发起HttpClient请求,来获取七鱼动态生成的SDK文件地址。前端页面拿到SDK地址之后,将其作为js文件进行加载即可完成工具条的初始化,再配合工具条提供的拨号接口,即可完成工具条功能的接入。
功能使用步骤拆解:
步骤1: 向自己服务器端发起异步请求,获取工具条的`SDK`地址;
步骤2: 加载SDK并进行初始化设置;
步骤3: (按需使用) 初始化完成后,进行SDK接口调用;注意
确保使用https协议的页面
由于呼叫工具条使用了 webRTC 功能,必须在https页面中加载呼叫工具条(本地调试可以使用 localhost 页面)
Safari 浏览器和 iOS webview 登录注意事项
由于Safari浏览器对第三方 Cookie的限制 (opens new window),Safari浏览器和iOS webview无法按正常流程无感登录,需要用户进行额外的操作:
1. 监听cookieAccessibleChanged事件
代码示例:
qiConnect.on({cookieAccessibleChanged: function(data){
if (data.result) {
console.log('此时可以获取cookie');
} else {
console.log('没有获取cookie权限');
// 【非常重要】如果已经隐藏了工具条,请务必暂时将工具条置为可见状态,才能点击按钮授权
}
}});该事件会监听呼叫工具条获取cookie权限的变化,当可以正常获取cookie时,无需其他操作;如果呼叫工具条没有获取cookie的权限,界面会展示一个【获取授权】按钮:
2. 点击按钮授权
点击【获取授权】按钮,浏览器会打开一个新的tab页,提示授权成功。点击页面内的【确定】按钮,该页面会关闭,回到加载呼叫工具条的页面
3. 再次授权
回到加载呼叫工具条的页面后,可以看到原来的【获取授权】按钮变为【请再次获取授权】,点击按钮,即可加载呼叫工具条。同时也会监听到cookieAccessibleChanged事件,提示此时可以正常获取cookie
说明
以上流程不是每次加载呼叫工具条都必须操作。根据Webkit的说法,如果用户在30天内在授权成功页面点击过【确定】按钮,呼叫工具条可以正常获取cookie,此时呼叫功能会无感加载
获取SDK接入地址
第三方向七鱼请求SDK接入地址的时候,七鱼会执行客服在七鱼的登录事件,并生成含动态口令的SDK接入地址返回给第三方
接口调用及数据校验规则参考上面营销接口调用及校验
接口请求地址
POST http://qiyukf.com/openapi/ipcc/login?appKey=1c088a89de51d0af457616605f28390f&checksum=f570a5eb049eb803b086e45829b07e48&time=1511832531请求参数
Query
参考 通用说明 - 数据校验
| 参数 | 数据类型 | 是否必须 | 参数说明 |
|---|---|---|---|
| appKey | String | 是 | 企业appkey |
| time | Integer | 是 | 当前 UTC 时间戳,从 1970 年 1 月 1 日 0 点 0 分 0 秒开始到现在的秒数 |
| checksum | String | 是 | SHA1(appSecret + md5 + time), 三个参数拼接的字符串,进行SHA1哈希计算,转化成16进制字符(String,小写) |
Body
| 参数 | 是否必须 | 数据类型 | 参数说明 |
|---|---|---|---|
| staffName | 是 | String | 使用工具条的客服在七鱼这边对应的客服名(此处对应的参数值为客服账号) |
返回参数
接口返回数据为JSON格式,最外层参数如下:
| 参数 | 参数说明 |
|---|---|
| code | 错误码。200表示设置成功。 |
| result | code为200时,返回值有效。 |
| message | 请求错误时,填错误提示信息 |
如果code等于200表示客服登录成功,result内容为json数据
result内的参数说明如下:
| 参数 | 数据类型 | 参数说明 |
|---|---|---|
| sdk_url | String | 生成的含动态登录口令的SDK接入地址 |
| corp_code | String | 登录客服对应的七鱼企业域名 |
| token | String | 动态登录口令 |
示例
请求示例
curl请求样例如下
curl -X POST \
'[http://qiyukf.com/openapi/ipcc/login?appKey=1c088a89de51d0af457616605f28390f&checksum=f570a5eb049eb803b086e45829b07e48&time=1511832531](http://qiyukf.com/openapi/ipcc/login?appKey=1c088a89de51d0af457616605f28390f&checksum=f570a5eb049eb803b086e45829b07e48&time=1511832531)' \
-H 'content-type: application/json;charset=utf-8' \
-d '{"staffName": "admin"}'返回示例
{
"code": 200,
"message": "",
"result": {
"sdk_url": "[https://xxx.qiyukf.com/toolbar/script/get?token=cb1ec3c43089493eb4039945685ebf51](https://xxx.qiyukf.com/toolbar/script/get?token=cb1ec3c43089493eb4039945685ebf51)",
"corp_code": "xxx",
"token": "cb1ec3c43089493eb4039945685ebf51"
}
}初始化SDK
前端页面通过上面异步接口获得sdk_url之后,动态加载这个sdk_url对应的js文件,即可完成工具条的初始化
动态加载js样例
// 呼叫工具条的加载、销毁、重新加载(代码仅供参考)
// 工具方法-加载script
const loadScript = (options = {}) => new Promise((resolve, reject) => {
const script = document.createElement('script');
Object.assign(script, options);
script.addEventListener('load', () => resolve(script));
script.addEventListener('error', reject);
document.body.appendChild(script);
});
class Adaptor {
// 呼叫工具条加载状态枚举
static loadStatusMap = {
0: '未加载',
1: '加载中',
2: '加载成功',
3: '加载失败',
4: '已销毁',
}
constructor() {
// 初始化属性
Object.assign(this, {
script: null, // script元素
loadStatus: 0 // 工具条加载状态
});
}
// 加载工具条
async load() {
const adaptor = this;
adaptor.loadStatus = 1; // 工具条加载中
try {
// login需要自己实现,参考上面的【获取SDK接入地址】
const { sdk_url } = await login();
// 在页面中插入script标签,src为sdk_url
// 这个script会在window上添加qiConnect对象,提供一系列API
adaptor.script = await loadScript({
async: true,
src: sdk_url
});
if(!window.qiConnect.CODE) {
// 如果window.qiConnect.CODE不存在,说明token过期
adaptor.loadStatus = 3; // 工具条加载失败
return Promise.reject(new Error('token过期'))
}
// 监听呼叫工具条事件
window.qiConnect.on({
onload() {
this.loadStatus = 2; // 工具条加载成功
},
initSuccess() {
// 呼叫功能初始化成功
// 如果使用软电话模式,可以设置坐席状态为在线
qiConnect.setStatus([1])
},
session() {
// 通话开始
}
});
return Promise.resolve(window.qiConnect)
} catch (error) {
adaptor.loadStatus = 3; // 工具条加载失败
return Promise.reject(error)
}
}
// 登出并销毁工具条
async logoffAndDestroy() {
try {
await window.qiConnect?.logoffAsync(); // 登出工具条
} catch(_error) {}
window.qiConnect?.clean(); // 销毁工具条UI
// 销毁load方法插入的script标签
this.script?.remove();
this.script = null;
this.loadStatus = 4; // 工具条已销毁
}
// 重新加载工具条
async reload() {
await this.logoffAndDestroy();
return this.load();
}
}
const adaptor = new Adaptor();
// 加载失败时重新加载
adaptor.load().catch(() => {
adaptor.reload();
});呼叫工具条加载完成后,会在接入页面添加id为CONTAINER-CC-TOOLBAR的工具条容器元素,可通过定义该容器的样式,定制呼叫工具条的位置以及叠放层级。
自定义样式示例
<style>
#CONTAINER-CC-TOOLBAR {
top: 100px;
right: 100px;
z-index: 100001;
}
</style>
呼叫工具条SDK加载完成后,SDK会在全局对象window上挂载qiConnect对象,该对象实现了SDK 接口功能:SDK事件、SDK方法。
SDK事件
qiConnect对象提供了一系列事件监听功能,通过qiConnect.on({ [eventType]:[eventHandler] })进行注册。
注意: SDK事件操作需要在sdk脚本加载完成后才能注册监听。
| 事件 eventType | 说明 |
|---|---|
| onload | 加载成功 |
| initSuccess | 初始化成功 |
| session | 会话开始 |
| answered | 会话接通 |
| byeFailed | 通话挂断失败 |
| sessionClose | 会话结束 |
| statusOptionsChanged | 状态可选项变更 |
| statusChanged | 状态设置成功 |
| statusChangeFailed | 状态设置失败 |
| overProcess | 完成处理 |
| acceptedByKefu | 双向回呼,客服已接起 |
| asrContentUpdate | asr识别结果 |
| cookieAccessibleChanged | 【Safari浏览器、iOS webview】获取cookie权限发生变化 |
| refresh | 页面刷新 |
| error | 呼叫工具条出现异常 |
加载完成 onload
工具条加载完成后,可进行面板操作或调用SDK方法。
使用方式
qiConnect.on({onload: function(){
// other code ……
}});初始化成功 initSuccess
工具条初始化完成后,可以设置状态
使用方式
qiConnect.on({initSuccess: function(){
// other code ……
}});会话开始事件 session
呼叫会话的创建事件,包括外呼和呼入。监听该事件可获取当前会话信息。
使用方式
qiConnect.on({session: function(data){
// other code ……
}});data字段
| 名称 | 类型 | 含义 |
|---|---|---|
| sessionid | Number | 会话id |
| address | String | 号码归属地 |
| usernumber | Number | 客户号码 |
| staffnumber | Number | 坐席号码 |
| staffid | Number | 坐席id |
| staffname | String | 坐席名 |
| direction | Number | 会话方向 1 呼入 2 呼出 |
| ivrpathname | String | IVR路径名称 格式:节点名称1-节点名称2……-节点名称N |
| sessionIdFrom | Number | 转接至该会话的上一通会话id |
会话结束事件 sessionClose
呼叫会话的结束事件,包括呼出和呼入。监听该事件可获取当前会话信息。
使用方式
qiConnect.on({sessionClose: function(data){
// other code ……
}});data字段
| 名称 | 类型 | 含义 |
|---|---|---|
| address | Number | 号码归属地 |
| usernumber | Number | 客户号码 |
| sessionid | Number | 会话id |
| staffid | Number | |
| staffname | Number | 坐席名 |
| throughData | string | call(numbers, throughData)方法透传字段 |
会话接通事件 answered
表示会话双方已准备就绪,可以开始通话。当呼叫会话为呼入时,坐席接起电话后触发的事件 或者 当呼叫会话为呼出时,被外呼客户接起后触发的事件。监听该事件可获取当前会话的拨号方式和接起方式。
使用方式
qiConnect.on({ answered: function(data){
// other code ……
}});data字段
| 名称 | 类型 | 含义 |
|---|---|---|
| direction | String | "IN" 呼入通话 "OUT" 外呼通话 |
| type | String | "SIP" sip话机 "AUTOANSWER" 自动应答 "CALLPANEL" 面板点击 "" 外呼通话接起类型未知 |
通话挂断失败事件 byeFailed
当执行挂断通话的操作失败后触发,如当前处于非通话状态时,调用了bye()方法,故建议在有answered事件相应后调用bye()方法。监听该事件可获取失败原因。
使用方式
qiConnect.on({ byeFailed: function(data){
// other code ……
}});data字段
| 名称 | 类型 | 含义 |
|---|---|---|
| hasError | Boolean | 是否有错误 |
| cause | String | 挂断失败的具体原因 |
坐席可选状态变更事件 statusOptionsChanged
坐席可选状态变更事件,当软电话、SIP话机、手机在线等服务模式发生变更时,伴随着坐席可用状态的变更,此事件会通知变更信息。
使用方式
qiConnect.on({statusOptionsChanged: function(data){
// other code ……
}});data字段
| 名称 | 类型 | 含义 |
|---|---|---|
| status | Array | 当前状态 |
| statusOptions | Array | 可选状态选项 |
坐席状态设置成功事件 statusChanged
坐席状态设置成功事件,工具条坐席当前状态发生变更,此事件会通知变更成功的状态。
使用方式
qiConnect.on({statusChanged: function(data){
// other code ……
}});data字段
| 名称 | 类型 | 含义 |
|---|---|---|
| status | Array | 当前设置的状态 |
data.status枚举如下(管理端设置、电话模式等设置可能会导致某些状态不会出现):
| status值 | 含义 | 备注 |
|---|---|---|
| ['0'] | 离线 | |
| ['1'] | 软电话在线 | |
| ['2', 小休细分状态] | 小休 | 例如小休-就餐,对应值为['2', '1'] |
| ['3'] | 通话中 | |
| ['4'] | 手机在线 | |
| ['5'] | sip话机在线 | |
| ['6'] | 挂起 | |
| ['7'] | 处理中 | |
| ['8'] | 自动外呼 |
小休细分状态枚举如下(管理端设置可能会导致某些状态不会出现):
| 小休细分状态值 | 含义 |
|---|---|
| '0' | 无细分状态 |
| '1' | 就餐 |
| '2' | 会议 |
| '3' | 培训 |
| '4' | 休息 |
| '5' | 洗手间 |
| '6' | 其他 |
坐席状态设置失败事件 statusChangeFailed
坐席状态设置失败事件,此事件会通知变更失败的状态以及失败原因。
使用方式
qiConnect.on({statusChangeFailed: function(data){
// other code ……
}});data字段
| 名称 | 类型 | 含义 |
|---|---|---|
| status | Array | 设置的状态 |
| errorMsg | string | 失败信息 |
完成处理事件 overProcess
使用方式
qiConnect.on({overProcess: function(data){
// other code ……
}});data字段
| 名称 | 类型 | 含义 |
|---|---|---|
| address | string | 号码归属地 |
| sessionid | number | 会话id |
| staffid | number | 坐席id |
| staffname | string | 坐席账号 |
| usernumber | string | 客户号码 |
双向回呼,客服已接起 acceptedByKefu
使用方式
qiConnect.on({acceptedByKefu: function(data){
// other code ……
}});data字段
| 名称 | 类型 | 含义 |
|---|---|---|
| sessionid | number | 会话id |
asr识别结果事件 asrContentUpdate
使用方式
qiConnect.on({asrContentUpdate: function(data){
// other code ……
}});data字段
| 名称 | 类型 | 含义 |
|---|---|---|
| content | string | 音频内容 |
| createTime | number | 消息生成时间 |
| userType | 0 | 1 | 音频来源方类型:0-坐席 1-访客 |
| userId | string | 坐席或访客id |
| userName | string | 坐席或访客名称 |
获取cookie权限发生变化【只对Safari浏览器、iOS Webview生效】 cookieAccessibleChanged
使用方式
qiConnect.on({cookieAccessibleChanged: function(data){
if (data.result) {
console.log('此时可以获取cookie');
} else {
console.log('没有获取cookie权限');
// 此时工具条会展示授权按钮
// 如果已经隐藏了工具条,请务必暂时将工具条置为可见状态,才能点击按钮授权
}
}});data字段
| 名称 | 类型 | 含义 |
|---|---|---|
| result | boolean | 是否有获取cookie权限 |
呼叫工具条出现异常 error
使用方式
const errorTypeMap = {
'out-call': '外呼错误',
'in-call': '呼入错误',
'rights': '权限错误',
'consult': '咨询转接错误',
'intercom': '内部通话错误',
'conference': '多方通话错误',
'status': '设置状态错误',
'others': '其他错误',
}
qiConnect.on({error: function(data){
const { type, message = '' } = data;
console.error(`出现异常,错误类型:${errorTypeMap[type] || errorTypeMap.others},错误信息:${message}`);
}});data字段
| 名称 | 类型 | 含义 |
|---|---|---|
| type | 'out-call' | 'in-call' | 'rights' | 'consult' | 'intercom' | 'conference' | 'status' | 'others' | 错误类型,具体含义参考代码示例 |
| message | string | 错误信息 |
SDK方法
qiConnect对象提供了一系列方法。 需要在qiConnect的onload事件完成(呼叫功能加载完成)之后才能执行。使用格式 qiConnect.fn(), fn如下:
注意: SDK操作需要在qiConnect的onload事件完成(呼叫功能加载完成)之后才能执行。
| 方法 Method | 说明 |
|---|---|
| config() | 个性化配置 |
| call() | 外呼 |
| bye() | 挂断当前通话 |
| logoff() | 账号登出(同步) |
| logoffAsync() | 账号登出(异步) |
| clean() | 销毁工具条 |
| setStatus() | 设置坐席状态 |
| setMode() | 设置呼叫服务模式 |
| keepPanelUnfold() | 面板保持展开 |
| getCaptcha() | 获取手机验证码 |
| bindPhone() | 绑定手机号 |
| exportLocaleLogs() | 导出本地日志 |
| toggle() | 展开/收起面板 |
| setNumber() | 设置拨号盘号码 |
| cancelAfterFail | 外呼失败后,跳过重拨状态 |
| recallAfterFail | 外呼失败后,重拨 |
个性化配置 qiConnect.config(options: {preserveNumber?: boolean})
加载工具条后,进行个性化配置
传参释义
| 名称 | 类型 | 默认值 | 含义 |
|---|---|---|---|
| options | {preserveNumber?: boolean; ignoreRefresh?: boolean;applyCallInSummary?: boolean;} | {preserveNumber: false, ignoreRefresh: false,applyCallInSummary: false,} | 必填;options.preserveNumber-通话结束后,呼叫面板是否保留对方号码options.ignoreRefresh-关闭页面是否跳过弹窗提示、忽略刷新事件options.applyCallInSummary-是否开启来电摘要 |
使用样例
qiConnect.on({
// 要在呼叫工具条加载后(ready事件)进行配置
ready(){
qiConnect.config({
preserveNumber: true, // 通话结束后,在呼叫面板中保留对方号码
ignoreRefresh: true, // 关闭页面不弹窗提示、不通知刷新事件
applyCallInSummary: true, // 开启来电摘要
});
}
})外呼拨号 qiConnect.call(options)
该接口实现了一键外呼的功能,传入需要外呼的号码直接调用即可。
传参释义
| 名称 | 类型 | 含义 |
|---|---|---|
| options | {number?: string;throughData?: any;thirdPartyClueId?: string;} | options.number-外呼号码options.throughData-透传字段,该字段会通过JSON.stringify()进格式化处理,当通话结束时通过sessionClose事件进行回传options.thirdPartyClueId-线索id,根据线索id外呼时使用,需配置CRM接口、联系七鱼技术支持同学开启白名单。传入此参数时options.number参数不生效 |
使用样例
<form onsubmit="return false;" id="yyy">
<p id="call">外呼号码<input type="text" name="mobile" />
<input type="button" value="外呼" name="buttonCall" />
</p>
</form>document.getElementById('yyy').buttonCall.onclick = function() {
if (!form.mobile.value) return alert('请输入电话号码');
qiConnect.call({
numbers: form.mobile.value
});
}挂断通话 qiConnect.bye()
该接口实现了挂断当前通话的功能,直接调用即可。如当前处于非通话状态时无法执行操作,强行调用会有异常错误相应可通过监听事件处理, 建议在answered事件响应后进行挂断场景处理。
使用样例
<form onsubmit="return false;" id="yyy">
<p id="call">外呼号码<input type="text" name="mobile" />
<input type="button" value="挂断" name="buttonBye" />
</p>
</form>
var isCalling = false;
qiConnect.on({
answered: function(data){
isCalling = true;
},
sessionClose: function() {
isCalling = false;
},
byeFailed: function(data) {
alert('挂断异常:'+data.cause);
}
});
document.getElementById('yyy').buttonBye.onclick = function() {
if(isCalling){
qiConnect.bye();
}
}退出系统(同步方法) qiConnect.logoff()
该接口实现了退出七鱼系统的功能,直接调用即可。退出后工具条所有功能将不可用,若想再次启用呼叫功能需重新走一遍功能使用的几个步骤。
使用样例
<form onsubmit="return false;" id="exampleLogoff">
<input type="button" value="退出七鱼工具条" name="buttonLogoff" />
</form>document.getElementById('exampleLogoff').buttonLogoff.onclick = function() {
// some code...
var conditionLogoffQiyu = true; //退出七鱼系统的条件
if (conditionLogoffQiyu) {
window.qiConnect.logoff();
}
// some code...
}退出系统(异步方法) qiConnect.logoffAsync()
该接口实现了退出七鱼系统的功能,直接调用即可。退出后工具条所有功能将不可用,若想再次启用呼叫功能需重新走一遍功能使用的几个步骤。
使用样例
<form onsubmit="return false;" id="exampleLogoffAsync">
<input type="button" value="退出七鱼工具条" name="buttonLogoffAsync" />
</form>document.getElementById('exampleLogoffAsync').buttonLogoffAsync.onclick = function() {
// some code...
var conditionLogoffQiyu = true; //退出七鱼系统的条件
if (conditionLogoffQiyu) {
// 使用Promise
window.qiConnect.logoffAsync().then(() => {
console.log('登出成功')
}).catch(({ message }) => {
console.error(message)
});
// 使用回调
window.qiConnect.logoffAsync({}, ({ status, message }) => {
if (status) {
console.log('登出成功')
} else {
console.error(message)
}
})
}
// some code...
}销毁工具条 qiConnect.clean()
销毁工具条,为重新加载做准备:
- 销毁注册的事件
- 销毁界面
- 还原内部状态
- 清除window.qiConnect对象 一般在logoffAsync api之后调用
设置坐席状态 qiConnect.setStatus(status)
该接口实现了重置坐席服务状态的功能,需传入当前服务模式可用的坐席状态。
@param status {Array} 初始化成功后状态默认为qiConnect.status, 可设置状态来自qiConnect.statusOptions, 当服务模式(软电话/SIP话机/手机在线)发生改变时, 可选坐席状态也将发生对应更新,可通过事件statusOptionsChanged获取更新的状态信息
qiConnect.statusOptions {Array} 可状态列表,格式 [{ label , value, children} ]
示例
// qiConnect.statusOptions
[
{ "label": "离线", "value": "0" },
{ "label": "小休", "value": "1",
"children": [
{ "label": "会议", value: "0" }
]
},
...
]使用样例
<form onsubmit="return false;" id="yyy">
<label> 请选择状态:
<select name="chooseStatus">
// qiConnect.statusOptions 当前可选状态
<option value="statusOption.value">statusOption.label</option>
</select>
</label>
</form>const selectElement = document.querySelector('[name="chooseStatus"');
selectElement.addEventListener('change', (event) => {
const status = event.target.value;
// 可选状态若存在二级状态 参数格式示例 [status, subStatus]
qiConnect.setStatus([status]);
});设置呼叫服务模式 qiConnect.setMode(options, callback)
该接口实现了设置呼叫服务模式的功能,类型为({ mode: 0 | 1 | 2 | 3 }, ({ status: boolean; message: string; statusOptions: number[]; }) => void) => Promise<{ status: boolean; message: string; statusOptions: number[]; }>;
大部分场景下可以通过回调函数获取设置结果,包含是否设置成功、提示信息、新模式下可选坐席状态等数据;
如果浏览器支持Promise,可以不传回调函数,setMode方法会返回promise,在then和catch中获取以上信息
传参释义
| 名称 | 类型 | 含义 |
|---|---|---|
| options | { mode: 0 | 1 | 2 | 3 } | 必填;0-软电话 1-手机在线 2-sip话机 3-双向回呼 |
| callback | ({ status: boolean; message: string; statusOptions: number[]; }) => void | 选填;status-是否设置成功;message-提示信息;statusOptions-在新模式下可选坐席状态,qiConnect.setStatus会用到 |
使用样例
// 在回调函数中进一步处理流程
// 切换为软电话模式
qiConnect.setMode({ mode: 0 }, ({ status, message, code }) => {
if (status) {
// 呼叫服务模式设置成功
console.info('服务模式设置成功');
} else {
// 呼叫服务模式设置失败
console.error('服务模式设置失败', message);
// 如果code为18051,表示没有设置转接的手机号码,此时需要获取验证码
if (code === 18051) {
// 输入手机号
const mobile = prompt('请输入手机号');
// 获取手机验证码
qiConnect.getCaptcha({ mobile })
.then(() => {
console.info('获取手机验证码成功');
}).then(() => {
// 输入验证码
const captcha = prompt('请输入手机验证码');
return qiConnect.bindPhone({ mobile, captcha })
}).then(() => {
console.info('绑定手机号成功');
}).catch(({ message }) => {
// 获取手机验证码/绑定手机号失败
console.error(message);
});
}
}
});
// 在promise中进一步处理流程
// 切换为sip话机模式
qiConnect.setMode({ mode: 2 }).then(() => {
// 呼叫服务模式设置成功
console.info('服务模式设置成功');
}).catch(({ message, code }) => {
// 呼叫服务模式设置失败
console.error('服务模式设置失败', message);
// 如果code为18051,表示没有设置转接的手机号码,此时需要获取验证码
if (code === 18051) {
// 输入手机号
const mobile = prompt('请输入手机号');
// 获取手机验证码
qiConnect.getCaptcha({ mobile })
.then(() => {
console.info('获取手机验证码成功');
}).then(() => {
// 输入验证码
const captcha = prompt('请输入手机验证码');
return qiConnect.bindPhone({ mobile, captcha })
}).then(() => {
console.info('绑定手机号成功');
}).catch(({ message }) => {
// 获取手机验证码/绑定手机号失败
console.error(message);
});
}
});设置面板保持展开状态 qiConnect.keepPanelUnfold(flag)
该接口实现了面板保持展开状态的功能。面板默认不展开,通话接通时若面板为展开状态则会自动收起,如需面板一直保持展开状态可使用该功能,设置成功后,点击工具条依然可以手动操作展开和收起动作,或根据需求取消该功能。
@param flag {boolean} 默认为 false
示例场景-初始化成功后一直保持展开
使用样例
qiConnect.on({
onload: () => {//呼叫工具条加载完毕的事件通知
console.log('demo info: 呼叫工具条加载完毕!');
qiConnect.keepPanelUnfold(true);
}
});获取手机验证码 qiConnect.getCaptcha(options, callback)
使用手机在线或双向回呼模式之前,要绑定客服手机号,为了确保手机号为客服所有,要先获取手机验证码,校验通过后再绑定手机号
传参释义
| 名称 | 类型 | 含义 |
|---|---|---|
| options | { mobile: string } | 必填;options.mobile-手机号 |
| callback | ({ status: boolean; message: string; }) => void | 选填;status-是否获取成功;message-提示信息 |
示例场景-切换到手机在线或双向回呼模式之前
使用样例
// 在回调函数中进一步处理流程
qiConnect.getCaptcha({ mobile: '1xxxxxxxxxx' }, ({ status, message }) => {
if (status) {
console.info('获取手机验证码成功');
} else {
console.error('获取手机验证码失败', message);
}
});
// 在promise中进一步处理流程
qiConnect.getCaptcha({ mobile: '1xxxxxxxxxx' }).then(() => {
console.info('获取手机验证码成功');
}).catch(({ message }) => {
console.error('获取手机验证码失败', message);
});绑定手机号 qiConnect.bindPhone(options, callback)
获取到手机验证码后,绑定客服手机号。切换到手机在线/双向回呼模式都会将通话接通至该手机号
传参释义
| 名称 | 类型 | 含义 |
|---|---|---|
| options | { mobile: string; captcha: string } | 必填;options.mobile-手机号;options.captcha-验证码 |
| callback | ({ status: boolean; message: string; }) => void | 选填;status-是否绑定成功;message-提示信息 |
示例场景-切换到手机在线或双向回呼模式之前,获取手机验证码之后
使用样例
// 输入手机号
const mobile = prompt('请输入手机号');
// 获取手机验证码
qiConnect.getCaptcha({ mobile })
.then(() => {
console.info('获取手机验证码成功');
}).then(() => {
// 输入验证码
const captcha = prompt('请输入手机验证码');
return qiConnect.bindPhone({ mobile, captcha })
}).then(() => {
console.info('绑定手机号成功');
}).catch(({ message }) => {
// 获取手机验证码/绑定手机号失败
console.error(message);
});绑定手机号 qiConnect.exportLocaleLogs(options)
导出储存在本地的呼叫业务日志,会触发浏览器下载txt日志文件,可以转发给七鱼对接同学进行进一步问题排查
传参释义
| 名称 | 类型 | 含义 |
|---|---|---|
| options | { range?: [number, number] } | 选填;options.range-导出日志的起止时间的毫秒数,如果省略该字段,会导出所有日志 |
示例场景-出现呼叫问题时:
// 1. 确认出现问题的大致起止时间
// 假设问题开始时间为2023-12-12 13:10
const startTime = new Date(2023, 11, 12, 13, 10, 0, 0)
// 假设问题结束时间为2023-12-12 13:30
const endTime = new Date(2023, 11, 12, 13, 30, 0, 0)
// 2. 为了导出日志上下文,前后各预留5分钟
const buffer = 5 * 60 * 1000;
const range = [startTime.getTime() - buffer, startTime.getTime() + buffer];
// 3. 导出日志
qiConnect.exportLocaleLogs({ range });
// 4. 把日志文件转发给七鱼对接同学完成处理 qiConnect.overProcess(options, callback)
该接口实现了在处理中状态下,完成处理的功能,类型为({}, ({ status: boolean; message: string}) => void) => Promise<{ status: boolean; message: string;}>;
可以通过回调函数获取调用结果,包含是否操作成功、提示信息;
如果浏览器支持Promise,可以不传回调函数,overProcess方法会返回promise,在then和catch中获取以上信息
传参释义
| 名称 | 类型 | 含义 |
|---|---|---|
| options | {} | 预留字段,传空对象即可 |
| callback | ({ status: boolean; message: string;}) => void | 选填;status-是否设置成功;message-提示信息; |
使用样例
// 当前为处理中状态
// 使用方式1-callback
qiConnect.overProcess({}, ({ status, message }) => {
if (status) {
// 完成处理成功
console.info('完成处理成功');
} else {
// 完成处理失败
console.error('完成处理失败', message);
}
});
// 使用方式2-promise
qiConnect.overProcess({}).then(() => {
// 完成处理成功
console.info('完成处理成功');
}).catch((error) => {
// 完成处理失败
console.error('完成处理失败', error.message);
});展开/收起面板 qiConnect.toggle(open)
该接口实现了控制面板的展开/收起
传参释义
| 名称 | 类型 | 含义 |
|---|---|---|
| open | boolean | 是否展开面板 |
使用样例
qiConnect.toggle(true); // 展开面板
qiConnect.toggle(false); // 收起面板设置拨号盘号码(只支持在非通话中调用) qiConnect.setNumber(options)
该接口实现了在拨号盘中预填号码,但不外呼
传参释义
| 名称 | 类型 | 含义 |
|---|---|---|
| options | {number: string} | options.number-填入拨号盘中的号码 |
使用样例
qiConnect.setNumber({ number: '13000000000' }); // 设置拨号盘中的号码为13000000000,但不外呼外呼失败后,跳过重拨状态(只支持在外呼失败时调用) qiConnect.cancelAfterFail()
该接口实现了外呼失败后,跳过重拨状态
使用样例
// 此时为外呼失败状态
qiConnect.cancelAfterFail(); // 跳过重拨状态,恢复为空闲状态外呼失败后,重拨(只支持在外呼失败时调用) qiConnect.recallAfterFail()
该接口实现了外呼失败后重拨
使用样例
// 此时为外呼失败状态
qiConnect.recallAfterFail(); // 重拨这篇文档有帮助吗?