SDK 3.x 版本已發布,請移步前端SDK文檔接入(3.x),查看接入文檔,2.x版本遷移請查看從2.x版本升級,2.x版本后續不再做新功能開發
通過該文檔,您可以實現將坐席工作臺嵌入到第三方系統中,直接在您的系統中實現單點登錄、接打電話等功能,并且您可以通過監聽SDK中的方法來實現來電彈屏,下面的工作需要您公司的前端工程師來實施。您可以隨時關注該文檔頁面,SDK有更新時會及時更新文檔頁面。
一、前端資源
備注:更新前端資源版本以后,一定要在本地環境做全面測試以后再發布線上環境!
<!-- IM sdk樣式文件,不使用IM插件不要加載此文件-->
<link rel="stylesheet" type="text/css" >
<!-- 軟電話sdk樣式文件-->
<link rel="stylesheet" type="text/css" >
<!-- IM sdk js文件,不使用IM插件不要加載此文件-->
<script type="text/javascript" src="http://g.alicdn.com/code/npm/@ali/cc-im-sdk/{version-im-sdk}/index.js"></script>
<!-- 軟電話sdk js文件-->
<script type="text/javascript" src="http://g.alicdn.com/cloudcallcenter-voip/web-agentbar-sdk/{version-agentbar}/index.js"></script>
<script type="text/javascript" src="http://g.alicdn.com/cloudcallcenter/web-workbench-sdk/{version-workbench}/workbenchSdk.min.js"></script>
以上靜態資源,把上面的{version-im-sdk}、{version-agentbar}和{version-workbench}替換為對應的版本號,當前最新版本號為:
version-im-sdk ==> 0.5.8 // 最新版本請前往3.x版本文檔查看
version-agentbar ==> 2.4.0
version-workbench ==> 2.16.0 // 最新3.x版本,請前往更新
注意:以上js文件必須按照順序加載,有相互依賴的關系。只使用軟電話SDK則不需要加載IM sdk的文件,但是只使用IM SDK的話,所有文件都必須加載。
如要兼容Android、iOS和Safari瀏覽器,請添加WebRTC相關補充庫,例如被廣泛支持的Adapter.js(在web-agentbar-sdk之前加載)。
二、初始化SDK
接入SDK之前需要做的工作:
必須使用Chrome瀏覽器,版本號為58以上。原因是云呼叫中心的通話是通過WebRTC技術實現的,目前Chrome瀏覽器對WebRTC技術的支持是相對最好的。為了保證您的通話質量及安全性,所以我們做出了這樣的要求。
軟電話SDK所嵌入的自有業務系統必須使用HTTPS協議。原因是chrome在47版本之后,禁止http協議獲取系統麥克風權限,會造成無法正常通話。
如果您是在iframe標簽內使用軟電話SDK,那么需要為iframe標簽增加allow="microphone"屬性,來允許iframe標簽獲取系統麥克風權限。
初始化SDK:
window.workbench = new WorkbenchSdk(config)
三、config必選配置
dom
掛載元素id
instanceId
創建呼叫中心實例填寫的域名,
https://ccc.console.aliyun.com/AccV2Instance
訪問地址中workbench/xxx/agentdest中間的字符串(xxx就是實例id),參照下圖
regionId
云呼服務器部署的集群,如果沒有特殊說明,為'cn-shanghai'
四、config可選配置
header
是否展示頭部(小休,下線,場外模式接聽等),默認展示,參數類型:Boolean
width
寬度,默認320px,參數類型:Number;
height
高度,默認580px,參數類型:Number;(為了保證完整的UI展示,建議高度最低580px);
defaultVisible
默認是否展示面板,默認為true,參數類型:Boolean;
defaultMainContentVisible
默認是否展開軟電話面板,默認為true,參數類型:Boolean;
offlineImage
下線展示的靜態圖片地址,參數類型:String;
breakImage
小休展示的靜態圖片地址,參數類型:String;
afterCallRule
掛機后進入空閑狀態的時間,單位秒,默認15秒,參數類型:Number;
等待客服手動去從話后處理切換到空閑狀態,為”manual”;
autoAnswerCall
有來電時自動接聽電話的時長,單位秒,默認為手動接聽,參數類型:Number;
isLoggedKeepBreak
是否在登錄時保持小休狀態(不想在業務繁忙時上線立即接電話可設置為true)
目前是登錄時從小休默認自動變為空閑狀態
isLoggedInvisibility 「version-workbench: 2.12.2」
是否在登錄時保持隱身狀態,目前登錄時會處于
isOutboundNotReceivedToBeProcessed
是否在外呼時未接聽也流轉到話后處理(當前是未接通后到話后處理狀態,再立即到空閑狀態)
exportErrorOfApi
Toast提示接口的錯誤信息、ApiName、ErrorCode、RequestId,當接口出現錯誤時,提供錯誤信息,
便于后端排查問題。默認是false,可根據需要是否Toast錯誤消息。
moreActionList
在頭部的功能模塊的按鈕列表,
值可為["online", "ready", "onlyCall", "break", "offline", "adjustVolume", "changeWorkMode"],
分別對應[上線, 結束小休, 隱身, 小休, 下線, 調節音量, 場外模式接聽],用戶可根據需求選擇配置項,參數類型:Array
默認值:["break", "offline", "adjustVolume", "changeWorkMode"]
注意:
1. 面板收縮時,上面的值全部有效,面板展開時 ["online", "ready"] 設置無效(不顯示),操作按鈕在可在面板中使用
useLocalStorageToCall
是否允許使用多標簽頁外呼,默認為false,參數類型:Boolean;詳細介紹請參考第9條說明。
pollFrequenceWithoutWS
當坐席狀態WebSocket連接失敗時,調用REST API來拉取坐席狀態的頻率。
默認值為1000,單位毫秒,參數類型:Number。
目前云呼叫中心采用雙通道方式來保證坐席狀態的實時性與準確性:WebSocket推送和Rest API拉取。
pollFrequenceWithWS
當坐席狀態WebSocket連接成功時,調用Rest API來拉取坐席狀態的頻率。
默認值為10000,單位毫秒,參數類型:Number。
pollSaveWebRtcInfoFrequence
SaveWebRtcInfo(存儲通話信息)接口的調用頻率;
默認值為:10000,單位毫秒,參數類型:Number。
最小值:2000。
sideNavList
支持面板左側導航顯示自定義,默認是顯示全部,配置以后顯示自定義的導航,
配置項:["呼入", "呼出", "內部通話", "通話記錄", "轉接", "會議", "監聽", "我的工作", "設備檢測", "設置"]。
disableSaveStats
默認為false(不關閉收集通話錄音數據),參數類型:Boolean。
收集坐席側通話錄音數據,方便出現問題時進行語音排查和網絡分析。
強烈不建議關掉,當出現問題時不方便工程師排查。
reducePanel
SDK面板最小化Icon展示,默認為true,如果不需要該功能,可設置為false,參數類型:Boolean。
isEnableSwitchAdapter
為提高坐席語音通話質量,新增多個接入點語音專線,默認為true。
如果坐席需要直連云呼服務器,可設置為false,參數類型:Boolean。
customizedNotification
支持集成客戶自主定制來電桌面提醒,默認顯示呼叫中心配置的桌面來電提醒,默認為false。
傳值為true時不展示,參數類型:Boolean。
allowCalleeEncryption
是否允許被叫號碼加密傳輸(call方法的callee參數類型不做限制)
defaultLastSelectedCallerNumber 「version-workbench: 2.12.2」
是否記住上次選中的主叫號碼(存儲在瀏覽器緩存中,下次上線默認選中)
imConfig
im 聊天的配置,需加載對應的css和js文件
{
/**
* 坐席信息,默認是用工作臺設置里面的昵稱和頭像
*/
user?: {
/**
* 顯示名稱
*/
nickname?: string;
/**
* 頭像 URL
*/
avatarUrl?: string;
};
/**
* im 顯示的容器
*/
getContainer: () => HTMLElement;
/**
* 會話改變事件,為null時,沒有激活會話
* @param conv
* @returns
*/
onConvChange?: (conv) => void;
/**
* 會話邀請事件
*/
onConvInvite?: (event) => void;
/**
* 取消會話邀請事件
*/
onConvCancelInvite?: (event) => void;
/**
* 會話結束事件
*/
onConvReleased?: (event) => void;
/**
* 消息添加事件
*/
onMessageAdd?: (message) => void;
/**
* 隊列消息添加事件
*/
onClaimQueueAdd?: (event) => void;
}
******以下參數是前端請求服務端接口的API地址及請求參數配置:******
請求路徑為:${ajaxOrigin}${ajaxPath}?${ajaxApiParamName}=${apiName}&product=CloudCallCenter&version=2020-07-01®ion=${regionId}
ajaxOrigin
請求源,默認請求當前源(location.origin),參數類型:String;
ajaxPath
請求路徑,默認為”/data/api.json”
withCredentials
表示跨域請求時是否需要使用憑證,是否允許攜帶cookie,參數類型:Boolean
ajaxApiParamName
ajaxType為param時指定區分action的名稱,默認action,參數類型:String;
ajaxMethod
請求方式,post|get 默認post,參數類型:String;
ajaxOtherParams
其他自定義參數和request同一層級,參數類型:Object;
ajaxHeaders
請求的header,參數類型:Object;
apiAxiosFunc
支持客戶自己寫請求接口的方法,最終返回結果為一個promise對象且返回的數據格式要和云呼叫中心公有云數據接口返回格式一致
apiAxiosFunc: (apiName, params) => {
console.log(apiName, params);
let promise = axios({
method: 'post',
url:`/aliyun/ccc/api?action=${apiName}`,
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
data: Qs.stringify({ request: JSON.stringify(params)}),
});
return promise;
}
注意:
因為云呼內部使用axios請求庫,默認返回的是結果數據結構是
{
data: {
code:xxx,
data: xxx,
httpStatusCode: xxx,
requestId: xxxx
}
}
如果不是使用axios的話,請確保 return 的數據是這種數據結構,比 http 請求中返回的值多一個 data 包裹
******請求接口的參數配置結束******
鉤子函數
******以下是鉤子函數:某些事件觸發時的回調函數,類型均為function******
onInit()
SDK對象實例化完成時觸發
onRegister(config)
sip服務注冊成功時觸發
onLogIn()
簽入、上線時觸發
onLogOut()
簽出、下線時觸發
onBreak()
小休時觸發
onReady()
空閑時觸發
onAgentOutboundScenario
僅外呼時觸發
onCallComing(callDetail)
來電時觸發,可以在該函數內獲取到一個對象callDetail,callDetail參數信息含義如下:
caller:主叫號碼
callee:被叫號碼
callType:呼叫類型
jobId:當前通話的ID
callContext:當前通話的詳細信息
注意:為了提高接通率,當有來電振鈴30s后未接聽,會自動將當前坐席置為小休狀態。
電話自動流轉回轉人工隊列,分配給其他空閑坐席。
onBeforeCallDialing(payload)
調用call方法前觸發,如果配置這樣一個鉤子函數一定要執行callback方法,否則電話不會被撥打出去。
payload返回數據的參數含義如下:
callee:被叫號碼
userId:用戶的userId
callback:滿足條件以后的調用,可傳入完參數callee:被叫前綴+被叫號碼,不傳為面板或call方法傳入的被叫號碼
onCallDialing(callDetail)
去電、撥號振鈴時觸發,可以在該函數內獲取到一個對象callDetail,callDetail參數信息含義如下:
caller:主叫號碼
callee:被叫號碼
callType:呼叫類型
jobId:當前通話的ID
callContext:當前通話的詳細信息
onHangUp(type)
掛機時觸發
參數type值:
`ringing`: 代表呼入未接時掛機
`dialing`: 代表呼出未接時掛機
`inbound`: 代表呼入通話,通話中掛斷
`outbound`: 代表呼出通話,通話中掛斷
`internalcall`: 代表內部通話,通話中掛斷
`agentHeld`: 代表咨詢通話,通話中掛斷
`meeting`: 代表會議或會議中坐席狀態變化,掛斷
`consulted`: 代表被動求助(被咨詢通話),掛斷
`monitored`: 代表監聽,通話中掛斷
`monitoring`: 代表發起監聽,還未監聽成功,掛斷
`bargedIn`: 代表強插,通話中掛斷
`coached`: 代表耳語坐席,進入三方通話,通話中掛斷
onBeforeCallHangup(payload)
調用hangUp方法前觸發,如果配置這樣一個鉤子函數一定要執行callback方法,否則電話不會被掛斷。
payload返回的參數含義如下:
callback:回調方法
jobId:當前通話ID
channelId:這個坐席通話的channel id
userId: loginInfo.userId
onCallEstablish(callDetail)
通話建立連接時觸發,可以在該函數內獲取到一個對象callDetail,callDetail參數信息含義如下:
callContext:當前通話的詳細信息
onCallRelease(callDetail)
通話結束時觸發,可以在該函數內獲取到一個對象callDetail,callDetail參數信息含義如下:
callContext:當前通話的詳細信息
onErrorNotify(error)
當有一些錯誤信息的時候觸發,可以獲取error信息,error參數含義如下:
errorCode: 錯誤code,
errorMsg: response錯誤信息,
errorMsgTip: 我們定義的中文錯誤信息,
requestId: 請求ID
apiCode: API請求的錯誤code
當處于開發階段時建議在該鉤子函數中打印參數表以獲取錯誤信息
onStatusChange(codeDetail)
任何狀態改變都會觸發該函數,可在該函數內監聽當前狀態值的變化過程,狀態code的含義請參考本文檔第八條狀態對照表。
可以獲取到codeDetail參數,codeDetail參數含義如下:
code: 當前狀態碼
lastCode: 上次狀態碼
context:上下文信息
onWorkModeChange(workMode)
坐席默認有兩種工作模式:場內模式和場外模式。當坐席配置了SIP話機后,還有辦公電話模式。
場內模式:通過瀏覽器接聽、撥打電話。
場外模式:通過手機接聽電話,即1.0中的“手機接聽”方式。
辦公電話模式:通過SIP話機接聽、撥打電話,無需通過瀏覽器操作。
workMode參數含義如下:
"ON_SITE":場內模式
"OFF_SITE":場外模式
"OFFICE_PHONE":辦公電話模式
onDeviceTypeChange(deviceType)
當坐席配置了SIP話機后,坐席如果通過瀏覽器上線,可選擇使用哪種設備:WebRTC軟電話和SIP話機。
參數deviceType類型為Number:
0:WebRTC軟電話
1:SIP話機
onGetStatsData(payload)
具體概念請參考RTCPeerConnection.getStats()
可以訂閱此鉤子函數,獲取通話中的通話語音質量。每秒返回一次數據。
payload中包含:
callId:當前通話的callId
sender:發送方數據
receiver:接收方數據
參考用法:
sender && sender.forEach(report => {
console.log('sender', report);
}
onSelectOutboundNumber(number)
/**
* 面板中選擇主叫號碼事件
*
* @param {string} number 選擇的主叫號碼
*/
onSelectOutboundNumber(number: string): void
onSelectCurrentCallRecord(payload)
payload.record
可查看ListRecentCallDetailRecords - 獲取坐席最近通話記錄列表接口返回參數。
/**
* 當前選中的通話記錄
*/
onSelectCurrentCallRecord?(payload: {record: object}): void
onAfterEarlyMediaRecognized(payload)
/**
* 外呼智能掛機鉤子函數,返回早媒體識別信息
*/
onAfterEarlyMediaRecognized?(payload: {
/**
* 早媒體狀態
*/
earlyMediaState: string,
/**
* 早媒體開始的時間戳(便于倒計時計算)
*/
earlyMediaTime: number,
/**
* 早媒體狀態說明
*/
earlyMediaText: string,
/**
* 在設置中添加的倒計時掛機時間
*/
releaseAfterEarlyMediaRecognized: number
})
以下是配置示例:
window.workbench = new window.WorkbenchSdk({
dom: "workbench-container",
regionId: "cn-shanghai",
width: "320px",
height: "552px",
instanceId: "XXX",
ajaxPath: "/aliyun/ccc/api",
ajaxMethod: "post",
afterCallRule: 15, // 掛機后的話后處理時間
header: true,
autoAnswerCall: 8, // 有來電振鈴響8s后自動接聽
exportErrorOfApi: true,
onInit() {
// window.workbench.register() // 想實現自動上線在此注冊
},
imConfig: {
getContainer() {
return document.getElementById('im-container');
},
},
onLogIn() {
// window.workbench.renderIM(); // 渲染IM組件
},
onLogOut() {
// window.workbench.unmountIM(); // 卸載IM組件
},
onErrorNotify(error) {
console.warn(error);
},
onCallComing(callDetail) {
console.log(callDetail);
},
onCallDialing(callDetail) {
console.log(callDetail);
},
onStatusChange(codeDetail) {
console.log(codeDetail);
},
onCallEstablish(callDetail) {
console.log("這里是通話建立時觸發的回調函數", callDetail);
},
onCallRelease(callDetail) {
console.log("這里是通話結束時觸發的回調函數", callDetail);
},
onHangUp(type) {
console.log(`這里是onHangUp事件,type = ${type}`);
},
});
五、SDK方法
以下調用方式為:window.workbench.方法名(傳參);
注意:初始化SDK時定義的全局變量名稱是否與文檔定義的一致。
isAvailBrowser()
此方法用來檢測當前瀏覽器是否支持使用軟電話的,若瀏覽器不兼容軟電話,會彈出一個提示框并維持3s,
并在鉤子函數onErrorNotify中可得到錯誤信息提示;若支持則無彈框提示,onErrorNotify中也無錯誤信息。
checkNetwork()
此方法用來檢測當前網絡連接是否能連接到軟電話的服務,檢測是否被本地的防火墻攔截。
changeVisible(visible)
顯示或隱藏軟電話面板,參數visible類型為Boolean。
changeMainPaneVisible(visible)
展開或折疊軟電話面板,參數visible類型為Boolean。
changeWidth(width)
設置軟電話面板寬度。目前默認值為320px。參數width類型為Number。
unloadWorkbench
刪除已建立的 Workbench 實例,以供再次創建
reRender()
重新進行SDK的掛載,主要場景為在通話過程中或上線狀態下切換到其他頁面以后再回到坐席工作臺界面,
主要適用于SPA應用。
register(loginSkillGroupArray, accessPoint, deviceType, mode, breakReason)
/**
* 首次簽入,包含了sip服務注冊+簽入+置空閑,頁面加載完畢,首次簽入需調用該方法,
* 調用完成后坐席進入空閑狀態(需要在onInit鉤子方法執行之后才可以調用)
*
* @param loginSkillGroupArray 從接口`ListSkillGroupsOfUser`得到坐席的技能組列表信息
* @param accessPoint 從接口`GetTurnServerList`獲取的數組對象的`region`,
* 必須和接口`region`保持一致,否則不能切換成功,自動傳`default`,SDK內部實現選擇最近的接入點。
* @param deviceType 設備類型,可選參數,當坐席注冊了SIP話機,可設置參數為`1`,指定SIP話機上線。
* @param mode 登錄模式
* @param breakReason 小休模式上線的時候的小休原因
*/
function register(
loginSkillGroupArray?: any[],
accessPoint?: string,
deviceType?: number,
mode?: LoginMode,
breakReason?: string,
): void;
/**
* 登錄后的狀態
* `normal`: 正常登錄狀態
* `invisibility`: 隱身登錄狀態
* `break`: 小休狀態
*/
type LoginMode = 'normal' | 'invisibility' | 'break';
logIn(loginSkillGroupArray)
/**
* 簽入(處于簽出狀態可調用,狀態為`1`),調用該方法實現上線操作
*
* @param loginSkillGroupArray 從接口`ListSkillGroupsOfUser`得到坐席的技能組列表信息
* @param mode 登錄模式
* @param breakReason 小休模式上線的時候的小休原因
*/
logIn(loginSkillGroupArray?: any[], mode?: LoginMode, breakReason?: string): void;
logOut()
簽出,調用該方法實現下線操作
ready()
置空閑、通過該方法可變為空閑狀態,空閑狀態后可接聽、撥打電話。
applyForBreak(breakReason, callback)
/**
* 申請小休,設置后來電將不會轉到當前坐席,會轉到其他空閑的坐席人員。
*
* @param breakReason 默認是`default`,可自定義小休原因,方便統計不同的小休類型
* @param callback 調用成功后的回調函數
*/
applyForBreak(breakReason?: string, callback?: (e?: any) => void): void;
applyForCallOnly(isCallOnly)
/**
* 設置是否僅外呼。如果為true,則坐席不會有電話呼入。(請使用 changeVisibility 代替)
*
* @param isCallOnly 是否僅外呼
*/
applyForCallOnly(isCallOnly: boolean): void;
changeVisibility(invisible) 「version-workbench: 2.12.2」
/**
* 隱身模式切換。如果為true,則坐席不會有電話呼入,(效果跟僅外呼一致)
*
* @param invisible 是否為隱身模式
*/
changeVisibility(invisible: boolean): void;
applyForOnSite()
設置場內模式。當坐席為場外模式時,可調用此方法設置場內模式后再調logIn方法上線。
applyForOffSite()
設置場外模式。當坐席空閑時,可調用此方法設置場外模式,即手機接聽。
applyForOffSiteDirectly()
直接設置場外模式,不顯示彈窗確認。當坐席空閑時,可調用此方法設置場外模式,即手機接聽。
getStatusCode()
/**
* 獲取坐席當前狀態碼。
*/
getStatusCode(): {
/**
* 當前狀態
*/
code: number;
/**
* 上一次狀態
*/
lastCode: number;
};
hangUp(releaseJobId, releaseChannelId, callback)
/**
* 掛斷,通過該方法可結束通話。
*
* @param releaseJobId 可掛斷指定通話。如果不傳,則掛斷當前通話。
* @param releaseChannelId 可掛斷指定通話中的指定方。如果不傳,則掛斷當前通話。
* @param callback 調用成功后的回調函數
*/
hangUp(releaseJobId?: string, releaseChannelId?: string, callback?: (e?: any) => void): void;
answer(callback)
接聽電話,通過該方法可接聽來電,建立通話連接。
callback: 調用成功后的回調函數,參數類型為Function
call(callee, caller, callback, otherParams)
撥打電話
callee:被叫號碼,必傳,數據類型是String
caller:主叫號碼,可以指定主叫號碼;
也可以不傳,或者傳''或者‘auto’,根據外呼的號碼的歸屬地選擇與其同一歸屬地的主叫號碼,
若沒有同一歸屬地的就隨機在坐席綁定的外呼號碼列表中隨意選擇一個;
callback: 調用成功后的回調函數,參數類型為Function
otherParams: 可選參數,發起外呼時,可增加一些參數,目前支持的參數有:
{
TimeoutSeconds: 超時時間,呼叫在經過該參數指定的時間仍然未接通的情況下,則主動掛斷。參數類型為Number
Tags: 隨路數據。參數類型為String。
MaskedCallee: 脫敏后的被叫號碼,例如"1318888****"。參數類型為String。
}
stayAfterCall
保持話后處理狀態(與通話結束,點擊話后處理按鈕效果一致)
sendDtmf(number, jobId, channelId, callback)
不傳 jobId和channelId 時,第二個參數為可為callback
/**
* DTMF按鍵交互,發送dtmf。
*
* @param number 可為0~9,*或#
* @param callback 調用成功后的回調函數
*/
sendDtmf(number: string|number, callback?:(e:any) => void)
/**
* DTMF按鍵交互,發送dtmf。
* 三方通話時,必須要傳 jobId 和 channelId
*
* @param number 可為0~9,*或#
* @param jobId 當前話務的 jobId
* @param channelId 需要發送dtmf的 chennelId (可從 callContext 里面獲取)
* @param callback 調用成功后的回調函數
*/
sendDtmf(number: string|number, jobId?: string, channelId?: string, callback?:(e:any) => void)
callHold(callback)
通話保持,通過該方法可使通話進行保持,客戶端聽到的是一段音樂,坐席端說話客戶端無法聽到。
callback: 調用成功后的回調函數,參數類型為Function
callRetrieve(callback)
通話取回,通過該方法結束通話保持的狀態,重新建立客戶端和坐席端的通話。
callback: 調用成功后的回調函數,參數類型為Function。
muteAgent()
通話中靜音
unMuteAgent()
取消通話中靜音
changeVolumeInCall(volumeInCall)
/**
* 改變通話中的音量
*
* @param volumeInCall 值為[0, 1]的小數
*/
changeVolumeInCall(volumeInCall: number): void;
changeRingToneVolume(volumeInCall)
/**
* 改變來電振鈴時的音量
*
* @param volumeInCall 值為[0, 1]的小數
*/
changeRingToneVolume(volumeInCall: number): void;
thirdCallTransfer(callee, caller, callback) 「version-workbench: <2.13.1」
thirdCallTransfer(params) 「version-workbench: >=2.13.1」
/**
* 通話過程中直接轉接,A和B通話,將通話直接交給C
*
* @param params.callee 被叫號碼 | 技能組ID
* @param params.caller 主叫號碼
* @param params.callPriority 轉接優先級,在轉接技能組的時候可以傳入,0-9(默認0 最高優先級)
* @param params.strategyName 轉接到技能組隊列時的座席分配策略名稱
* @param params.strategyParams 轉接到技能組隊列時的座席分配策略參數
* @param params.timeoutSeconds 直接轉接超時時間,超過指定時間被轉接方沒有接起通話,則掛斷通話,此字段選填,默認 30,單位秒
* @param params.callback 調用成功后的回調函數
*
* @description
* ```text
* 轉接給坐席
* callee:坐席分機號
* caller: ''
*
* 轉接給外部電話
* callee:手機號
* caller:'auto'
*
* 轉接給指定技能組
* callee:技能組ID
* caller:''
* ```
*/
thirdCallTransfer(params: {
callee: string;
caller?: string;
callPriority?: number;
strategyName?: string;
strategyParams?: string;
timeoutSeconds?: number;
callback?: Callback;
}): void;
initiateAttendedTransfer(callee, caller, callback)「version-workbench: <2.13.1」
initiateAttendedTransfer(params) 「version-workbench: >=2.13.1」
/**
* 通話過程中咨詢轉接,A和B通話,咨詢C,咨詢過程中A等待
*
* @param params.callee 被叫號碼 | 技能組ID
* @param params.caller 主叫號碼
* @param params.callPriority 轉接優先級,在轉接技能組的時候可以傳入,0-9(默認0 最高優先級)
* @param params.strategyName 轉接到技能組隊列時的座席分配策略名稱
* @param params.strategyParams 轉接到技能組隊列時的座席分配策略參數
* @param params.timeoutSeconds 直接轉接超時時間,超過指定時間被轉接方沒有接起通話,則掛斷通話,此字段選填,默認 30,單位秒
* @param params.callback 調用成功后的回調函數
*
* @description
*
* 轉接給坐席
* callee:坐席分機號
* caller: ''
*
* 轉接給外部電話
* callee:手機號
* caller:'auto'
*
* 轉接給指定技能組
* callee:技能組ID
* caller:''
*/
initiateAttendedTransfer(params: {
callee: string;
caller?: string;
callPriority?: number;
strategyName?: string;
strategyParams?: string;
timeoutSeconds?: number;
callback?: Callback;
}): void;
thirdCallRetrieve(callback)
三方通話取回,回到原來的通話,A和B通話,咨詢C,咨詢完成回到A和B通話。
callback: 調用成功后的回調函數,參數類型為Function。
thirdCallTransferFinished(callback)
三方咨詢通話過程中轉移通話,A和B通話,咨詢C,咨詢完成回到A和B通話,實現A和C通話。
callback: 調用成功后的回調函數,參數類型為Function。
switchToConference(jobId)
/** * 咨詢通話轉會議(多方通話) * * @param jobId 通話 id */ switchToConference(jobId?: string): void;
startConference(participantListJson, otherParams)
/** * 發起會議 * * @param participantListJson 會議通話的另外兩方,坐席的話傳坐席的分機號,傳參類型 `JSON.stringify(['1234567', '7654321'])` * @param otherParams 其他參數 * * @example * ```js * startConference(JSON.stringify(['1234567', '7654321'])) * ``` */ startConference(participantListJson: string, otherParams?: Record<string, any>): void;
monitor(userId, callback)
/**
* 監聽方法
*
* @param userId 坐席的ID
* @param callback 調用成功后的回調函數
*/
monitor(userId: string, callback?: (result?: any) => void): void;
bargeIn(userId, jobId, callback)
/**
* 強插方法。成功后,轉入三方會議模式。
*
* @param userId 坐席的ID
* @param jobId 要插入的通話ID
* @param callback 調用成功后的回調函數
*/
bargeIn(userId: string, jobId?: string, callback?:(result?: any) => void): void;
intercept(userId, jobId, callback)
/**
* 強拆方法,成功后,原坐席被踢出通話,新插入坐席與客戶通話。
*
* @param userId 坐席的ID
* @param jobId 要插入的通話ID
* @param callback 調用成功后的回調函數
*/
intercept(userId: string, jobId?: string, callback?: (e?:any) => void): void;
coach(userId, jobId, callback)
/**
* 輔導方法。管理員和技能組組長可以輔導坐席與客戶通話。
* 成功后,客戶只能聽到初始坐席的聲音,被輔導坐席可以同時聽到客戶和輔導者的聲音。輔導者可以同時聽到客戶和坐席的聲音。
*
* @param userId 坐席的ID
* @param jobId 要輔導的通話ID
* @param callback 調用成功后的回調函數
*/
coach(userId: string, jobId?: string, callback?: (e?:any) => void): void;
agentToAgent(userDN, callback)
/**
* 內部通話方法
*
* @param userDN 坐席的分機號,為8位數字
* @param callback 調用成功后的回調函數
*/
agentToAgent(userDN: string, callback?: (e:any) => void): void;
transferStatisfic(contactFlowId)
/**
* 發送語音滿意度,或者轉其他IVR流程。
*
* @param contactFlowId 如果不傳,則發起已配置的語音滿意度流程。也可以傳入指定IVR流程ID,發起指定IVR流程。發起IVR流程后,當前坐席被掛斷。
*/
transferStatisfic(contactFlowId?: string): void;
launchShortMessageAppraise()
發送短信滿意度,只有在話后處理狀態下可用。
launchShortMessageMissedCall()
發送漏話短信,只有在撥號狀態時可用。
launchAuthentication(contactFlowId, contactFlowVariables, callback)
/**
* 發送指定IVR流程,當前坐席不被掛斷。
*
* @param contactFlowId 發起指定IVR流程的ID
* @param contactFlowVariables 給 IVR 流程傳參,可在開始節點中定義同名參數獲取
* @param callback 核身接口調用成功的回調
*/
launchAuthentication(
contactFlowId: string,
contactFlowVariables?: Record<string, string | number>,
callback?: (e: any) => void,
): void;
forceToPrepareSignIn()
如果注冊時收到7001錯誤,即已有設備在線,可以調用此方法繼續注冊。成功后會把原有設備踢下線。
testTurnServers(args)
測試云呼坐席接入點的時間。args的參數形式為:
accessPoint: 可以只測某個接入點的值。不傳為測試當前所有接入點
currentFrequence: 測試幾次。不傳為1次,參數類型為Number
callback: (res) => { 在這里得到接入點結果 }
switchAccessPoint(accessPoint)
切換坐席接入點,accessPoint為從接口GetTurnServerList獲取的turnServerListConfig數組對象的region,
必須和接口region保持一致,否則不能切換成功,自動傳’default’
getSoftPhoneDeviceId()
獲取當前軟電話id。可以根據此值進行MakeCall接口調用
getAudioDeviceList(callbackFunction)
獲取當前麥克風和耳機列表
setAudioInputDevice(device_id)
設置麥克風設備
setAudioOutputDevice(device_id)
設置耳機設備
cancelAutomaticCallRelease
取消外呼智能掛機設置(“設置-坐席工作臺-坐席接聽-外呼智能掛機”中配置)的自動掛機操作
getRemoteMediaStream
/**
* 獲取遠程媒體流,可以自定義媒體播放
*/
getRemoteMediaStream(): Promise<MediaStream>;
getSkillGroups
/**
* 獲取技能組
*/
getSkillGroups(): {
/**
* 上線時已選擇的技能組列表
*/
chooseSkillGroupList: ListSkillLevelsOfUser[]
/**
* 坐席當前所屬技能組列表 (ListSkillLevelsOfUser 接口返回)
*/
allSkillGroupList: ListSkillLevelsOfUser[]
}
interface ListSkillLevelsOfUser {
/**
* 技能組ID
*/
skillGroupId: string;
/**
* 技能組名稱
*/
skillGroupName: string;
/**
* 技能組等級
*/
skillLevel: number;
}
renderIM
IM組件渲染,需要加載對應IM組件的css和js文件
在onLogin及之后的鉤子函數中調用
unmontIM
IM組件卸載,需要加載對應IM組件的css和js文件
在onLogOut鉤子函數中調用以卸載IM組件
六、服務端準備工作
因為軟電話SDK是嵌入到了您的自有業務系統中,在軟電話SDK的使用過程中,會發起多個請求到自有業務系統的服務端,請求的調用地址可以通過四、config可選配置中的ajax相關配置來設置。需要將軟電話SDK發出的請求經過您的服務端轉發到云呼叫中心的服務端(也就是調用云呼叫中心的openAPI),然后將返回結果透傳回軟電話SDK中即可。詳細步驟如下:
可以通過AK/SK方式請求接口,或通過oauth2方式請求接口
轉發SDK發送的請求到云呼叫中心服務端,根據 簡介調用對應openAPI,將返回結果透傳回軟電話SDK即可,軟電話SDK所需的返回結果必須是JSON數據格式。
坐席,技能組等需要在阿里云云呼叫中心控制臺進行配置,否則無法正常工作;
類型 | 接口 | 描述 |
業務接口 | GetLoginDetails | 獲取坐席的登錄信息 |
GetUser | 獲取坐席的信息 | |
ListSkillLevelsOfUser | 坐席的技能組信息 | |
ListOutboundNumbersOfUser | 坐席的外呼號碼 | |
ListConfigItems | 坐席工作臺配置信息 | |
GetTurnServerList | 獲取云呼提供的turn服務接入點 | |
ListPrivilegesOfUser | 坐席的權限列表 | |
GetTurnCredentials | Turn服務的賬號密碼 | |
ListDevices | 登錄的設備信息 | |
PickOutboundNumbers | 自動選擇外呼號碼 | |
GetNumberLocation | 查詢號碼歸屬地 | |
ListRealtimeAgentStates | 查詢當前坐席的狀態列表(轉接功能) | |
ListAgentStates | 查詢當前的坐席列表(監聽功能) | |
ResetAgentState | 重置坐席狀態 | |
ListRecentCallDetailRecords | 查詢通話記錄 | |
ListSkillGroups | 獲取技能組,只有admin有權限 | |
ListBriefSkillGroups | 轉接的技能組列表 | |
ListHistoricalAgentReport | 獲取坐席我的工作數據 | |
SaveTerminalLog | 給服務端上報錯誤日志 | |
SignInGroup | 技能組登錄 | |
PollUserStatus | 輪詢獲取用戶狀態 | |
LaunchAuthentication | 核驗身份 | |
ChangeVisibility | 切換隱身 | |
話務操作相關接口 | SignOutGroup | 退出 |
TakeBreak | 小休 | |
ReadyForService | 置空閑 | |
MakeCall | 撥打電話 | |
AnswerCall | 接聽電話 | |
ReleaseCall | 掛電話 | |
HoldCall | 通話保持 | |
RetrieveCall | 通話取回 | |
BlindTransfer | 直接轉接 | |
InitiateAttendedTransfer | 發起咨詢轉接 | |
CompleteAttendedTransfer | 咨詢轉接轉移通話 | |
CancelAttendedTransfer | 取消轉接 | |
SendDtmfSignaling | 發送DTMF按鍵 | |
MonitorCall | 發起監聽 | |
BargeInCall | 監聽狀態下強插 | |
InterceptCall | 監聽狀態下強拆 | |
Coach | 監聽狀態下輔導 | |
MuteCall | 靜音 | |
UnmuteCall | 取消靜音 | |
LaunchSurvey | 發送語音滿意度 | |
ChangeWorkMode | 切換工作模式 | |
RedialCall | 回撥電話(通過jobId回撥,一般在號碼加密的情況下調用) |
七、開發錯誤、操作邏輯錯誤
SDK會拋出兩種類型的錯誤:開發錯誤、操作邏輯錯誤。建議您在開發時配置onErrorNotify鉤子并打印參數,方便排查問題并將相關錯誤拋出給客戶以方便問題排查。
開發錯誤:簡單的說就是可以通過修改您的代碼來修復的錯誤,是穩定重現的,這一類型的錯誤常見的有配置參數類型出錯、調用SDK方法未按照狀態約束表進行。比如配置項onInit要求是一個方法,但是卻傳入了一個字符串,那么SDK會直接執行如下代碼,遇到這樣的錯誤js執行被打斷,必須要根據錯誤提示先進行修復
操作邏輯錯誤:這一類錯誤是用戶在使用呼叫中心過程中一些操作不當造成的錯誤,不一定是穩定重現的,這一類型的錯誤常見的有未允許瀏覽器對本域名開啟聲卡權限、賬號在別處登錄、客服不在任何技能組中、呼叫中心網絡錯誤等。這類錯誤SDK會調用onErrorNotify方法通知外部系統,鉤子函數onErrorNotify中的所有情況:
5001: '外呼失敗',
5002: '您尚未被加入到技能組中,暫時無法使用,請聯系呼叫中心管理員添加',
5003: '技能組信息異常',
5004: '請檢查坐席是否在通話中,并且設置了語音滿意度流程',
5005: '當前WebSocket連接緩慢,請等待或刷新后重新上線',
5006: '請檢查坐席是否在通話中,并且傳入IVR流程ID',
6001: '沒有通話Channel信息',
6002: '沒有通話ChannelID',
6010: 'sip會話尚未建立',
7001: '已有設備注冊,軟電話未初始化', // 初始化sip之前檢測出有設備,可以讓客戶選擇是否登錄
7002: '已有設備注冊,軟電話初始化異常, 請刷新頁面', // 初始化sip之后,注冊設備和sip不一致,報錯
7003: '無法獲取接入點信息',
7004: '接入點測速失敗',
7005: '請使用http協議',
7006: '瀏覽器不滿足要求',
7007: '現在有新設備上線,請檢查',
7008: 'SIP話機不在線',
9001: '當前狀態不能執行此操作',
9002: '參數異常',
9003: '執行失敗',
9004: '軟電話已初始化好',
9005: '請先調用PrepareSignIn方法',
9006: '下線失敗',
9007: '網絡連接失敗',
9008: '缺少登錄信息',
9009: '主叫為空',
9010: '無可用主叫',
9012: '被叫為空',
8001: '請檢查聲卡權限', // 提示設備異常的界面
8002: '請檢查聲卡權限', // 提示設備異常的界面
8003: '已在通話中',
8011: '檢測到通話網絡斷開,請檢查網絡后,重新建立通話',
/* 以下為遷出的event事件 */
stream_local_refused: '瀏覽器無麥克風權限,請刷新頁面',
get_lo_failed: '無法獲取本地媒體流,請切換接入點到上海',
PollUserStatusErrorNotify: '無法獲取坐席狀態,請重新登錄',
注:
7001錯誤中返回值事例:
{
errorCode: 7001,
errorMsg: {
callId: '7089e388-b2db-e3b2-e4c2-572faf77c4d7',
contact: 'sips:80001012@100.104.xx.xxx:15646;rtcweb-breaker=yes;transport=wss',
deviceId: 'CCC-30.240.xx.xxx-chrome99-bs82ea17f7804263c',
extension: '80001010',
instanceId: 'ABC',
userId: 'abc@ABC',
userState: 'DIALING',
},
errorMsgTip: '已有設備注冊,軟電話未初始化'
}
參數說明:
deviceId:當前已登錄的設備ID
userState:當前已登錄設備狀態。目前有以下狀態:{
TALKING: '通話中',
DIALING: '撥號中',
RINGING: '振鈴中',
WORKING: '話后處理',
READY: '空閑',
BREAK: '小休',
OFFLINE: '下線',
}
當收到7001錯誤時,可調用forceToPrepareSignIn接口繼續注冊,并把原設備踢出。
5001?錯誤中返回的errorMsg是外呼失敗所對應的sip code,errorMsgTip是sip code所對應的語義翻譯。
不同號碼運營商所對應的sip code可能有所差異,這里列出常見sip code關系表:
{
100: '正在呼叫中',
180: '被叫正在振鈴',
181: '呼叫被轉發',
182: '正在排隊中',
183: '正在處理中',
200: '成功',
300: '多重選擇,請求的地址有多個選擇',
301: '地址永久不可用,呼叫已重定向',
302: '地址臨時不可用,呼叫已重定向',
305: '請求的資源必須通過Contact頭域中指定的代理服務器訪問',
380: '替代服務,呼叫不成功,可以嘗試另外的服務',
400: '呼叫請求格式非法或語法錯誤',
401: '用戶未授權,需要進行用戶認證',
402: '需要付費才能完成會話',
403: '服務器拒絕提供服務',
404: '用戶不存在,用戶在Request-URL指定的服務器上不存在',
405: '請求的方法不允許',
406: '請求的資源只對某些特殊請求作出響應,對當前請求不接受',
407: '需要進行用戶認證',
408: '請求超時,服務器未在規定時間內產生應答',
409: '請求和當前資源狀態產生沖突,請求不能被處理',
410: '請求的資源在服務器上不存在且無法轉發',
411: '拒絕接受沒有定義Content長度的請求',
413: '請求太大,超出服務器處理上限',
414: '請求URL太長,服務器拒絕請求',
415: '服務器不支持請求的消息體格式,拒絕處理該請求',
416: '不支持的URL計劃',
420: '服務器無法理解在Header中指出的擴展協議',
421: '服務器需要特定的擴展來處理該請求,但擴展沒有在請求中列出',
423: '間隔太短,服務器在請求中設置的資源刷新時間(或者有效時間)過短',
480: '被叫已聯系上,但被叫方當前不可用',
481: '服務器已接收到請求,但無法和現存的對話或事務匹配',
482: '發現環路,服務器檢測到一個循環',
483: '跳數太多,請求包含的Max-Forwards頭域為0',
484: '服務器接收到請求,但Request-URL不完整',
485: '請求的Request-URL不明確',
486: '被叫已聯系上,但被叫或運營商繁忙,暫時無法處理額外的呼叫',
487: '請求終止,請求被BYE或CANCEL所終止,常見于主叫方主動取消呼叫的場景',
488: '被叫無法接受請求,通常是媒體協商失敗導致',
491: '未決請求,在同一會話中,服務器收到的請求有一個依賴的請求正在處理',
493: '不可辨識,服務器收到的請求包含一個加密的MIME,并且不知道或者沒有提供合適的解密密鑰',
500: '運營商服務器內部錯誤',
501: '運營商服務器沒有實現相關的請求功能',
502: '運營商服務器從下游服務器接收到一個非法的應答',
503: '運營商服務器由于超負載或維護問題,暫時不能處理請求',
504: '運營商服務器請求超時',
505: '運營商服務器不支持請求中用到的SIP協議版本',
513: '運營商服務器無法處理超過指定長度的消息',
600: '被叫已聯系上,但被叫處于忙狀態,不打算接聽電話',
603: '被叫已聯系上,但被叫明確不想應答或者不能加入通話,常見于被叫拉黑主叫的場景',
604: '被叫離線,被叫不存在于網絡中',
606: '被叫已聯系上,但會話描述的某些方面不被接收,媒體協商失敗',
}
八、狀態對照表及狀態說明
狀態碼 | 描述 | 操作 | 可允許調用的接口 |
-1 | 未注冊 | 當前狀態只能操作register | register |
0 | 注冊中 | register | |
1 | 離線 | 上線 | logIn, applyForOffSite, forceToPrepareSignIn |
2 | 小休 | 置空閑,僅外呼,下線 | ready, applyForCallOnly, changeVisibility, logOut |
3 | 空閑 | 下線、外呼、接聽,發起監聽,會議 | logOut, agentToAgent, call, monitor, applyForBreak, applyForCallOnly,bargeIn, intercept, coach, startConference |
4 | 僅外呼 | 下線、外呼、接聽、發起監聽、會議、置空閑 | logOut, agentToAgent, call, monitor, applyForBreak,changeVisibility, ready,bargeIn, intercept, coach, startConference |
5 | 話后處理 | 置空閑 | logOut, applyForBreak, ready, call, launchShortMessageAppraise, applyForCallOnly, applyForOffSite |
6 | 振鈴 | 接聽 | answer |
7 | IM正在工作中 | ||
8 | 撥號 | 掛斷 | hangUp,sendDtmf |
9 | 呼入通話 | 掛斷 | hangUp, callHold, callRetrieve, sendDtmf, muteAgent, umMuteAgent, transferStatisfic, launchAuthentication, thirdCallTransfer, initiateAttendedTransfer |
10 | 呼出通話 | 掛斷 | hangUp, callHold, callRetrieve, sendDtmf, muteAgent, umMuteAgent, transferStatisfic, launchAuthentication, thirdCallTransfer, initiateAttendedTransfer |
11 | 內部通話 | 結束通話 | hangUp, callHold, callRetrieve, sendDtmf, muteAgent, umMuteAgent |
12 | 通話保持 | 取消通話保持 | callRetrieve |
16 | 發起三方 | 通話取回、取消三方通話 | thirdCallRetrieve |
17 | 咨詢通話 | 取消咨詢通話、咨詢通話轉移 | thirdCallRetrieve, thirdCallTransferFinished, sendDtmf, switchToConference |
19 | 會議 | 坐席由空閑狀態發起會議 | hangUp, sendDtmf |
20 | 被動求助 | 掛斷 | hangUp |
21 | 監聽 | 掛斷 | hangUp |
24 | 發起監聽,還未監聽成功 | ||
25 | 強插,進入三方通話 | 掛斷 | hangUp |
26 | 耳語坐席,進入三方通話 | 掛斷 | hangUp |
30 | 會議中坐席狀態變化 | 例如有人退出會議,或者有人進入會議 | hangUp, transferStatisfic |
九、多標簽頁外呼使用要點
使用場景
做了CRM系統集成的用戶,可以使用我們的SDK界面進行外呼,但是也存在一些用戶需要在其他頁面,比如一些用戶名單列表或用戶詳情頁面通過點擊按鈕進行外呼,這時就需要在該頁面進行sdk注冊,但是我們的sdk是不支持多標簽注冊的,因此我們提供了這樣的方案:在注冊過sdk的標簽頁監聽其他標簽頁localstorage的變化,在其他標簽頁設置localstorage來實現外呼。
使用方法
設置配置項useLocalStorageToCall為true
首先所有標簽頁都要在一個瀏覽器中,要求只有一個標簽頁注冊WorkbenchSdk,并保持該標簽頁的登錄狀態。
在
其他標簽頁
撥打電話時設置一個localstorage(如果撥打電話頁和注冊頁處于同一標簽頁,該方法將無法監聽到,導致電話撥打不出去),key為workbenchSdkCall,value為{callee: ‘1558888****’, caller: ‘05712823****’, random: 0.234234234}。其中caller的值具體設置參照上面SDK方法中call(callee, caller)
的規定,設置成功以后,當注冊過WorkbenchSdk的標簽頁監聽到localstorge的workbenchSdkCall變化時,便自動外呼電話:const value = { callee: "1558888****", caller: "05712823****", publicKey: "", useVirNumCall: true, random: Math.random(), }; localStorage.setItem("workbenchSdkCall", JSON.stringify(value));
在其他標簽頁掛斷電話時,需設置一個key為workbenchSdkHangup,value為一個隨機數的localstorage,便自動掛斷電話
localStorage.setItem('workbenchSdkHangup', Math.random())
可通過
localStorage.getItem('workbenchSdkStatus')
來查詢當前workbench狀態碼,當值為3,4,5時才可以外撥號碼;當值為8,9,10,11,12,21時才可掛斷電話。
十、對比1.0SDK文檔的更新
一、前端資源地址有變化
二、config必選配置項
instanceId數據來源有變化,為呼叫中心填寫的唯一域名
新增regionId配置,刪除useOpenApiSdk參數
三、config可選配置
前端請求資源的路徑配置為${ajaxOrigin}${ajaxPath}${ajaxApiParamName}=${apiName}&product=CloudCallCenter&version=2020-07-01®ion=${regionId}
回調函數onCallComing、onBeforeCallDialing、onCallDialing、onBeforeCallHangup、onCallEstablish、onErrorNotify、onStatusChange返回的參數都統一為對象格式,具體見文檔說明
刪除enableRecord配置項
四、SDK方法
離線坐席手機功能放到了坐席管理,通過后端接口修改坐席工作模式,不在前端SDK中提供了
五、服務端準備工作,新增了話務相關的接口,詳見上方文檔說明
六、錯誤的code碼
減少了雙登相關的錯誤碼、2.0如果發現有坐席登錄,提示已有設備在線,并列出設備id,請坐席確認
七、狀態說明
小休狀態碼變成了2
十一、更新日志
2024-08-01
Workbench: 2.16.0 (3.x版本已發布,使用新功能請前往前端SDK文檔接入(3.x)升級)
Agentbar: 2.4.0
Bug Fixes
閃信接口參數調整
2024-05-16
Workbench: 3.0.4 (Workbench 3.x后不在此文檔維護更新內容,請移步 前端SDK文檔接入(3.x),從2.x遷移到3.x,請查看從2.x版本升級)
Features
界面樣式升級,更符合現代化視覺效果
界面支持多種上線方式,正常上線、小休上線和隱身上線
新增工單創建、會話小結、語音轉文本、AI助手等功能(需要切換到新版云聯絡中心,目前功能需要加白名單,請釘釘聯系cccsupport2開通)
新增開發日志調試功能,將SDK中所有的日志支持自定義收集
Performance Improvements
簡化接入流程,優化資源體積,提升系統穩定
優化語音業務和網絡業務的單獨登錄
優化底層上線邏輯,使上線過程簡化,加快上線效率
2024-05-15
Workbench: 2.15.0
Agentbar: 2.4.0
Features
添加閃信功能,在設置tab頁顯示閃信功能開關(閃信功能的使用的前提是在坐席工作臺的【設置-閃信配置】中添加閃信供應商)
IM SDK: 0.5.8
Features
新增會話消息引用功能
新增發送2分鐘內的消息撤回功能
新增發送滿意度功能
Performance Improvements
優化上線邏輯和斷線重連邏輯
2024-03-01
Workbench: 2.14.1
Agentbar: 2.3.1
Bug Fixes
修復狀態從3-5后,不自動空閑
修復瀏覽器通知點擊后聚焦到當前工作頁面
Features
【云呼叫中心】更名為【云聯絡中心】
新增通話記錄中可拉黑號碼操作,該操作需要在打開【設置-坐席工作臺-坐席配置-是否允許坐席拉黑號碼】配置
漏話短信支持在多條短信模板中選擇一個發送
添加IM組件,添加
imConfig
配置項,添加renderIM
和unmountIM
兩個方法(具體使用方式請查看上方文檔)新增狀態
7
,為IM工作中的狀態
2024-01-09
Workbench: 2.13.1
Agentbar: 2.2.0
Bug Fixes
onHangUp
鉤子函數添加internalcall
(內部通話)type類型
Features
優化
thirdCallTransfer
和initiateAttendedTransfer
方法的傳參方式,添加strategyName
、strategyParams
、timeoutSeconds
參數添加隱藏界面上預測式外呼變量字段,在坐席控制臺-設置-坐席工作臺配置中設置
2023-11-08
Workbench: 2.12.2
Agentbar: 2.1.2
Bug Fixes
修復處于場外模式在onInit的時候調用register上線時,并沒有以場內模式上線
Features
新增
defaultLastSelectedCallerNumber
配置參數,主叫號碼,默認選中上次選擇的僅外呼名稱更改為隱身,在除下線狀態外的其他狀態,都可切換隱身,隱身模式的作用跟僅外呼一致(數據報表目前還是僅外呼,僅SDK目前做了更改,后續數據報表也會同步更改)
新增業務接口 ChangeVisibility 切換隱身
新增 SDK 實例方法
changeVisibility
主動切換隱身新增
isLoggedInvisibility
配置參數,登錄后保持隱身register
方法新增mode
和breakReason
參數,具體可查看register
方法說明logIn
方法新增mode
和breakReason
參數,具體可查看logIn
方法說明
2023-09-20
Workbench: 2.11.0
Agentbar: 2.0.3
Bug Fixes
修復在SIP WebSocket斷線重連時導致通話也被中斷
2023-08-21
Workbench: 2.11.0
Agentbar: 2.0.2 (從當前版本開始,不需要再加載SIPml資源)
Performance Improvements
優化底層sip連接邏輯,去除SIPml js資源加載
2023-06-30
Workbench: 2.11.0
Agentbar: 1.15.1
SIPml: 0.6.2
Bug Fixes
上線時技能組選擇不能超過36個,限制保持跟后端一致
Features
技能組轉接時可以選擇轉接策略
添加ice協商失敗的錯誤處理(8011 錯誤碼)
2023-05-25
Workbench: 2.10.1
Agentbar: 1.14.4
SIPml: 0.6.1
Bug Fixes
兼容某些移動端
HTMLMediaElement.setSinkId
方法不存在,導致上線失敗的問題在卸載軟電話的時候移除Audio元素,修復上下線后設置設備時不生效的問題
將
umMuteAgent
改為unMuteAgent
,umMuteAgent
仍然可用但是會在后續某個版本會刪除
Features
changeVolumeInCall
方法,可以將音量設置到0和1新增
getRemoteMediaStream
方法,可以在通話中獲取遠程媒體流優化接入點測速邏輯
2023-04-11
Workbench: 2.10.0
Agentbar: 1.14.2
SIPml: 0.6.1
Bug Fixes
修復自動加載日志配置文件,在某些特殊環境中失敗的問題(微前端等場景)
修復強插操作時,在某些情況下會接聽不了的問題
優化掛機的sip code和sip msg
優化 sip token 過期刷新機制,解決長時間下線狀態再上線時失敗的問題
修復在通話保持時被監聽,通話取回失敗的問題
上線時技能組選擇不能超過36個,限制保持跟后端一致
優化同瀏覽器多tab頁,多次相互踢登的問題
Features
轉接技能組時添加優先級選擇
2023-03-21
Workbench: 2.8.3
Agentbar: 1.12.1
SIPml: 0.6.0
Bug Fixes
修復 onErrorNotify 鉤子函數中,errorMsg和errorMsgTip參數傳值錯誤的問題,應該是字符串但是傳了對象(該錯誤在2.7.0版本開始出現,此版本修復)
Features
優化日志系統,刪除不必要的日志記錄上傳,減少網絡帶寬
2023-02-28
Workbench: 2.8.1
Agentbar: 1.12.0
SIPml: 0.5.0
Features
撥打未接通原因sipCode詳情展示
2022-12-13
Workbench: 2.8.0
Agentbar: 1.12.0
SIPml: 0.5.0
Features
新增外呼智能掛機功能,可在云呼控制臺“設置-坐席工作臺-坐席接聽-外呼智能掛機”中開啟,開啟后根據設置的時間倒計時后自動掛機,振鈴音智能識別出來的信息在
5001
錯誤的errorMsgTip
字段中返回,onAfterEarlyMediaRecognized
鉤子方法得到早媒體信息,cancelAutomaticCallRelease
手動取消自動掛機新增自定義通話保持音樂,可在云呼控制臺“設置-坐席工作臺-坐席接聽-通話保持音樂”中設置
在小休狀態也可以調用
applyForCallOnly
方法
Performance Improvements
優化 reRender 方法,避免在部分情況下導致舊的掛載組件仍然存在
2022-11-18
Workbench: 2.7.0
Agentbar: 1.11.0
SIPml: 0.5.0
Bug Fixes
后臺自動簽出,前端再次上線時報9004
中文用戶名注冊失敗
Features
添加允許拒接來電操作,云呼叫中心控制臺“設置-坐席工作臺-坐席接聽”中設置“允許拒接來電”
優化部分API請求報錯的錯誤提示
Performance Improvements
項目整體體積減小,提升加載效率
2022-10-10
Workbench: 2.6.1
Agentbar: 1.10.0
SIPml: 0.5.0
Bug Fixes
在話后處理時,切換tab導致通話時間丟失
Features
在面板中操作小休,添加小休狀態選擇,可在云呼叫中心控制臺“設置-坐席工作臺-坐席配置”中設置“小休狀態細分配置”
切換場外模式時,可進行技能組的選擇
Performance Improvements
選號邏輯提供降級機制,當自動選號接口失敗時,開啟隨機選擇號碼,不影響撥打操作
AnswerCall接口增加容錯能力,AnswerCall和Sip接聽解耦,在非SIP話機模式登錄時,AnswerCall接口調用失敗,不影響客戶的接聽操作
2022-08-31
Workbench: 2.5.0
Agentbar: 1.9.0
SIPml: 0.5.0
Features
添加
changeRingToneVolume
方法,改變來電響鈴的音量咨詢通話的時候增加撥號盤功能
樣式優化,部分地方顯示異常修復
BreakingChanges
當在云呼叫中心控制臺“設置-坐席工作臺-坐席接聽”中設置了外呼或來電號碼隱藏時,為了數據安全考慮,坐席權限的用戶,后端接口返回的是脫敏號碼,通話記錄中點擊撥打按鈕會調用 RedialCall 接口,不再調用MakeCall接口,請盡快升級到此版本或以上版本,未升級的用戶可能出現撥打失敗的情況。
2022-07-27
Workbench: 2.4.4
Agentbar: 1.8.1
SIPml: 0.4.1
Bug Fixes
切換左側導航欄導致呼出tab選中的主叫號碼不顯示
Features
添加
onSelectCurrentCallRecord
鉤子函數,在通話記錄中點擊返回當前點擊的通話記錄信息添加
isOutboundNotReceivedToBeProcessed
配置參數,可使呼出電話且未接通可以到話后處理倒計時狀態添加
stayAfterCall
實例方法,保持話后處理狀態(與通話結束,點擊話后處理按鈕效果一致)優化
unloadWorkbench
卸載實例方法
2022-06-29
Workbench: 2.4.3
Agentbar: 1.8.1
SIPml: 0.4.0
Bug Fixes
呼入通話,咨詢轉接外部通話后轉移通話,咨詢者報錯問題修復
2022-06-28
Workbench: 2.4.2
Agentbar: 1.8.1
SIPml: 0.4.0
Bug Fixes
優化瀏覽器版本判斷邏輯
修復在某些情況下不刷新頁面更換用戶登錄,鉤子函數不觸發的問題
Features
添加
isLoggedKeepBreak
配置參數,在登錄時保持小休狀態
2022-06-21
Workbench: 2.4.1
Agentbar: 1.8.0
SIPml: 0.4.0
Bug Fixes
來電技能組太長顯示tooltip
修復切換場外模式再立馬以場內模式上線參數沒有更新的問題
部分通話時間累計問題修復
修復 moreActionList 填寫不支持的參數報錯
修復面板收起時主被叫號碼更新不及時
收縮盤樣式的更改,兼容被叫號碼超長的邏輯
修復咨詢通話-轉移通話時,被叫歸屬地未顯示,呼入時主叫來電次數和來電時間未顯示
修復IVRTracking中,有設置變量節點時報錯
修復設備檢測,麥克風和耳機選擇設備選擇框中不顯示
修復呼入出現滾動條,狀態圖標被覆蓋
register方法傳deviceType參數為0時,彈窗還是出現
縮小面板后,點擊接聽按鈕,傳參錯誤
修復獲取瀏覽器版本號邏輯,兼容chrom 100版本
優化界面顯示,提升體驗
Features
launchAuthentication
核身方法添加contactFlowVariables
變量和callback
成功回調方法sendDtmf
方法開放出jobId
和channelId
參數傳入發送語音滿意度添加loading狀態
來電呼入頁面中添加來電技能組字段顯示
添加僅外呼配置
添加僅外呼狀態是否可以接收任何來電配置,轉接和內部通話是否可以給坐席
SIPml 添加更多日志,方便排查問題
Performance Improvements
優化 agentbar 體積,js文件減小55%,提升加載效率