实时语音

用于实现游戏房间内多人实时语音功能的服务。

申请开通

仅限累计注册用户大于 1000 的小游戏使用。开发者需在 “MP 管理后台-设置-游戏设置” 申请开通接口使用权限。

调用流程

所有调用通过前端接口完成。开发者仅需提供房间唯一标识,即可加入到指定的房间。传入相同唯一标识的用户,会进到相同的语音房间。为了保证前端传入的 groupId 可信,wx.joinVoIPChat 接口要求传入签名。详见 签名算法

前端接口

签名算法

生成签名需要小游戏传入四个参数:

参数名说明
appId小游戏的 appId
groupId游戏房间的唯一标识,由游戏自己保证唯一
nonceStr随机字符串,长度应小于 128
timeStamp生成这个随机字符串的 UNIX 时间戳(精确到秒)

签名算法为:

  1. signature = hmac_sha256([appId, groupId, nonceStr, timeStamp].sort().join(''), sessionKey)

具体来说,这个算法分为几个步骤:

  • appId groupId nonceStr timeStamp 四个值表示成字符串形式,按照字典序排序;
  • 将排好序的四个字符串拼接在一起;
  • 使用 session_key 作为 key,使用 hmac_sha256 算法对 2 中的结果字符串做计算,所得结果即为 signature示例:
  1. appId = 'wx20afc706a711eefc'
  2. groupId = '1559129713_672975982'
  3. nonceStr = '8AP6DT9ybtniUJfb'
  4. timeStamp = '1559129714'
  5. session_key = 'gDyVgzwa0mFz9uUP7M6GQQ=='
  6. str = [appId, groupId, nonceStr, timeStamp].sort().join('') = '1559129713_67297598215591297148AP6DT9ybtniUJfbwx20afc706a711eefc'
  7. signature = hmac_sha256('1559129713_67297598215591297148AP6DT9ybtniUJfbwx20afc706a711eefc', sessionKey) = 'b002b824688dd8593a6079e11d8c5e8734fbcb39a6d5906eb347bfbcad79c617'

使用云开发完成签名

在云开发中,无法获取 session_key,但提供了单独的函数 cloud.getVoIPSign 来计算签名。

  1. const cloud = require('wx-server-sdk')
  2. cloud.init()
  3. exports.main = async (event, context) => {
  4. const signature = cloud.getVoIPSign({
  5. groupId: 'xxx',
  6. timestamp: 123,
  7. nonce: 'yyy'
  8. })
  9. return signature
  10. }

人数限制

每个房间最多同时加入 10 个人。

频率限制

对于每个小游戏,每天最多允许创建 100000 个语音房间。当所有人退出房间时,房间即被销毁。此时如果传入之前用过的 groupId 重新加入房间,会被计算为新开一个房间。