代码使用示例-用户接收消息
在用户接入时,发送连接请求携带着回调函数:开始轮询客服发来的消息,可参考UserForm.vue中的sendConnect方法。
sendConnect(){ if (!this.$Chat.messageToken){ this.$alert('接口校验信息错误!') return } let connectionData = { channel: 'WEB', controlType: "CONNECT", mediaType: "TEXT", content: "hello", sourceType: "CUSTOMER", to: this.$Chat.getChannelId(), "from": this.$Chat.userId, senderNickname: this.$Chat.userName } this.$Chat.send(connectionData,()=>{ EventBus.$emit("startPoll"); }) }
其中在send方法执行成功后,会执行EventBus.$emit("startPoll");的回调函数,意为向事件栈中发送startPoll事件,监听方法在MainContent.vue的mouted方法中:
//收消息 EventBus.$on("startPoll", this.pushAgentMessage);
会调用pushAgentMessage方法,具体方法如下:
//处理座席侧所有消息总函数 pushAgentMessage() { let that = this; let agentFunc = function (data) { if (data && data["downlinkMessages"]) { let downLinkMessage = data["downlinkMessages"]; for (let i = 0; i < downLinkMessage.length; i++) { if (downLinkMessage[i]["sourceType"] === "AGENT") { that.toAgent = true; that.tipsObject.show = false; that.tipsObject.showCancel = false; if (that.isFirstToAgent) { EventBus.$emit("changeTalkStatus", "toAgent") that.isFirstToAgent = false; EventBus.$emit("changeAgent", downLinkMessage[i]["senderNickname"]) } } if (downLinkMessage[i]["sourceType"] === "ROBOT") { that.dealWithRobot(downLinkMessage[i]); continue; } if (that.mediaType[downLinkMessage[i]["mediaType"]] != null) { that.dealWithMedia(downLinkMessage[i]); continue; } if (downLinkMessage[i]["controlType"] === "DISCONNECT") { that.dealWithDrop(); continue; } //放入到展示区 let content = that.$Utils.extractUrl(downLinkMessage[i]["content"]) let msg = { avatar: "zph", text: that.$Utils.textChangeToImage(content), type: 0, time: that.$Utils.getDateString(), float: "left", userName: downLinkMessage[i]["senderNickname"] }; that.pushInRecords(msg); if (downLinkMessage[i]["queueFlag"]) { that.tipsObject.show = true; that.queryQueue(); } } } if (that.$Chat.isChatting) { EventBus.$emit("startPoll"); } }; setTimeout(() => { this.$Chat.poll(agentFunc); }, 100) },
该方法是一个一直在轮询的方法,其中对于座席发来的不同消息类型,有不同的处理方式,关于座席返回的消息内容,可以参考接口参考中开放接口的poll方法;
其中一些方法的说明:
if (downLinkMessage[i]["sourceType"] === "AGENT") { that.toAgent = true; that.tipsObject.show = false; that.tipsObject.showCancel = false; if (that.isFirstToAgent) { EventBus.$emit("changeTalkStatus", "toAgent") that.isFirstToAgent = false; EventBus.$emit("changeAgent", downLinkMessage[i]["senderNickname"]) } }
当接收到第一条座席发来的信息时,会发送 changeTalkStatus 和 changeAgent 事件,其中changeTalkStatus事件会使监听方法去检查当前对话的座席是否支持点击通话(即音视频交谈),以及当前用户环境是否支持语音交谈,如果支持,会在demo的聊天工具栏中展示可以点击的音视频通话按键。
changeAgent事件会使监听方法改变对话者的名称。
if (downLinkMessage[i]["sourceType"] === "ROBOT") { that.dealWithRobot(downLinkMessage[i]); continue; }
上述代码中会处理客服侧发来的消息,为机器人发来的消息类型。
if (that.mediaType[downLinkMessage[i]["mediaType"]] != null) { that.dealWithMedia(downLinkMessage[i]); continue; }
上述代码中会处理客服侧发来的消息,为多媒体的消息类型。
//处理客服侧发送的媒体类型消息 dealWithMedia(data) { let fileId = data['content']; let mediaFileType = this.mediaType[data['mediaType']]; let requestParam = { fileId: fileId, channel: 'WEB', fileType: mediaFileType, multiMedia: 'multiMedia' } let that = this; let itemType = this.itemType[data['mediaType']] let callbacks = function (respData) { if (respData['resultCode'] === '0') { let msg; if (itemType === 1) { let imgSrc = 'data:image/jpeg;base64,' + respData['fileStream']; let imgList = []; imgList.push(imgSrc); msg = { avatar: "zph", text: imgSrc, type: itemType, time: that.$Utils.getDateString(), float: "left", imgList: imgList }; } else { let typeHeader = 'data:audio/mp3;base64,'; let type = "audio/mp3"; if (itemType === 2) { typeHeader = 'data:video/mp4;base64,'; type = 'video/mp4'; } let audioSource = typeHeader + respData['fileStream']; let arr = audioSource.split(','); let array = arr[0].match(/:(.*?);/); let mime = (array && array.length > 1 ? array[1] : type) || type; let bytes = window.atob(arr[1]) let arrayBuffer = new ArrayBuffer(bytes.length); let uint8Array = new Uint8Array(arrayBuffer); for (let i = 0; i < bytes.length; i++) { uint8Array[i] = bytes.charCodeAt(i); } let blobFile = new Blob([uint8Array], { type: mime }); let objectUrl = window.URL.createObjectURL(blobFile); msg = { avatar: "zph", text: objectUrl, type: itemType, time: that.$Utils.getDateString(), float: "left", }; } that.pushInRecords(msg); } } this.$Chat.downloadFileStream(callbacks, requestParam); }
在识别到是多媒体消息时,会调用downloadFileStream的接口。
if (downLinkMessage[i]["controlType"] === "DISCONNECT") { that.dealWithDrop(); continue; }
上述代码中会处理客服侧发来的消息,为客户结束会话的消息类型。