介绍
UDESK视频通话小程序代码
软件类别
- 微信原生小程序
目录结构说明
- udesk_avs_mp
- README.en.md
程序说明文件
- README.md
程序说明文件
- app.js
小程序项目描述文件
- app.json
小程序项目描述文件
- app.wxss
小程序项目描述文件
- miniprogram_npm
npm 依赖
- node_modules
npm 依赖
- package-lock.json
依赖管理文件
- package.json
依赖管理文件
- pages
第三方扩展包,可以在这个包内开发额外的业务逻辑
- plugin
小程序视频插件包,包含小程序视频通用的业务以及通话能力
- components
小程序插件内部组件库
- enums
小程序枚举包
- images
图片库
- index.js
插件包入口文件
- libs
字体依赖库
- pages
小程序插件业务包
- agents
客服列表页面,可选,针对配置了客服列表的客户生效
- call
呼叫页面,默认的护叫页面
- connect
视频通话建立页面
- error
统一的错误处理页面
- form
离线表单,询前表单页面,可选
- goods
咨询对象页面,可选,针对配置了咨询对象列表的客户生效
- msgHis
消息记录页面
- preIndex
前置的逻辑处理页面,主要处理鉴权,工作时间,数据预处理
- queue
排队页面,用于处理通话排队的情况
- stores
路由插件页面,可选,针对配置了路由插件的客户,一般和客服列表配合使用
- survery
满意度评价页面,处理满意度评价逻辑,可选,针对配置了满意度评价的客户生效
- verifyCode
验证码输入页面,可选,针对开通通话授权的客户显示此页面
- wait
等待接听页面,区别于排队页面,进入此页面客户已出队,在等待客服接听的状态
- utils
工具包
- components
安装教程
clone 此库,导入微信小程序开发者工具
使用说明
-
使用前请阅读该文档(http://udesk.udesk.cn/hc/articles/222881),确保已经完成文档中描述的操作
-
分包导入说明(源码对接如遇小程序大小超限,可以使用分包),参考地址 (https://developers.weixin.qq.com/miniprogram/dev/framework/subpackages/basic.html)
-
在app.json中添加 weui依赖, 此种依赖方式下 weui-miniprogram 不会占用主包大小。见
示例1
-
在app.json中调整plugin包为分包,需要调整的页面如下。见
示例2
-
示例1
"useExtendedLib": {
"weui": true
}
示例2
{
"pages": [
"pages/index/index"
],
"subPackages": [
{
"root": "plugin/",
"pages": [
"pages/preIndex/index",
"pages/call/index",
"pages/queue/index",
"pages/wait/wait",
"pages/connect/connect",
"pages/survery/survery",
"pages/goods/index",
"pages/error/index",
"pages/stores/index",
"pages/agents/index",
"pages/form/index",
"pages/verifyCode/index",
"pages/msgHis/msgHis"
]
}
],
"window": {
"enablePullDownRefresh": false,
"navigationBarTitleText": ""
},
"sitemapLocation": "sitemap.json",
"useExtendedLib": {
"weui": true
},
"permission": {
"scope.userLocation": {
"desc": "您的位置信息将用于计算您到附近门店的距离"
}
}
}
-
配置文件说明(一般源代码中会提供小程序sdkAppId,导入开发者工具中可以直接使用)
- app.js 嵌入已有小程序时,需保留 app.js中的逻辑 见
示例3
- app.js 嵌入已有小程序时,需保留 app.js中的逻辑 见
示例3
App({
onLaunch: function (res) {
},
onShow: function (res) {
},
//全局缓存对象。
miniReferer: {
sdkAppId: 's3233faUJs0Jm2x',
},
});
-
页面间跳转对接说明
-
调整小程序首页为pages/index/index
-
对接数据传输说明
-
流程简介
-
客户小程序完成业务逻辑后跳转到视频页面进行通话,通话完成后跳转回客户小程序页面。
-
流程细节
-
关于通话次数限制
- 客户小程序给视频小程序页面传入callTimes参数,视频小程序根据此参数控制呼叫次数
- 呼叫次数不足跳转回客户小程序页面
-
关于跳转客户小程序页面的时机
- 呼叫次数不足时跳转
- 视频结束时跳转
- 满意度评价时跳转
-
-
页面间跳转方式描述
- 客户小程序完成业务后跳转页面地址为: plugins/pages/preIndex/index
- 传参说明
- 参数传递方式
- 页面跳转前将需传递的参数存入 app.globalData.udeskAvsMiniReferer
- 验签方式
- 页面间跳转 无需验签
- 页面间跳转demo (含支持参数)见
示例4
- 参数传递方式
-
-
示例4
navigateToMiniPage: function(){
app.miniReferer = {
sdkAppId:'s3233faUJs0Jm2x', //小程序授权的sdkAppId
customerInfo: {
//客户信息
// id:123, //客户ID 不传会自动新增客户
nickName: "测试客户", //昵称
avatar: "", //客户头像地址
// email: "2311153387332@qq.com",
// telephones: [
// { id: null, content: "14312223333" },
// { id: null, content: "17422112233" },
// ], // 电话 [{id,电话号}], 不传id或者id为null代表新增
// description: "客户描述", //客户描述
// level: "vip", // 客户等级, 'vip'(vip客户)或者'normal'(普通客户)
// customerToken: null, //客户外部标识,第三方提供的客户唯一标识,此标识相同,udesk会识别为同一个用户
// organizationIds: [1, 2], // 客户公司id,需先调用获取客户公司列表接口
// customFields: {
// //客户自定义字段 值TextField_1 由客户拼接(需先调用获取客户自定义字段接口)
// TextField_1: "普通文本内容",
// SelectField_1: ["0"],
// },
},
// 业务记录信息 不必须
// noteInfo: {
// content: "测试主题123",
// customFields: {
// //客户自定义字段 值TextField_1 由客户拼接(需先调用获取客户自定义字段接口)
// TextField_1: "普通文本内容", //普通文本
// SelectField_8: "1",
// SelectField_5: "1", //单选框
// SelectField_1641: "1", //单选下拉
// SelectField_1645: "0,1,2,3" //多选
// }
// },
// bizId: "", // 对接方业务id,事件回调推送通话记录时会回传bizId,第三方可以把通话记录绑定在对应订单上。
callTimes: 1, //允许通话次数 -1为不限制 默认 -1
//customChannel: "beijing", //自定义渠道 默认为空
callDirect: { //如需使用咨询对象列表和路由列表,不能初始化此对象
enable: false,
//agentId: '12',
//agentGroupId: '13'
}, //直接进入呼叫流程。 默认false 可选 true/false
voiceOnly: false, //是否仅使用语音模式,默认false 可选 true/false
/**
回跳说明:
1.配置了commonNavigate 。有满意度页面则在满意度页面回跳,无满意度页面则在通话结束后回跳
2.回跳到小程序是会在path后追加 navigateType属性 属性值为 1 授权失败跳转 2 呼叫次数不足跳转,3通话结束跳转,4满意度评价跳转 类型为数字
3. 在path后追加bizId透传客户业务主键值
* */
commonNavigate: {
path: "/pages/index/index",
},
currentNavigateType:'navigateInPage'
}
console.log(app.miniReferer);
wx.redirectTo({
url: '/plugin/pages/preIndex/index',
})
},
-
小程序间跳转对接说明(有跳转小程序提示,微信限制)
-
对接数据传输说明
-
流程简介
- 客户小程序完成业务逻辑后跳转到视频小程序进行通话,通话完成后跳转回客户小程序。(有跳转小程序提示)
-
流程细节
-
关于通话次数限制
- 客户小程序给视频小程序传入callTimes参数,视频小程序根据此参数控制呼叫次数
- 呼叫次数不足跳转回客户小程序
-
关于跳转客户小程序的时机
- 呼叫次数不足时跳转
- 视频结束时跳转
- 满意度评价时跳转
-
-
-
小程序间跳转demo 见
示例5
-
示例5
navigateToMiniProgram: function () {
wx.navigateToMiniProgram({
appId: "wx2e1223222cf230d0",
envVersion: "trial", // develop 开发版,trial 体验版,release 正式版,默认为正式版
/**
* sign 签名方式 sha256("微信小程序ID"+"跳转路径(不包含问号及参数)"+"extraData请求体字符串"+"秘钥"+"nonce(uuid标识唯一请求)"+"timestamp(时间戳)")
*/
path:
"plugin/pages/preIndex/index?sign=b46e9cba961f30889d0f0de4312b7b732ba4f7e081562ef5d1d27556258843bf&nonce=c33442bdffaa×tamp=12233311",
extraData: {
options: {
sdkAppId: 's3233faUJs0Jm2x',
customerInfo: {
//客户信息
// id: 1222, //为空则小程序会新增客户
nickName: "测试客户", //昵称
//avatar: "", //客户头像地址
// email: "2333387332@qq.com",
// telephones: [
// { id: null, content: "13312223333" },
// { id: null, content: "13422112233" },
// ], // 电话 [{id,电话号}], 不传id或者id为null代表新增
// description: "客户描述", //客户描述
// level: "vip", // 客户等级, 'vip'(vip客户)或者'normal'(普通客户)
// customerToken: "", //客户外部标识,第三方提供的客户唯一标识,此标识相同,udesk会识别为同一个用户
// organizationIds: [1, 2], // 客户公司id,需先调用获取客户公司列表接口
// customFields: {
// //客户自定义字段 值TextField_1 由客户拼接(需先调用获取客户自定义字段接口)
// TextField_1: "普通文本内容",
// SelectField_1: ["0"],
// },
},
// 业务记录信息 不必须
// noteInfo: {
// content: "测试主题123",
// customFields: {
// //客户自定义字段 值TextField_1 由客户拼接(需先调用获取客户自定义字段接口)
// TextField_1: "普通文本内容", //普通文本
// SelectField_8: "1",
// SelectField_5: "1", //单选框
// SelectField_1641: "1", //单选下拉
// SelectField_1645: "0,1,2,3" //多选
// }
// },
// bizId: "123abc", // 对接方业务id,事件回调推送通话记录时会回传bizId,第三方可以把通话记录绑定在对应订单上。
callTimes: 1, //允许通话次数 -1为不限制 默认 -1
// customChannel: "beijing", //自定义渠道 默认为空
callDirect: { //如需使用咨询对象列表和路由列表,不能初始化此对象
enable: true, //跳入小程序后直接进入呼叫流程。 默认false 可选 true/false
// agentId: 12, // 客服id 非必须
// agentGroupId: 7, // 客服组id 非必须
},
voiceOnly: false, //是否仅使用语音模式,默认false 可选 true/false
},
},
success(res) {
console.log(res);
// 打开成功
},
fail(res) {
console.log(res);
},
});
}