Fetch the repository succeeded.
{
"path": "components/bytedesk_kefu/chat-kf",
"style": {
"navigationBarTitleText": "萝卜丝智能客服",
"navigationBarBackgroundColor":"#007AFF",
"navigationBarTextStyle":"white"
}
},
{
"path": "components/bytedesk_kefu/chat-im",
"style": {
"navigationBarTitleText": "萝卜丝智能客服",
"navigationBarBackgroundColor":"#007AFF",
"navigationBarTextStyle":"white"
}
},
{
"path": "components/bytedesk_kefu/rate",
"style": {
"navigationBarTitleText": "满意度评价",
"navigationBarBackgroundColor":"#007AFF",
"navigationBarTextStyle":"white"
}
},
{
"path": "components/bytedesk_kefu/webview",
"style": {
"navigationBarTitleText": "萝卜丝H5",
"navigationBarBackgroundColor":"#007AFF",
"navigationBarTextStyle":"white"
}
},
{
"path": "components/bytedesk_kefu/leavemsg",
"style": {
"navigationBarTitleText": "留言",
"navigationBarBackgroundColor":"#007AFF",
"navigationBarTextStyle":"white"
}
}
bytedesk_demo和bytedesk_demo_i18n的区别仅仅在于后者支持国际化,其他功能没有区别
import * as bytedesk from '@/components/bytedesk_kefu/js/api/bytedesk.js'
// 萝卜丝第二步:初始化
// 注意:init的接口要提前调用,最好在打开App的时候就调用。不要跟打开客服页面接口放在一起同时调用,否则会因未初始化完毕报错 'not login'
// 获取subDomain,也即企业号:登录后台->客服管理->客服账号->企业号
let subDomain = 'vip'
// 登录后台->渠道管理-》uniapp中创建应用获取
let appKey = 'f4970e52-8cc8-48fd-84f6-82390640549d'
bytedesk.init(subDomain, appKey);
// 注:如果需要多平台统一用户(用于同步聊天记录等),可使用下面接口替换bytedesk.init:
// bytedesk.initWithUsernameAndNicknameAndAvatar('myuniappusername', '我是美女', 'https://bytedesk.oss-cn-shenzhen.aliyuncs.com/avatars/girl.png', subDomain, appKey);
// bytedesk.initWithUsername('myuniappusername',subDomain, appKey); // 其中:username为自定义用户名,可与开发者所在用户系统对接
// 如果还需要自定义昵称/头像,可以使用 initWithUsernameAndNickname或initWithUsernameAndNicknameAndAvatar,
// 具体参数可以参考 @/components/bytedesk_kefu/js/api/bytedesk.js 文件中接口
// 第三步:到 客服管理->技能组-有一列 ‘唯一ID(wId)’, 默认设置工作组wid
// 说明:一个技能组可以分配多个客服,访客会按照一定的规则分配给组内的各个客服账号
// workGroupWid: '201807171659201', // 默认人工
// 参数说明:
// nickname 自定义昵称,可设置为非空字符串,如不设置,会系统生成默认昵称
// history 是否显示历史聊天记录,默认为显示,设置history=0,则不显示历史聊天记录
// postscript 附言,在连接成功客服之后,自动将此消息发送给客服
// lang 语言,默认值为lang=cn,显示中文,如需显示英文设置lang=en
// goods 是否显示商品信息,如果要显示,设置为goods=1,设置为其他值,则不显示商品信息
// goods_id 商品信息id,参数goods=1的情况有效
// goods_title 商品信息标题,参数goods=1的情况有效
// goods_content 商品信息详情,参数goods=1的情况有效
// goods_price 商品信息价格,参数goods=1的情况有效
// goods_url 商品信息网址,参数goods=1的情况有效
// goods_imageUrl 商品图片,参数goods=1的情况有效
// goods_categoryCode 可选,商品信息类别,参数goods=1的情况有效
startChat () {
// console.log('start chat')
uni.navigateTo({
url: '../../components/bytedesk_kefu/chat-kf?wid=' + this.workGroupWid + '&type=workGroup&aid=&title=萝卜丝'
});
}
首页 | 聊天 | H5 |
---|---|---|
![]() |
![]() |
![]() |
![]() |
![]() |
![]() |
权限配置
集成代码
登录管理后台:https://www.bytedesk.com/admin,客服管理-》技能组-》获取视频客服代码
用于访客端-查询访客所有未读消息数目
1. 首先引入 import * as httpApi from '@/components/bytedesk_kefu/js/api/httpapi.js' (后面说明将省略此步骤说明)
2. 调用接口:
httpApi.getUnreadCountVisitor(response => {
// console.log('getUnreadCountVisitor: ', response.data)
let unreadCount = response.data
if (unreadCount > 0) {
uni.showToast({ title: '未读消息数目:' + unreadCount, duration: 2000 });
}
}, error => {
console.log(error)
})
机器人会话仅针对技能组开启,指定会话不支持开启机器人
登录管理后台
首先添加分类,其次添加问答
具体请参考bytedesk_demo/pages/index/chat_type.vue文件
goods 是否显示商品信息,如果要显示,设置为goods=1,设置为其他值,则不显示商品信息
goods_id 商品信息id,参数goods=1的情况有效
goods_title 商品信息标题,参数goods=1的情况有效
goods_content 商品信息详情,参数goods=1的情况有效
goods_price 商品信息价格,参数goods=1的情况有效
goods_url 商品信息网址,参数goods=1的情况有效
goods_imageUrl 商品图片,参数goods=1的情况有效
goods_categoryCode 可选,商品信息类别,参数goods=1的情况有效
// url编码
let goodsUrl = encodeURI('https://item.m.jd.com/product/12172344.html')
// 增加商品信息参数
uni.navigateTo({
url: '../../components/bytedesk_kefu/chat-kf?wid=' + this.workGroupWid
+ '&type=workGroup&aid=&title=萝卜丝'
+ '&goods=1'
+ '&goods_categoryCode=101'
+ '&goods_content=商品详情'
+ '&goods_id=123'
+ '&goods_imageUrl=https://bytedesk.oss-cn-shenzhen.aliyuncs.com/images/123.webp'
+ '&goods_price=1000'
+ '&goods_title=商品标题'
+ '&goods_url=' + goodsUrl
+ '&history=0'
+ '&lang=cn'
});
// 具体参考demo中chat_type.vue页面
onLoad(option) {
// 监听点击商品回调
uni.$on('commodity',function(content) {
console.log('点击商品回调:', content);
})
},
onUnload() {
// 移除点击商品回调监听
uni.$off('commodity');
}
具体请参考bytedesk_demo/pages/index/user_info.vue文件
首先引入 import * as httpApi from '@/components/bytedesk_kefu/js/api/httpapi.js'
getProfile () {
// 查询当前用户信息:昵称、头像
let app = this
httpApi.getProfile(function(response) {
console.log('getProfile success:', response)
app.uid = response.data.uid
app.nickname = response.data.nickname
app.description = response.data.description
app.avatar = response.data.avatar
}, function(error) {
console.log('getProfile error', error)
uni.showToast({ title: error, duration: 2000 });
})
}
setNickname () {
// 可自定义用户昵称-客服端可见
let mynickname = '自定义APP昵称uniapp'
let app = this
httpApi.updateNickname(mynickname, function(response) {
console.log('updateNickname success:', response)
app.nickname = mynickname
}, function(error) {
console.log('updateNickname error', error)
uni.showToast({ title: error, duration: 2000 });
})
}
setDescription () {
// 可自定义用户备注信息-客服端可见
let mydescription = '自定义APP用户备注信息uniapp'
let app = this
httpApi.updateDescription(mydescription, function(response) {
console.log('updateDescription success:', response)
app.description = mydescription
}, function(error) {
console.log('updateDescription error', error)
uni.showToast({ title: error, duration: 2000 });
})
}
setAvatar () {
// 可自定义用户头像url-客服端可见
let myavatarurl = 'https://chainsnow.oss-cn-shenzhen.aliyuncs.com/avatars/visitor_default_avatar.png'; // 头像网址url
let app = this
httpApi.updateAvatar(myavatarurl, function(response) {
console.log('updateAvatar success:', response)
app.avatar = myavatarurl
}, function(error) {
console.log('updateAvatar error', error)
uni.showToast({ title: error, duration: 2000 });
})
}
setProfile () {
let mynickname = '自定义APP昵称uniapp'
let myavatarurl = 'https://chainsnow.oss-cn-shenzhen.aliyuncs.com/avatars/visitor_default_avatar.png'; // 头像网址url
let mydescription = '自定义APP用户备注信息uniapp'
let app = this
httpApi.updateProfile(mynickname, myavatarurl, mydescription, response => {
console.log('updateProfile success:', response)
app.nickname = mynickname
app.avatar = myavatarurl
app.description = mydescription
}, error => {
console.log('updateAvatar error', error)
uni.showToast({ title: error, duration: 2000 });
})
}
具体请参考bytedesk_demo/pages/index/online_status.vue文件
getWorkGroupStatus () {
// 获取技能组在线状态:当技能组中至少有一个客服在线时,显示在线
// 获取workGroupWid:客服管理->技能组-有一列 ‘唯一ID(wId)’, 默认设置工作组wid
let app = this
httpApi.getWorkGroupStatus(this.workGroupWid, function(response) {
console.log('getWorkGroupStatus success:', response)
// online代表在线,否则为离线
app.workGroupOnlineStatus = response.data.status
}, function(error) {
console.log('getWorkGroupStatus error', error)
uni.showToast({ title: error, duration: 2000 });
})
}
getAgentStatus () {
// 获取指定客服在线状态
let app = this
httpApi.getAgentStatus(this.agentUid, function(response) {
console.log('getAgentStatus success:', response)
// online代表在线,否则为离线
app.agentOnlineStatus = response.data.status
}, function(error) {
console.log('getAgentStatus error', error)
uni.showToast({ title: error, duration: 2000 });
})
}
具体请参考bytedesk_demo/pages/index/switch_user.vue文件
// 引入js文件
import * as constants from '@/components/bytedesk_kefu/js/constants.js'
import * as bytedesk from '@/components/bytedesk_kefu/js/api/bytedesk.js'
import * as httpApi from '@/components/bytedesk_kefu/js/api/httpapi.js'
let isLogin = uni.getStorageSync(constants.isLogin);
if (isLogin) {
uni.showToast({ title:'请先退出登录', icon:'none', duration: 2000 })
return
}
userLogout() {
uni.showLoading({ title: '退出登录中', icon:'none', duration: 2000 });
// 退出登录
httpApi.logout(response => {
uni.hideLoading();
uni.showToast({ title:'退出登录成功', icon:'none', duration: 2000 })
}, error => {
uni.hideLoading();
uni.showToast({ title:'退出登录失败', icon:'none', duration: 2000 })
})
}
initWithUsernameAndNicknameAndAvatar(username, nickname, avatar, subDomain, appKey) {
bytedesk.initWithUsernameAndNicknameAndAvatar(username, nickname, avatar, subDomain, appKey)
uni.showToast({ title:'登录成功', icon:'none', duration: 2000 })
}
// 引入头文件及其他
// .....
// 官方文档 https://uniapp.dcloud.net.cn/collocation/i18n
// 国际化 json 文件,文件内容详见下面的示例
import en from './components/bytedesk_kefu/i18n/en.json'
import cn from './components/bytedesk_kefu/i18n/cn.json'
const messages = {
en,
cn
}
let i18nConfig = {
// 其中:中文填写 'cn', 英文填写 'en'
locale: 'cn', // uni.getLocale(), // 获取已设置的语言
messages
}
// 引入国际化设置插件
import VueI18n from 'vue-i18n'
Vue.use(VueI18n)
const i18n = new VueI18n(i18nConfig)
// 其他
// .....
const app = new Vue({
i18n, // 国际化配置
...App
})
app.$mount()
客服消息会额外推送到此地址,开发者可据此实现消息存储和App离线推送等。 以http或https开头,GET方式调用,参数名: json。注意: url中不能含有‘?’等字符。 例如:您填写的url为:https://www.example.com/abc, 系统会自动在url末尾添加字符串 ‘?json=’,组成url:https://www.example.com/abc?json=消息内容。 在您服务器,只需要解析json参数内容即可
{
"mid": "658835ef-69af-e231-eb3c-4e6685ffc4d3",
"timestamp": "2021-05-11 17:19:34",
"client": "web",
"version": "1",
"type": "text",
"user": {
"uid": "201808221551193",
"username": "username",
"nickname": "客服001",
"avatar": "https://chainsnow.oss-cn-shenzhen.aliyuncs.com/avatars/admin_default_avatar.png",
"extra": "{\"agent\":true}" // 说明:true 为客服发送消息,false 为访客发送消息
},
"text": {
"content": "2"
},
"thread": {
"tid": "202105111719261_20210507193724225efbd47566648d1bb1608b4d1f1a3f2", // 格式说明:时间戳_访客uid
"type": "workgroup",
"nickname": "局域网7241[172.16.0.75]",
"avatar": "https://chainsnow.oss-cn-shenzhen.aliyuncs.com/avatars/chrome_default_avatar.png",
"content": "2",
"timestamp": "2021-05-11 17:19:34",
"topic": "201809061716221/20210507193724225efbd47566648d1bb1608b4d1f1a3f2" // 格式说明:技能组wid/访客uid
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。