设置微信小程序界面配置

设置插件通话界面,需保证在通话开始前设置

参数

Object req

属性 类型 默认值 必填 说明 最低版本
btnText string 接听页面按钮文案,与使用 setCustomBtnText 一致
callerUI UIConfig 主叫方通话界面设置
listenerUI UIConfig 被叫方通话界面设置
handsFree boolean true 是否开启免提(true 为扬声器输出,false 为听筒输出)。
仅在设备端生效
插件 2.3.0,WMPF >= 2.0
isSelfWindowMax boolean false 视频通话时,控制主窗口默认是否显示本端画面。(true 为本端,false 为对端) 2.3.4
customBoxHeight string ’90vh’ 接听页自定义按钮点击后弹层高度。仅支持 70vh 或 90vh。 2.3.10

UIConfig

属性 类型 默认值 必填 说明 最低版本
cameraRotation number 0 视频画面旋转角度,有效值为 0, 90, 180, 270
aspectRatio number 4/3 视频画面宽高比,使用方法见示例
horMirror boolean false 视频画面水平镜像
vertMirror boolean false 视频画面垂直镜像
enableToggleCamera boolean true 视频通话是否支持切换摄像头。false 时不显示切换摄像头按钮。
仅在手机微信内生效。WMPF 默认开启摄像头,且不显示开关按钮。
objectFit string ‘fill’ 视频画面与容器比例不一致时的显示方式。支持 fill/contain,使用方法见示例 2.3.8

aspectRatio 与 objectFit 的设置示例:

返回值

示例代码

const wmpfVoip = requirePlugin('wmpf-voip').default

wmpfVoip.setUIConfig({
  btnText: '去开门',
  callerUI: {
    aspectRatio: 16 / 9,
  },
  handsFree: false,
})

void setVoipEndPagePath(Object req)

设置插件功能执行完成后的跳转页面路径。

参数

Object req

属性 类型 默认值 必填 说明 最低版本
url string 跳转页面的路径
key string 业务类型,参见下文
options string 跳转页面的 queryString。最终跳转的路径为 url + '?' + options
routeType string redirectTo 页面跳转的方式,取值有:redirectTo/switchTab/reLaunch 2.3.9

业务类型

key 参数有以下取值

  • Call:设置通话结束后跳转的页面路径,需保证在通话结束前设置
  • BindContact:设置联系人绑定关系页面操作完成后要跳转的页面路径。仅用于校园场景支付刷脸模式。

返回值

示例代码

const wmpfVoip = requirePlugin('wmpf-voip').default

// 可根据 typeof wmpf !== 'undefined' 判断是否是设备端跳转不同页面
wmpfVoip.setVoipEndPagePath({
  url: '/pages/contactList/contactList',
  options: 'param1=xxx&param2=xxx',
  key: 'Call',
})

getIotBindContactList(Object req)

本接口为异步接口,返回 Promise 对象。

根据 openId,查询指定用户是否授权某台设备。

参数

Object req

属性 类型 默认值 必填 说明
sn string 设备 SN
model_id string 设备的 model_id
openid_list string[] 要查询的用户 openId 列表

返回值

Object

属性 类型 说明
errcode number 错误码
errmsg string 错误信息
contact_list Info[] openid 授权信息,status: 1 表示已授权,0 表示未授权

示例代码

const wmpfVoip = requirePlugin('wmpf-voip').default

wmpfVoip
  .getIotBindContactList({
    sn: '设备sn',
    model_id: '申请的modelid',
    openid_list: ['openid_1', 'openid_2'], // 传入需要验证的openid列表
  })
  .then(res => {
    console.log(`[getIotBindContactList]:`, res.contact_list)
    // [{sn: 'xxx', model_id: 'xxx', status: 0}]
    // status: 0/未授权;1/已授权
  })

VoIP 插件错误码

1. 后台返回错误码

errCode 描述
1 roomId 错误
2 设备 deviceId 错误
3 voip_id 错误
4 voipToken 错误(刷脸模式)
5 生成 voip 房间错误
7 openId 错误
8 openId 未授权(刷脸模式)
9 openId 未授权设备(硬件模式)或不是 userId 联系人(刷脸模式)
12 微信小程序音视频能力审核未完成,正式版中暂时无法使用
13 硬件设备拨打微信,voipToken 错误
14 微信拨打硬件设备,voipToken 错误
15 欠费
17 voipToken 对应 modelId 错误
19 openId 与微信小程序 appId 不匹配(同一个用户在不同微信小程序的 openId 不同)
20 openId 无效
22 传入的 chargeType 非法
23 当前设备 license 已过期
24 当前设备未激活 license

2. 插件内部错误码

以插件最新版本支持为准

errCode 描述
1000 使用 WMPF 注册设备时,deviceToken 获取失败
1001 voipToken 为空或类型错误(仅在要求传入的情况下)
1002 CGI 请求失败
1003 CGI 返回值解析失败
1004 接口调用参数错误
1005 插件当前正在处理其他通话
1006 当前接口必须在 WMPF 中使用
1007 当前接口必须在微信客户端中使用
1008 通话被中断,具体原因需查看 errMsg
1011 当前平台不支持该功能
2000 加入房间失败,具体原因需查看 errMsg
2001 加入房间失败:当前有其他微信小程序 VoIP 通话正在进行
2002 加入房间失败:SDK 重置失败
2003 加入房间失败:SDK 初始化失败
2004 加入房间失败:SDK 加入房间失败
2005 加入房间失败:join 回调失败
2006 加入房间失败:talk 回调失败
2007 加入房间失败:调用音视频设备失败(如无法启用麦克风等)
2008 加入房间失败:获取 sessionKey 失败
2009 加入房间失败:已取消或微信小程序退到后台
2010 加入房间失败:join CGI 请求失败
2100 加入房间失败:当前有其他微信好友 VoIP 或系统电话正在进行
2102 加入房间失败:无访问音视频设备的权限(如录音权限等)
2103 加入房间失败:无调用 JSAPI 的权限
2104 加入房间失败:其他 CGI 异常,具体原因需查看 errMsg

3. Error 类

需要插件 2.4.0 版本开始支持

3.1 VoipError

插件抛出异常的基类,继承自 Error,并增加下列属性:

属性名 类型 简介
errMsg string 错误信息
errCode number 错误码
errno number 基础库接口返回的 errno
cause unknown 如果错误本身是由其他错误引起的,这里包含原始的错误对象

3.2 VoipCgiError

后台请求失败错误,继承自 VoipError,仅作类型区分,没有新增属性。

3.3 VoipJoinError

加入房间失败相关错误,继承自 VoipError,并增加下列属性:

这两个属性开发者一般不需要关注,仅微信侧排查问题需要

属性名 类型 简介
extErrMsg string wx.joinVoipChat 报错里额外的信息
errType number wx.joinVoipChat 报错返回的 errType

3.4 VoipPluginError

插件内其他类型的错误,继承自 VoipError,仅作类型区分,没有新增属性。

校园场景支付刷脸模式

对于部分存量的支付刷脸设备,我们额外支持通过微信支付人脸识别的用户身份来发起通话。

支付刷脸设备的通话存在以下限制:

  • 只支持微信支付刷脸设备使用,具体的开通方式请参考微信支付的相关文档;
  • 只支持安卓设备,WMPF <= 2.0 版本;
  • 只支持设备发起呼叫,不支持手机微信呼叫设备。

1. 发起通话

支付刷脸设备也是通过 initByCaller 接口发起通话,但是在参数上有一些区别。支付刷脸设备请使用下列 businessType:

businessType 业务类型 caller.id listener.id voipToken 最低版本
0 刷脸模式(时长计费) 微信支付刷脸返回的 user_id 微信用户 openId 微信支付刷脸返回的 voip_token
3 刷脸模式(license 计费) 同上 同上 同上 2.3.8
  • 使用前,需要在微信小程序中提前通过 wx.authorize 让 openId 对应的用户授权 scope.voip,否则会返回 errCode: 8,具体流程请参见第 2 节;
  • listener 必须为 caller 联系人。否则会返回 errCode: 9

2. 联系人管理

2.1 联系人绑定

校园场景下,开发者需要接入插件「联系人绑定关系」功能,只有在家长完成关系绑定操作后,孩子才可以给家长拨打音视频电话。

联系人绑定是 userId(孩子)和 openId(家长)的映射关系,开发者还能够通过相关接口实现联系人管理功能。

管理员绑定

第一个联系人为管理员,需要 wx.authorize 授权 voip.scope,再调用插件接口 wmpfVoip.bindVoipAdminContact 完成绑定。

// 绑定成为管理员
try {
  await wx.authorize({
    scope: 'scope.voip',
  })
  const res = await wmpfVoip.bindVoipAdminContact({
    userId: 'xxxxxx', // 传入微信支付刷脸返回的 user_id
  })
  console.log(`bindVoipAdminContact`, res)
} catch (error) {
  console.error('authorize scope voip', error)
  wx.showToast({
    title: '请前往设置页授权通话提醒',
    icon: 'none',
  })
}

其他联系人绑定

其他联系人由管理员分享页面进行绑定。即管理员在微信小程序中点击「分享」按钮, 并通过 wmpfVoip.getBindContactPath 获取插件分享页面链接,并在页面的 onShareAppMessage 中设置。

绑定完成后,会跳转到 setVoipEndPagePath 设置的页面。

// 获取插件联系人绑定关系页面路径,用户会在该页面进行关系绑定操作。
// 分享绑定页面:在学生管理员进入页面时,提前获取分享链接
wmpfVoip
  .getBindContactPath({
    userId: 'xxxx', // 学生 id
    userName: 'xxxx', // 学生名字
    userAvatar: 'xxxx', // 学生头像
  })
  .then(path => {
    // 在 onShareAppMessage 中使用 path
    // 可在 path 后拼上参数, 如'&xxx=yyy', <a href="https://weixin-xiaochengxu-kaifa.yuannext.com">微信小程序</a>中通过 getPluginEnterOptions 获取
  })

// Page 中
Page({
  onShareAppMessage() {
    return {
      title: `邀请你成为「${userName}」的联系人`,
      path: 'xxxx', // getBindContactPath 获取的 path
    }
  },
})

// app.js
App({
  onLoad() {
    // 设置联系人绑定关系页面操作完成后要跳转的页面路径。
    wmpfVoip.setVoipEndPagePath({
      key: 'BindContact',
      url: 'xxxxxx',
      options: 'param1=xxx&param2=xxx',
    })
  },
})

注意

  • userName 和 userId(微信支付刷脸返回的 user_id)应与拨打方(学生)信息录入时保持一致;
  • 拨打方应能获取接听方联系人的 openId、名字, 用于显示在联系人列表页面;
  • 在完成绑定过程中,会触发相应事件。可通过 onVoipEvent 进行监听。具体参考 bindContact 的 type。

2.2 查询联系人列表

插件接口

wmpfVoip.getVoipBindContactList({ userId: '学生userId' }).then(list => {
  /**
      [{
        user_id: 'xxx',
        is_ad: 0, // 0 普通联系人,1 管理员
        openid_list: [], // 管理员可以获取孩子(user_id)下绑定的所有联系人(openid)列表,包括自己。
      }]
    */
})

后台接口

请求地址

POST https://api.weixin.qq.com/wxa/business/getvoipcontactlist?access_token=ACCESS_TOKEN

请求参数

属性 类型 必填 说明
access_token / cloudbase_access_token string 接口调用凭证
user_id string 学生 userId

返回值

Object

返回的 JSON 数据包

属性 类型 说明
errcode number 错误码
errmsg string 错误信息
contact_list ContactInfo[] 联系人列表

ContactInfo

属性 类型 说明
open_id string 联系人 openid
role number 联系人身份,0 为普通联系人,1 为管理员。

errCode 合法值

errCode 说明
0 成功
1 用户无联系人列表

2.3 删除联系人

只有管理员才能删除学生(user_id)的联系人(openid),管理员不能删除自己。

wmpfVoip.deleteVoipBindContact({
  userId: 'xxx',
  openidList: ['openId1', 'openId2'],
})

2.4 转移管理员

只有管理员才能调用转移接口。

wmpfVoip.transerAdmin({
  userId: 'xxx',
  newAdminOpenid: '新管理员的openid',
})

2.5 监听事件

在绑定联系人的过程中,onVoipEvent 会收到 bindContact 事件,获取分享绑定联系人状态:

data 参数

属性 类型 说明
type string 绑定结果,取值参见下文
errMsg string 错误信息
userId string 学生 user_id

type 取值

type 描述
success 联系人绑定成功
unbind 联系人未绑定该学生
binded 联系人已绑定过该学生
expire 分享链接过期
overload 该学生绑定的联系人已超过限制
invalid 分享链接非法,原因可能是该链接由非管理员分享
auth 联系人授权 scope.voip 失败
cancel 联系人取消绑定

微信小程序音视频通话插件更新日志

2.4.6

  1. 增加了 camera-device 组件
  2. 优化

2.4.5

  1. 增加了 Voip 视频通话时的微信视频编码参数

2.4.4

  1. 优化

2.4.2 – 2.4.3

  1. 修复:拨打后快速挂断,可能导致后续通话发起失败的问题。

2.4.1

  1. 新增:使用 callDevicecallWMPF 呼叫设备时,可以不需要用户授权。
  2. 修复:部分情况下静音和免提状态错误问题。

2.4.0

  1. 新增:新接口 callDevice 支持微信呼叫 Linux 设备。
  2. 新增:新接口 callWMPF 优化微信呼叫安卓 WMPF 的能力,并支持使用 license 计费。
  3. 优化:梳理和补充各类报错的错误码。
  4. 优化:为避免与设备组混淆,groupId 统一更名为 roomId。groupId 参数作为别名仍保留。
  5. 优化:通话稳定性优化。

2.3.10

  1. 新增:支持设置自定义按钮点击后弹出的半屏高度为 75vh(默认 90vh)。
  2. 修复:调用 onVoipEvent 的返回值无法正常 off 事件监听的问题。
  3. 修复:点击屏幕隐藏按钮后按钮仍能响应点击的问题。
  4. 修复:部分 UI 布局问题。
  5. 优化:通话页面屏蔽分享防止用户误操作。

2.3.9

  1. 新增:视频通话过程中支持点击屏幕隐藏按钮。
  2. 新增:setVoipEndPagePath支持自定义页面跳转方式。
  3. 优化:部分 UI 样式调整。
  4. 优化:通话稳定性优化。

2.3.8

  1. 新增:initByCaller 支持使用 timeLimit 参数设置最大通话时长。
  2. 新增:initByCaller 返回 chargeType 表示当次通话使用时长还是 License 计费。
  3. 新增:支持支付刷脸设备使用 License。
  4. 新增:setUIConfig 支持设置 objectFit。
  5. 优化:设备端如果设置了跳转页面,通话结束后不显示通话详情。
  6. 优化:偶现通话时间显示异常问题。
  7. 优化:通话稳定性优化。