双人音视频对话

通过双人音视频通话功能(1v1 VoIP),用户可以直接在微信小程序内进行一对一视频通话或音频通话,提升微信小程序服务质量,且功能所需的开发成本极低。

从基础库 2.20.1 开始支持

申请开通

暂只针对国内主体如下类目的微信小程序开放,需要先通过类目审核,再在微信小程序管理后台,「开发」-「开发管理」-「接口设置」中自助开通该接口权限。

一级类目/主体类型 二级类目 应用场景
教育 在线视频课程 一对一辅导、答疑
医疗 互联网医院、公立医疗机构、私立医疗机构 在线问诊
金融 银行、信托、公募基金、私募基金、证券/期货、证券/期货投资咨询、保险、征信业务、新三板信息服务市场、股票信息服务市场(港股/美股)、消费金融 金融产品视频客服理赔等
汽车 汽车预售服务 汽车预售等
政府主体账号 / 政府相关工作在线咨询等
IT科技 多方通信、音视频设备、基础电信运营商 提供语音会议/视频会议等服务;硬件在线销售及服务等;提供在线客服等服务
工具 视频客服 不涉及以上几类内容的一对一客服服务,如企业售后一对一视频/音频通话等

前端接口

  • 开启双人通话:wx.setEnable1v1Chat
  • 加入(创建)双人通话:wx.join1v1Chat
  • 退出(销毁)双人通话:wx.exitVoIPChat
  • 更新房间麦克风/耳机静音设置:wx.updateVoIPChatMuteConfig
  • 监听房间成员变化:wx.onVoIPChatMembersChanged
  • 监听房间成员通话状态变化:wx.onVoIPChatSpeakersChanged
  • 监听通话中断:wx.onVoIPChatInterrupted
  • 监听实时语音通话成员视频状态变化:wx.onVoIPVideoMembersChanged

调用流程

  1. 通过 wx.setEnable1v1Chat 接口将用户的接听状态enable设置为true,该设置仅在当次微信小程序生命周期有效,微信小程序每次冷启动后均需要重新设置。
  2. 通过 wx.join1v1Chat 接口传入呼叫方信息caller与接听方信息listener发起呼叫,接听方与呼叫方均需在微信小程序内。

计费

微信为单个微信小程序提供每个自然月1000分钟的免费通话时长,1分钟语音通话时长扣除1分钟免费通话时长,1分钟视频通话时长扣除15分钟免费时长。超出部分需另行付费。 免费时长领取与套餐包购买需前往微信服务市场进行操作。

多人音视频对话

用于实现微信小程序内多人音视频对话的功能。

申请开通

微信小程序管理后台,「开发」-「接口设置」中自助开通该组件权限。相关接口 wx.joinVoIPChat 和组件 voip-room。

调用流程

开发者仅需提供房间唯一标识,即可加入到指定的房间。传入相同唯一标识的用户,会进到相同的房间。为了保证前端传入的 groupId 可信,wx.joinVoIPChat 接口要求传入签名。详见 签名算法。当加入视频房间时,可结合 voip-room 组件显示成员画面。

前端接口

  • 创建/加入房间:wx.joinVoIPChat
  • 离开房间:wx.exitVoIPChat
  • 更新房间麦克风/耳机静音设置:wx.updateVoIPChatMuteConfig
  • 监听房间成员变化:wx.onVoIPChatMembersChanged
  • 监听房间成员通话状态变化:wx.onVoIPChatSpeakersChanged
  • 监听通话中断:wx.onVoIPChatInterrupted
  • 监听实时语音通话成员视频状态变化:wx.onVoIPVideoMembersChanged
  • 订阅视频画面成员:wx.subscribeVoIPVideoMembers

签名算法

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

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

签名算法为:

// hmac_sha256需要开发者自行引入
signature = hmac_sha256([appId, groupId, nonceStr, timeStamp].sort().join(''), sessionKey)

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

  1. appId groupId nonceStr timeStamp 四个值表示成字符串形式,按照字典序排序;
  2. 将排好序的四个字符串拼接在一起;
  3. 使用 session_key 作为 key,使用 hmac_sha256 算法对 2 中的结果字符串做计算,所得结果即为 signature

示例:

appId = 'wx20afc706a711eefc'
groupId = '1559129713_672975982'
nonceStr = '8AP6DT9ybtniUJfb'
timeStamp = '1559129714'
session_key = 'gDyVgzwa0mFz9uUP7M6GQQ=='

str = [appId, groupId, nonceStr, timeStamp].sort().join('') = '1559129713_67297598215591297148AP6DT9ybtniUJfbwx20afc706a711eefc'
signature = hmac_sha256('1559129713_67297598215591297148AP6DT9ybtniUJfbwx20afc706a711eefc', sessionKey) = 'b002b824688dd8593a6079e11d8c5e8734fbcb39a6d5906eb347bfbcad79c617'

使用云开发完成签名

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

const cloud = require('wx-server-sdk')
cloud.init()

exports.main = async (event, context) => {
  const signature = cloud.getVoIPSign({
    groupId: 'xxx',
    timestamp: 123,
    nonce: 'yyy'
  })
  return signature
}

人数限制

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

频率限制

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