获取插件入口参数

获取从插件页面进入微信小程序的启动参数。

从插件页面进入微信小程序时,微信小程序本身无法直接通过wx.getEnterOptionsSync 获取启动参数,故提供本接口。

注意:当微信小程序在前台时被客户端 reLaunch(例如手机微信来电提醒打开微信小程序,或 WMPF launchMiniProgram 接口打开微信小程序),这种情况下并不算「进入微信小程序」,getPluginEnterOptions 无法获取最新的 query,需要通过 getPluginOnloadOptions 获取。

参数

返回值

Object

启动参数。与插件调用wx.getEnterOptionsSync返回值一致。

示例代码

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

const query = wmpfVoip.getPluginEnterOptions()

获取插件 onload 选项

微信小程序插件 2.2.3 版本开始支持

获取微信小程序插件通话页面打开(onLoad)时页面路径中的参数。

注意:获取参数时,如果微信小程序插件通话页面onLoad还没有触发,可能取到的不是最新的值。建议在 callPageOnShow 事件后调用。

参数

返回值

Object

微信小程序插件页面 onLoad 生命周期的 query 参数

示例代码

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

let query = {}

wmpfVoip.onVoipEvent((event) => {
  if (event.eventName === 'callPageOnShow') {
    query = wmpfVoip.getPluginOnloadOptions()
  }
})

微信小程序VoIP事件监听函数

功能描述

监听 VoIP 通话相关事件。事件绑定需要在通话开始前完成

注意:不要在 onLoad、onShow 等生命周期内绑定事件,可能会因为生命周期多次调用而重复绑定。

参数

function listener

事件监听函数

回调参数

Object event
属性 类型 说明 最低版本
eventName string 事件名称。请参考后文描述。
roomId string 通话房间号。除 bindContactcallPageOnShow 事件外提供 2.4.0
groupId string 与 roomId 相同
data Object 某个事件额外的参数。不同事件的字段不同,请参考后文描述

返回值

function

取消监听函数,调用后取消监听事件。该函数无参数,无返回值。

事件描述

1. startVoip

通话开始。

2. abortVoip

通话异常中断。

data 参数

属性 类型 说明
keepTime number 通话时长
status string 异常说明,取值参见后文
error Object 错误对象
error.errMsg Object 错误信息

status 取值

status 描述
abortByListener 通话因本端异常中断(接听方触发)
abortByCaller 通话因本端异常中断(拨打方触发)
unknown 通话因对端异常中断

常见 errMsg

  • room status is abort:status=unknown,接收到对端通话异常时触发,需要根据 roomId 关联对端触发的 abortVoip 事件判断真正的异常原因。
  • listener waitOtherToJoin timeout:status=abortByListener,接听方加入房间后,拨打方一直未成功加入(可能是网络慢等原因)或异常退出,接听方等待 20s 超时后触发。此时建议分析接听方的情况来排查。
  • call interrupted due to close passive float ball:用户将微信小程序切后台后,会展示微信小程序浮窗,用户通过浮窗关闭微信小程序时触发。
  • in comming call:微信小程序通话被其他来电打断时触发。
  • call interrupted due to native reason:一般是由于通话过程中一段时间未收到数据包(一般是网络原因),被踢出房间中断通话。

3. hangOnVoip

通话被接听(仅接听方触发)。

4. cancelVoip

通话未接通,拨打方取消通话。

data 参数

属性 类型 说明
status string 取消原因说明,取值参见后文

status 取值

status 描述
manual 用户点击界面挂断按钮取消通话。(仅拨打方)
unloadCallPage 插件页面被销毁导致取消通话。(仅拨打方)
forceFromApp 微信小程序调用 forceHangUpVoip 取消通话。(仅拨打方)
other 拨打方取消通话。(仅接听方)

5. rejectVoip

通话未接通,接听方拒接。

data 参数

属性 类型 说明
status string 拒接原因说明,取值参见后文

status 取值

status 描述
manual 用户点击界面挂断按钮拒接通话(仅接听方)
unloadCallPage 插件页面被销毁导致拒接通话(仅接听方)
forceFromApp 微信小程序调用 forceHangUpVoip 拒接通话(仅接听方)
other 接听方拒接(仅拨打方)

6. hangUpVoip

通话已接通,拨打方/接听方挂断通话。

data 参数

属性 类型 说明
keepTime number 通话时长
status string 挂断方说明,取值参见后文
origin string 挂断原因说明,取值参见后文

status 取值

status 描述
endByListener 接听方挂断
endByCaller 拨打方挂断

origin 取值

为了保持向下兼容,hangUpVoip 事件额外使用 origin 字段提供具体的挂断原因信息。

origin 描述
manual 用户点击界面挂断按钮挂断通话(仅挂断方)
unloadCallPage 插件页面被销毁导致挂断通话(仅挂断方)
forceFromApp 微信小程序调用 forceHangUpVoip 导致挂断通话(仅挂断方)
other 对方挂断通话
timeLimit 超过最大通话时长

7. endVoip

通话结束。

data 参数

属性 类型 说明
keepTime number 通话时长
callerName string 拨打方名字
listenerName string 接听方名字
roomType string 房间类型
isCaller boolean 是否是拨打方
businessType number 业务类型

8. busy

通话未接通,接听方占线(仅拨打方触发)。

9. calling

通话过程中, 双方都会每秒触发一次。

data 参数

属性 类型 说明
keepTime number 通话时长

10. timeout

通话超时未接听。

11. joinedRoomByCaller

拨打方加入房间成功(仅拨打方触发)。

12. joinFailCaller

拨打方加入房间失败(仅拨打方触发)。

data 参数

属性 类型 说明
errMsg string 错误消息
message string 由于向下兼容原因,某些情况下 data 是一个 Error 对象

13. joinFailListener

接听方加入房间失败(仅接听方触发)。

data 参数

属性 类型 说明
errMsg string 错误消息
message string 由于向下兼容原因,某些情况下 data 是一个 Error 对象

14. finishVoip

通话完成。返回本次通话结算使用的实际时长。

需从后台获取最终时间后触发,触发时机晚于 endVoip。

data 参数

属性 类型 说明
keepTime number 结算用通话时长

15. callPageOnShow

微信小程序插件通话页面 onShow。

16. showCustomBox

用户点击通话页面自定义按钮,展示自定义组件。

data 参数

属性 类型 说明
callerId string 拨打方 Id
listenerId string 接听方 Id

17. hideCustomBox

用户隐藏自定义组件。

data 参数

属性 类型 说明
callerId string 拨打方 Id
listenerId string 接听方 Id

示例代码

const wmpfVoip = requirePlugin('wmpf-voip').default
const offVoipEvent = wmpfVoip.onVoipEvent(event => {
  console.info(`onVoipEvent`, event)
})

// 需要取消监听时调用
offVoipEvent()

void setCustomBtnText(String btnText)

若需要微信接听方在通话页面中进行其他操作,插件提供了可自定义文案的按钮。仅限微信客户端接听,且通话开始后展示自定义按钮。

按钮点击后将会弹出包含开发者自定义内容的半屏容器,自定义的内容需要以微信小程序自定义组件的形式提供。

参数

String btnText

按钮文案

返回值

设置按钮点击后展示的内容

app.json 中插件配置 genericsImplementation 字段传入自定义组件的路径(call-page-plugincustombox 为固定值)。

{
  "plugins": {
    "wmpf-voip": {
      "version": "latest",
      "provider": "wxf830863afde621eb",
      "genericsImplementation": {
        "call-page-plugin": {
          "custombox": "path/to/customComponents" // 要显示的自定义组件路径
        }
      }
    }
  }
}

示例代码

const wmpfVoip = requirePlugin('wmpf-voip').default
wmpfVoip.setCustomBtnText('去开门')

设置微信小程序界面配置

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

参数

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. 优化:通话稳定性优化。