微信小程序 直播SDK
1 文档介绍
1.1 文档目的
众多客户希望能拥有更多的播放器设计能力,特别是对于拥有UI, 开发人员资源的公司。为此,特提供微信小程序端播放器集成SDK,以便客户可以针对自己的业务场景设计最符合自己业务场景的播放器。
本文档仅针对 直播 场景做SDK接口说明
1.2 术语与缩写解释
编号 |
术语 |
解释 |
|
SDK |
Software Development Kit |
|
Webcast服务 |
Gensee提供的直播服务 ,在域名后以webcast作为二级目录名 |
|
Training服务 |
Gensee提供的教育培训服务 ,在域名后以training作为二级目录名 |
|
站点(Site) |
Gensee的一个客户,拥有一个站点。通常站点的标示是域名,比如test.gensee.com |
2 SDK下载 测试和开发说明
2.1 SDK下载
下载地址:http://download.gensee.net/download/appsdk/xiaochengxu-live-demo-min-trunk-201020-0642.zip
微信小程序直播SDK V1.0:用于开发中使用。
微信小程序直播SDK测试页面及文档:此文件中包括接口开发文档和为测试接口开发的测试页面。测试页面是基于微信小程序SDK V1.0开发。
2.2 站点环境要求--全站https支持
由于微信小程序强制要求使用https安全链接,因为要求直播站点开启全站https支持。此操作需要263直播销售或者服务人员,通过环境变更申请完成。
2.3 微信小程序需要支持https和wss协议
由于微信小程序SDK内部也需要通信,故需要用户配置服务器域名
request合法域名: https://站点域名
https://wxjk.gensee.com
https://traceupload.gensee.com
socket合法域名:wss://wxjk.gensee.com
2.4 DEMO与源码
为了方便客户方开发人员快速实现小程序的开发,我们提供了完全基于SDK接口制作的小程序DEMO V1.0,并开放所有源码。
点击此处,下载小程序DEMO V1.0及源码。
DEMO源码的使用:
- 替换site=“product.gensee.com” 里的值为自己站点的域名
- 替换ownerid=“qnYvtuDg1R”为当前直播的sdk id
- 如果设置了直播密码,请设置authcode=“” 的值为直播密码
小程序DEMO V1.0功能:
小程序DEMO V1.0中包括大部分直播功能(并非全部),如需DEMO中未包括的功能,仍然需要开发人员阅读小程序开发文档接口中的接口说明自行开发。
以下为功能简介:
-
分类
功能项
直播状态
直播状态(未开始、播放中、已暂停、已结束)、并发数已满提示
直播信息
直播标题、在线人数
音视频
播放音视频,支持纯音频和音视频两种模式切换,支持视频全屏显示
文档
获取文档切换及翻页的通知
用户
获取用户加入及离开的通知、收到被操作行为(群体/个人禁言、踢出/封禁ip、群体禁止提问)
聊天
获取公聊及私聊数据、提交公聊及私聊数据、获取历史聊天30条记录,支持只查看我的聊天(不包括表情)
问答
接收问答信息、接收语音回复信息、提问信息提交,支持只查看我的问答
问卷 接收及提交问卷、接收问卷答案、接收问卷统计结果
点名 接收及提交点名及反馈点名结果
抽奖 接收抽奖开始及抽奖结果
系统消息 接收广播消息、群体禁止/允许聊天、全体禁止/允许提问、直播暂停/恢复
3 SDK使用介绍(直播)
3.1 需要在app.js中globalData定义currentTime , channel
globalData:{
channel: null,
currentTime:0
}
3.2 需要引入的javascript
videodemo为我们需要播放视频的页面,在videodemo.js中引入live.js及gssdk.js:
const LIVE = require("../../sdk/live");
const GSSDK = require("../../sdk/gssdk");
定义GS为sdk中的GS;
const GS = GSSDK.GS;
3.3 初始化代码
在liveTest.js页面中onLoad加入:
this.channel = GS.createChannel();
app.globalData.channel = this.channel;
并在onReady插入如下代码:
LIVE.init({
"site": "192.168.1.16",
"ownerid": "6bfece2378244a549ff497cbc8e11752",
"ctx": "webcast",
"authcode": "222222",
"uid": '123',
"uname": "lyy",
"encodetype": '',
"password": '',
"stream": '',
"k":'',
"islogger":true
}, function(e){
app.globalData.userInfo.userid = e.userid;
});
必填属性说明:
- site: 站点域名 (必填)Example:www.gensee.com
- ownerid: webcast服务下,表示为直播ID;training服务下,表示为课堂ID (必填)
- authcode: (可选)校验码。对应直播(课堂)的web端口令。若直播(课堂)要求输入口令,则此属性必填。否则不需要。
可选属性说明
- ctx: 服务选项。可选值为webcast或training。无此属性说明默认使用webcast服务。
- uid: 用户ID (数字型,可选)。若无此属性,系统会自动生成随机UID。为了避免uid跟Gensee系统的内部用户ID冲突,该uid要求必须大于1000000000 小于9007199254740992。
- uname: 用户名称(可选)。若无此属性,系统自动生成英文随机名称。若直播(课堂)要求登录,则用户名称必须是系统的登录账号。
- encodetype: 指定authcode的编码方式。值若为md5,则authcode必须经过MD5的32位小写编码过。不写该属性或者值为空,则authcode为明文。
- k: 若直播开启第三方认证功能,则需要k值验证。关于第三方认证,请参看Gensee_URL_API_SPEC。
- password: (可选)若直播(课堂)要求登录,此属性表示登录账号的密码。
- stream: 设置移动端初始化码流。值为:0 – 标清,1 – 原始。默认为1。
- k: 若直播开启第三方认证功能,则需要k值验证。
- islogger:是否记录日志(故障报告前需开启该值)值为:false-关闭,true-开启(默认)
3.4 bind, send
bind:接收数据
this.channel.bind("onVideoUrl", function(e){
console.log("视频URL:"+e.data);
});
send:发送数据
this.channel.send("submitChat", {"content": val, richtext: val});
3.5 样例代码
const app = getApp();
const LIVE = require("../../sdk/live");
const GSSDK = require("../../sdk/gssdk");
const GS = GSSDK.GS;
Page({
data: {
audioSrc:"",//语音地址
videoSrc: "",//视频地址
playSrc: "",//播放地址
},
onLoad:function(options){
this.channel = GS.createChannel();
app.globalData.channel = this.channel;
},
onReady: function (res) {
var that = this;
LIVE.init({
"site": "192.168.1.16",
"ownerid": '6bfece2378244a549ff497cbc8e11752',
"ctx": 'webcast',,
"authcode": '222222'
}, function(e){
console.log("回调");
app.globalData.userInfo.userid = e.userid;
});
//视频URL
this.channel.bind("onVideoUrl", function(e){
that.setData({
videoSrc: e.data,
playSrc: e.data
});
console.log("视频URL:"+e.data);
});
3.6 onAPIError加载错误提示
有时候,由于用户在使用sdk时,填入了错误参数,会导致sdk初始化失败。以下罗列所有的失败提示:
- param_error:必填参数未填写
- login_fail:要求登录,登录失败
- not_assign:直播未与该用户关联,该用户不能观看
- auth_fail:口令错误或第三方认证失败
- not_found:直播不存在
- service_disabled:服务(直播,教育培训等)已禁止
- required_client_join:要求使用客户端,web端不可用
- ipad_not_support:当前不支持移动平台
- api_disabled:SDK功能未开启
- ssl_not_support:SSL功能未开启
4 监听事件API(直播)
注意:所有事件触发,将收到event对象。其中data属性即数据参数。本文档中均以json格式来表达数据参数
4.1 onDocChange -- 文档翻页
参数:
{
"width": 800,
"height":600,
"hls":"http://192.168.1.248/httpstream/d5fa16edf9ff4947a5addfd621af4a70/2541125377_4.png?sessionid=11184"
"hlsid ": "2541125377_4"
"starttimestamp":92945
"stoptimestamp":92945
"taskId":"2541125377_4_252612"
}
参数 |
说明 |
width |
页宽 |
height |
页高 |
hls |
文档或ppt的地址 |
starttimestamp |
开始时间戳 |
stoptimestamp |
结束时间戳 |
taskId |
任务id |
hlsid |
hls地址中的文件的文件名 |
4.2 onDataReady -- SDK加载完毕,所有API生效
参数:
{
“minInterval”:0
}
参数 |
说明 |
minInterval |
聊天提问发言提交间隔,单位s,默认为0 |
4.3 onQA -- 收到问答消息
参数:
{
"id": "abcd-efg-hi",
"question": "how are you?",
"submitor": "Tom",
"answer": "fine, thank you.",
"answerBy": "Jack",
"submitTime": 9654123000,
"answerTime": 8795623000
"qaownerId": 8735466234
"removed": false|true
}
参数 |
说明 |
id |
问答UUID |
question |
问题 |
submitor |
提问者名称 |
answer |
回复 |
answerBy |
回复者名称 |
submitTime |
提问时间,单位秒 |
answerTime |
回复时间,单位秒 |
qaownerId |
提问者ID |
removed |
false:未删除问答 true:删除问答 |
4.4 onQARemove -- 清除某条问答
参数:
{
"id": "abcd-efg-hi",
}
参数 |
说明 |
id |
问答UUID |
4.5 onQAList -- 收到问答历史记录
参数:
{
"list": [
{
"id": "abcd-efg-hi",
"question": "how are you?",
"submitor": "Tom",
"answer": "fine, thank you.",
"answerBy": "Jack",
"submitTime": 9654123,
"answerTime": 8795623
"qaownerId": 8735466234
},
{
"id": "abcd-efg-hi",
"question": "how are you?",
"submitor": "Tom",
"answer": "fine, thank you.",
"answerBy": "Jack",
"submitTime": 9654123,
"answerTime": 8795623
"qaownerId": 8735462542
}
]
}
参数 |
说明 |
list |
问答列表,列表中每个对象都是问答对象。问答对象参数说明见onQA |
4.6 onSetting -- 功能配置更改通知
参数:
{
" enable":[true | false],
" target":["all" | "self"],
"option":["question" | "onlineuser" | "userlist" | "chat" | "multistream"]
}
参数 |
说明 |
enable |
true说明启用 false 说明禁用 |
target |
all – 对全体生效 self - 对个人生效 |
option |
question 提问 onlineuser显示在线人数 userlist 用户列表 chat 聊天 multistream 移动端多码流 |
4.7 onMessage -- 收到系统消息
参数:
{
"content":"通知。。。。"
}
参数 |
说明 |
content |
系统消息内容 |
4.8 onKickOut -- 被踢出
参数:
{
"reason":[0|1]
}
参数 |
说明 |
reason |
0-被会议组织者踢出;1-其他情况 |
4.9 onRollcall -- 收到点名通知
参数:
{
"timeout":15
"id":"23534677685687"
}
参数 |
说明 |
id |
点名ID |
timeout |
超时时间,单位秒 |
4.10 onLottery -- 抽奖
参数:
{
"action":["start"|"stop"|"abort"],
"user":"Tom"
}
参数 |
说明 |
action |
start 开始抽奖 stop 抽奖结束 abort 抽奖中途终止 |
user |
当抽奖结束时候,告诉中奖用户名称 |
4.11 onUserList -- 用户列表
参数:
{
"list": [
{"id":"1","name":"Tom","chatid":1,"role":"1,2"},
{"id":"2","name":"Jason","chatid":2,"role":"4"}
]
}
参数 |
说明 |
list |
用户列表 |
id |
用户ID |
name |
用户名称 |
chatid |
仅用于聊天列表的聊天ID |
role |
用户角色以组合的形式出现,可能是单个角色,可能是多个角色,多个角色用逗号分隔,角色对应含义如下: 组织者 = 1 主讲 = 2 嘉宾 = 4 普通参加者 = 8 Web参加者 = 16 |
4.12 onUserJoin -- 用户加入
参数:
{
"list": [
{"id":"1","name":"Tom","chatid":1,"role":"1"},
{"id":"2","name":"Jason","chatid":2,"role":"4"}
]
}
参数 |
说明 |
list |
用户列表 |
id |
用户ID |
name |
用户名称 |
chatid |
仅用于聊天列表的聊天ID |
role |
用户角色以组合的形式出现,可能是单个角色,可能是多个角色,多个角色用逗号分隔,角色对应含义如下: 组织者 = 1 主讲 = 2 嘉宾 = 4 普通参加者 = 8 Web参加者 = 16 |
4.13 onUserLeave -- 用户离开
参数:
{
"list": [
{"id":"1","name":"Tom","chatid":1,"role":"1"},
{"id":"2","name":"Jason","chatid":2,"role":"4"}
]
}
参数 |
说明 |
list |
用户列表 |
id |
用户ID |
name |
用户名称 |
chatid |
仅用于聊天列表的聊天ID |
role |
用户角色以组合的形式出现,可能是单个角色,可能是多个角色,多个角色用逗号分隔,角色对应含义如下: 组织者 = 1 主讲 = 2 嘉宾 = 4 普通参加者 = 8 Web参加者 = 16 |
4.14 onUserOnline -- 用户在线人数
参数:
{
"count":500
}
参数 |
说明 |
count |
当前并发数(非实时数据) |
4.15 onStart -- 直播开启通知
参数:
{
}
参数 |
说明 |
|
|
4.16 onPause -- 直播暂停通知
参数:
{
}
参数 |
说明 |
|
|
4.17 onPlay -- 直播恢复通知
参数:
{
}
参数 |
说明 |
|
|
4.18 onStop -- 直播停止通知
参数:
{
}
参数 |
说明 |
|
|
4.19 onVote -- 收到调查问卷
参数:
{
"id": "abcd-efg-hi",
"skip": [true|false],
"subject": "test vote",
"questions": [
{
"id": "uuid",
"subject": "first question",
"type": ["single"|"multi"|"text"],
"answer": "1,3",
"text":””,
"score":"5",
"items": [
{
"id": "uuid",
"correct": [true|false],
"option": "answer1",
"selected":false
},
{
"id": "uuid",
"correct": [true|false],
"option": "answer2",
"selected”:false
}
]
}
]
}
参数 |
说明 |
id |
投票ID; 问题ID;选项(答案)ID |
skip |
false表明是强制投票 |
subject |
投票主题;问题 |
questions |
问题列表 |
type |
single 单选题 multi 多选题 text 文字题 |
answer |
Single或者multi类型时候,表明哪些选项是正确答案。多选时候,用数组表达。 |
text |
默认为空。预留给submitVote这个API使用 |
items |
选项(答案)列表 |
option |
选项(答案) |
correct |
是否为正确答案,与answer属性作用相同 |
selected |
默认为false。表明用户没有选择该项。预留给submitVote这个API使用。 |
score |
分数 |
4.20 onVoteResult -- 发布调查结果
参数:
{
"id": "abcd-efg-hi",
"total": 2,
"subject": "test vote",
"questions": [
{
"id": "uuid",
"subject": "first question",
"type": "single",
"total": 2,
"score":"5",
"items": [
{
"id": "uuid",
"total": 1,
"option": "answer1",
},
{
"id": "uuid",
"total": 1,
"option": "answer2"
}
]
}
]
}
参数 |
说明 |
id |
参考onVote接口 |
total |
投票人数 |
4.21 onStatus -- SDK状态通知
参数:
{
"type":[1 | 2 | 3 | 4 | 5] ,
"explain":”license not enough”
}
参数 |
说明 |
type |
类型 1 - License不足; 2 - 直播未开始; 8 – 该用户已被封,加入失败 9 - 视频第一次缓冲播放开始 |
explain |
说明 |
4.22 onAPIError -- API错误通知
参数:
{
"api":"submitQuestion",
"param":{……},
“explain”:”format error”,
“type”:1
}
参数 |
说明 |
api |
API名称 |
param |
API所提交的原始参数 |
explain |
说明 |
type |
错误类型 0 – API名称错误 1 – 参数校验错误; 2 – 必填项缺失; |
4.23 onPublicChat – 收到公聊消息
参数:
[
:{
"id":"123456",
"sender":"vincent",
"senderId":2,
"senderUid":3467734,
“content”:”hi, how are you”,
“richtext”:”…..”,
"sendRole":"1,2",
}
{
"id":"uuid",
"sender":"vincent",
"senderId":2,
"senderUid":3467734,
“content”:”hi, how are you”,
“richtext”:”…..,
"sendRole":"4",
}
]
参数 |
说明 |
id |
聊天消息id |
sender |
发送者名称 |
senderId |
发送者聊天ID |
senderUid |
发送者用户ID |
content |
聊天内容 |
richtext |
聊天内容带有富文本内容(满足HTML格式) |
senderRole |
用户角色以组合的形式出现,可能是单个角色,可能是多个角色,多个角色用逗号分隔,角色对应含义如下: 组织者 = 1 主讲 = 2 嘉宾 = 4 普通参加者 = 8 Web参加者 = 为空 |
utctime | 聊天的服务器时间戳 |
4.24 onPriChat – 收到私聊消息
参数:
:{
"id":"123456",
"sender":"vincent",
"senderId":2,
"senderUid":3467734,
“content”:”hi, how are you”,
“richtext”:”…..”,
"sendRole":"1,2",
}
参数 |
说明 |
id |
聊天消息id |
sender |
发送者名称 |
senderId |
发送者聊天ID |
senderUid |
发送者用户ID |
content |
聊天内容 |
richtext |
聊天内容带有富文本内容(满足HTML格式) |
senderRole |
用户角色以组合的形式出现,可能是单个角色,可能是多个角色,多个角色用逗号分隔,角色对应含义如下: 组织者 = 1 主讲 = 2 嘉宾 = 4 普通参加者 = 8 Web参加者 = 为空 |
utctime | 聊天的服务器时间戳 |
4.25 onNetSettings -- 获取优选网络信息
事件说明:优选网络信息, 是requireNetSettings请求的回调事件
参数:
[
{
"label":"浙江电信",
"selected":"[true|false]",
},
{
"label":"浙江网通",
"selected":"[true|false]",
}
]
参数 |
说明 |
label |
可选网络内容 |
selected |
true当前已选中网络,false 当前未选中网络 |
4.26 onAnnoClear-- 清空标注内容
事件说明:此事件的触发会清空标注内容
参数:
{
}
参数 |
说明 |
|
|
4.27 onChatRemove - 聊天移除
事件说明:删除特定聊天数据
成功参数:
{
"censorList":[{
"type":"user|chat",
"id":"123456",
},{
"type":"user|chat",
"id":"123456",
}]
}
参数 |
说明 |
censorList |
审核删除的聊天数据列表 |
type |
删除聊天类型 user该用户的聊天消息 chat单条聊天消息 |
id |
删除消息id 根据type类型来确定用户id 或者 聊天消息id |
4.28 onQAHighlight -- 当前正在被语音回复的某问题
参数:
{
"id":"354-475685-23543",
}
参数 |
说明 |
id |
当前正在被语音回复的问题ID |
4.29 onCancelHighlight -- 该问题已经语音回复结束
参数:
{
"id":"354-475685-23543",
}
参数 |
说明 |
id |
已经语音回复结束的问题ID |
4.30 onTagAudio -- 该问题已经进入语音回复列表
参数:
{
"id":"354-475685-23543",
}
参数 |
说明 |
id |
已经进入语音回复列表的问题ID |
4.31 onInitAnno-- 首次加入直播加载历史标注
参数:
[
{
color:"#000000,1"
documentid:"2940725505"
fontsize:""
id:"18032094054065880"
linesize:"2"
p:(26) ["243,128", "243,141", "243,147", "243,162", "240,172", "236,183", "233,198", "228,213", "221,238", "211,261", "200,285", "189,311", "180,332", "166,359", "156,377", "151,389", "145,400", "139,410", "135,419", "132,424", "131,426", "130,427", "129,428", "129,426", "130,420", "130,420"]
pageid:"0"
removed:""
starttimestamp:6024554
stoptimestamp:6024555
style:""
type:"2"
}
]
参数 |
说明 |
color |
颜色和透明度 |
documentid |
文档的id |
fontsize |
字体的大小 |
id |
Id |
linesize |
线条粗细 |
p |
坐标 |
pageid |
页码id |
removed |
移除 |
starttimestamp |
开始时间 |
stoptimestamp |
结束时间 |
style |
样式: 0:直线 1:虚线 2:带箭头 |
type |
标注类型: 2:自由笔 3:删除 4:文字 5: 椭圆 6:矩形 7|8:线 1|9:激光笔 |
4.32 onVideoUrl -- 视频url
参数:
{
http://192.168.1.248/httpstream/d5fa16edf9ff4947a5addfd621af4a70/record.m3u8?sessionid=393767252&t=1521444454950
}
参数 |
说明 |
|
视频地址 |
4.33 onAudioUrl -- 音频url
参数:
{
http://192.168.1.248/httpstream/d5fa16edf9ff4947a5addfd621af4a70/recordaudioonly.m3u8?sessionid=1474025163&t=1521444574256
}
参数 |
说明 |
|
音频地址 |
4.34 onTitle -- 课堂主题
参数:
{
"content": "我有一只小毛驴"
}
参数 |
说明 |
content |
课堂(直播)主题 |
4.35 onAnnotation-- 直播过程中的标注
参数:
{
"annoArray":[{
color:"#000000,1"
documentid:"2940725505"
fontsize:" "
id:"18032094054065880"
linesize:" 1|2|3|4|6"
p:(26) ["243,128", "243,141", "243,147", "243,162", "240,172", "236,183", "233,198", "228,213", "221,238", "211,261", "200,285", "189,311", "180,332", "166,359", "156,377", "151,389", "145,400", "139,410", "135,419", "132,424", "131,426", "130,427", "129,428", "129,426", "130,420", "130,420"]
ep:"603,76"
pageid:"0"
removed:""|0|984654165415412
starttimestamp:6024554
style:""
type:"2"
hls:"http://192.168.1.195/httpstream/55407612fe0248618f4ef6af582c3337/3138371074_0.png?sessionid=92737498"
}]
starttimestamp:0
stoptimestamp:0
taskId:"3027608066_0_18032093800410641_17802492_1"
}
参数 |
说明 |
color |
颜色和透明度 |
documentid |
文档的id |
fontsize |
字体的大小 |
id |
Id |
linesize |
线条的粗细:1|2|3|4|6 数值越大线条越粗 |
p |
开始坐标 |
ep |
结束坐标(除了type=2没有) |
pageid |
页码id |
removed |
0: 清屏 984654165415412: 某条标注 "":没有特殊含义 |
starttimestamp |
开始时间 |
stoptimestamp |
结束时间 |
style |
样式: 0:直线 1:虚线 2:带箭头 |
type |
标注类型: 2:自由笔 3:删除 4:文字 5: 椭圆 6:矩形 7|8:线 1|9:激光笔 |
taskId |
任务id |
hls |
标注所在的文档的地址 |
4.36 onAnswerSheet - 收到答题卡
参数:
{
"id": "abcd-efg-hi",
"skip": "false",
"questions": [{
"id": "uuid",
"type": ["single"|"multi"],
"items": [{
"id": "uuid",
"option": "answer1",
"selected":"false"
},
{
"id": "uuid",
"option": "answer2",
"selected":"false"
}]
}]
}
参数 |
说明 |
id |
答题卡ID; 问题ID;选项(答案)ID |
skip |
false表明是强制操作 |
questions |
问题列表 |
type |
single 单选题 multi 多选题 |
items |
选项(答案)列表 |
option |
选项(答案) |
selected |
选项是否选中 |
4.37 onAnswerSheetAnswer - 发布答题卡答案
参数:
{
"id": "abcd-efg-hi",
"questions": [{
"id": "uuid",
"type": ["single"|"multi"],
"total":"100",
"items": [{
"id": "uuid",
"total":"20",
"correct":["true"|"false"],
"option": "answer1",
},
{
"id": "uuid",
"total":"20",
"correct":["true"|"false"],
"option": "answer2",
}]
}]
}
参数 |
说明 |
id |
答题卡答案ID; 问题ID;选项(答案)ID |
questions |
问题列表 |
type |
single 单选题 multi 多选题 |
total |
100 该题目分数 ;该选项分数 |
items |
选项(答案)列表 |
option |
选项(答案) |
correct |
是否为正确答案 |
5 提交数据API
5.1 submitQuestion -- 提问
注意:此接口不支持表情,如果两个问题的提交有设置间隔时间,那么在间隔内提交问题不会成功的。同时如果提交问题有设置回调函数那么会调用回调函数。
参数:
{
"content":"what's your name?"
}
参数 |
说明 |
content |
问题内容 |
5.2 submitVote -- 提交调查问卷结果
参数:
提交对象格式同onVote,请参看onVote接口的参数说明
{
"id": "abcd-efg-hi",
"skip": [true|false],
"subject": "test vote",
"questions": [
{
"id": "uuid",
"subject": "first question",
"type": ["single"|"multi"|"text"],
"answer": "1,3",
"text":””
"items": [
{
"id": "uuid",
"correct": "[true|false]",
"option": "answer1",
"selected" : "[true|false]"
},
{
"id": "uuid",
"correct":"[true|false]",
"option": "answer2",
"selected" : "[true|false]"
}
]
}
]
}
参数 |
说明 |
|
|
5.3 submitRollcall -- 提交点名 ,说明该用户出席。
参数:
{
"id":"23534677685687"
}
参数 |
说明 |
id |
点名ID。 |
5.4 submitChat -- 提交公聊信息
注意:此接口不支持表情,content与richtext至少提交其中之一,若同时提交content和richtext时,以richtext为准。
如果两个公聊信息的提交有设置间隔时间,那么在间隔内提交公聊信息不会成功的,同时如果提交公聊信息有设置回调函数那么会调用回调函数。
(提议:以input、textarea作为聊天信息输入的,使用content属性提交信息,以div[contenteditable] 作为聊天信息输入的,使用richtext属性提交信息)
参数:
{
"content":"hello",
"richtext":"……",
"security":"[default|high]"
}
参数 |
说明 |
content |
聊天内容 |
richtext |
支持富文本(字体大小 颜色)。 |
security |
设置聊天内容的安全等级权限,default是原有的较低的安全等级模式,high为新增较高安全等级模式,缺省该属性默认为default安全等级 |
5.5 submitChatTo -- 提交私聊信息
注意:此接口不支持表情,content与richtext至少提交其中之一,若同时提交content和richtext时,以richtext为准。
如果两个私聊信息的提交有设置间隔时间,那么在间隔内提交私聊信息不会成功的,同时如果提交私聊信息有设置回调函数那么会调用回调函数。
(提议:以input、textarea作为聊天信息输入的,使用content属性提交信息,以div[contenteditable] 作为聊天信息输入的,使用richtext属性提交信息)
参数:
{
"content":"hello",
"richtext":"hello",
"receiverId":2,
"receiver":"tom wang",
"security":"[default|high]"
}
参数 |
说明 |
content |
聊天内容 |
richtext |
支持富文本(字体大小 颜色)。 |
receiver |
接收者名称,可选参数 |
receiverId |
接收者聊天ID,必填参数 |
security |
设置聊天内容的安全等级权限,default是原有的较低的安全等级模式,high为新增较高安全等级模式。 缺省该属性默认为default安全等级 |
5.6 submitNetChoice-- 提交优选网络
参数:
{
"label":"快乐的喵星人巴拉巴拉",
}
参数 |
说明 |
label |
优选网络的描述 |
5.7 requireNetSettings -- 请求优选网络信息
参数:
{
}
参数 |
说明 |
|
|
5.8 uploadLogFile - 日志主动上报
参数:
{
“callback”:function(){}
}
参数 |
说明 |
callback |
提交成功的回调函数。 |
5.9 submitAnswerSheet - 提交答题卡测试结果
参数:
提交对象格式同onAnswerSheet接口,请参看onAnswerSheet接口的参数说明
{
"id": "abcd-efg-hi",
"skip": "false",
"questions": [{
"id": "uuid",
"type": ["single"|"multi"],
"items": [{
"id": "uuid",
"option": "answer1",
"selected":["false"|"true"]
},
{
"id": "uuid",
"option": "answer2",
"selected":["false"|"true"]
}]
}]
}
6 补充说明
6.1 Video/Audio绑定currentTime用法(必需)
在视频/音频标签上绑定监听bindtimeupdate执行timeupdate方法:
<video id="myVideo" src=" bindtimeupdate="timeupdate"></video>
<audio id="myAudio" src=" bindtimeupdate="timeupdate"></audio>
timeupdate: function(event){
app.globalData.currentTime = event.detail.currentTime;
}
6.2 Video/Audio绑定bindplay(必需)
<video id="myVideo" src=" bindplay="play"></video>
<audio id="myAudio" src=" bindplay="play"></audio>
play: function(e){
LIVE.toldPlay();
LIVE.initBindPlay();
LIVE.initBindPlaying();
}
6.3 Video/Audio绑定bindpause(必需)
<video id="myVideo" src=" bindpause="pause"></video>
<audio id="myAudio" src=" bindpause="pause"></audio>
pause: function(e){
LIVE.initBindPause();
}
6.4 Video绑定bindwaiting(必需)
<video id="myVideo" src=" bindwaiting="wait"></video>
wait: function(e){
LIVE.initBindWaiting();
}
6.5 Video/绑定bindended(必需)
<video id="myVideo" src=" bindended="end"></video>
<audio id="myAudio" src=" bindended="end"></audio>
end: function(e){
LIVE.initBindEnded();
}
6.6 初始化变量(必需、重点)
由于小程序加载模式,在视频/音频页面必须添加onUnload生命周期函数,并且在此生命周期中调用特殊函数,示例代码如下:
onUnload: function(res){
LIVE.refresh();
}
7 第三方权限认证接口集成
7.1 背景
Gensee直播系统在很多情况下,需要和第三方系统(网站或管理系统)集成使用。在不涉及权限控制时候,基本可以满足集成要求。
在很多情况下,第三方系统希望Gensee的接口能够判断用户是否有权限观看直播。在用户数据,权限数据不在Gensee系统托管情况下,我们设计以下流程用来实现简单的权限认证过程。
7.2 认证流程
7.3 流程说明
1. 采用管理员角色,进入后台管理系统,启用第三方权限认证并配置第三方权限认证URL地址:
2. 使用第三方认证接口加入Gensee直播时候,务必带上k这个参数。若没有这个参数或该参数内容为空,则认为认证失败。
3. Gensee系统收到接口调用请求后,会向第三方认证url发送http post请求,同时把k参数作为post数据提交回第三方系统。由第三方系统重新验证k值合法性。若第三方认证通过,第三方认证url返回字符串”pass”,否则返回”fail”。
4. Gensee系统根据第三方认证URL返回值判断认证是否成功:当http response状态不为200且http response的内容不为pass时,接口将会抛出错误信息。若该地址未配置,则接口将会抛出错误信息;若认证成功,则进入直播页面。
7.4 k参数说明
7.4.1 设计原理
由第三方系统自行产生校验码,传递到Gensee,再由Gensee回调第三方认证URL判断校验码。整个过程,Gensee无需了解校验码生成规则,降低系统耦合度。
7.4.2 参数特征
第三方认证的接口使用方式,都是在进行url传递,因此url本身是很容易被探测截获的。这就要求第三方系统在生成k值时候,必须保证:
- 每次调用接口产生不同的k值
- k值在第三方系统必须具有时效性
- k值若包含第三方系统内部信息,必须加密或混淆过
7.4.3 建议的K值参考实现
第三方系统可以考虑K值元素包括用户ID,Gensee的直播ID,时间戳(1970-01-01至今的秒数)
元素组合加密后,经base64或者hex算法匹配成URL可识别编码,即产生K值
K值在第三方系统中持久化或放在cache中
回调验证时,根据时间戳判断是否在设定时间内有效。
验证结束,若认证通过,则从db或cache中移除K值
Db或cache建议有时效性控制,自动失效或定期清理过期数据