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

微信小程序摄像头插件

本插件主要用于提供「微信小程序摄像头」的部分基础能力和统一的界面。

插件接入可参考:微信小程序示例代码

设备侧 SDK 的接入与微信小程序 Voip 的纯云接入完全一致,请参考相关文档。

1. 微信小程序引入插件

关于微信小程序插件详细说明请参考微信小程序使用插件文档

在「微信小程序管理后台」添加插件后,使用者还需要要在微信小程序的 app.json 中声明本插件。可以在主包引入,也可以在分包引入。

// 主包引入
{
  "plugins": {
    "wmpf-voip": {
      "version": "latest", // latest 表示自动使用最新版本。也可使用具体版本,如 2.3.8
      "provider": "wxf830863afde621eb"
    }
  }
}
// 分包引入
{
  "subpackages": [
    {
      "root": "xxxx",
      "pages": [],
      "plugins": {
        "wmpf-voip": {
          "version": "latest", // latest 表示自动使用最新版本。也可使用具体版本,如 2.3.8
          "provider": "wxf830863afde621eb"
        }
      }
    }
  ]
}

完成声明后,可以在微信小程序中来确认是否引入成功

const wmpfVoip = requirePlugin('wmpf-voip').default
console.log(wmpfVoip) // 有结果即表示引入插件成功

2. 引入摄像头组件

插件引入成功后,需引入摄像头组件。

页面或者组件的 json 文件中声明:

"usingComponents": {
    "camera-device": "plugin-private://wxf830863afde621eb/publicComponents/camera-device/camera-device"
  },

wxml 中使用组件:传入sn、model-id,device-name

// page.wxml
<camera-device sn="{{sn}}" device-name="{{deviceName}}" model-id="{{modelId}}" class="camera-deivce" bind:changeQuality="changeQuality"></camera-device>

wxss 中自定义 camera-deivce.

// page.wxss
.camera-deivce {
  width: 100vw;
  height: 300px;
}

预期:

3. 组件属性

属性 类型 默认值 必填 说明
sn String 设备
model-id String MP申请的model-id
device-name String 设备名称
video-quality-list String[] [‘360P’, ‘480P’, ‘720P’, ‘1080P’, ‘4K’] 个数不超过 5 个。当用户切换清晰度时,会显示在面板上,切换后会触发组件事件’changeQuality’

事件:切换清晰度 changeQuality

类型 说明
index Number 用户选择的清晰度在传入的video-quality-list数组中的index。

示例:

<camera-device 
    sn="{{sn}}" 
    device-name="{{deviceName}}" 
    model-id="{{modelId}}" 
    class="camera-deivce" 
    bind:changeQuality="changeQuality"
>
</camera-device>
Page({
    changeQuality(res) {
        console.log(res)
    }
})

4. 更新日志

请参考《微信小程序音视频通话插件更新日志》

开发安卓设备端应用

在安卓设备端,开发者需要运行一个安卓应用(文档中也称为微信小程序 Launcher),用来进行设备注册、运行微信小程序进行 VOIP 通话等操作。

1. 接入 WMPF 并运行微信小程序

在安卓平台上,微信小程序视频通话能力是在微信小程序中实现的。需要由设备端运行的安卓应用拉起开发者开发的微信小程序来发起和接听音视频通话。

在完成开发前准备「3.1 接入微信硬件平台」,并进行设备注册后,可以获得 WMPF 运行所需的 productIdkeyVersiondeviceIdsignature 等硬件信息。

请参考WMPF 文档中的说明,完成下列操作:

  • 部署 WMPF Service APK;
  • 参考 WMPF 提供的示例代码在应用中集成 WMPF Client;
  • 调用 activateDevice 完成设备激活;

2. 设备注册

在发起通话前,需要先完成设备注册。请参考设备认证文档完成 RPMBD 服务的部署、SDK 接入和设备注册的步骤。

完成设备注册后,可以在发起通话前通过 SDK 的 getDeviceToken 接口获取设备票据,传递到微信小程序内做为调用 VOIP 插件发起通话的 voipToken 使用。

注意:

  • 此处使用的 SN,必须经过 WMPF 的 addDevice 接口作为 deviceId 注册,并与 WMPF 设备激活 使用的 deviceId 一致。 否则后续无法正常发起通话。
  • 使用设备认证 SDK 时需要保证 rpmbd 服务已经成功运行。

3. 运行微信小程序

完成 WMPF 安装和设备激活后,便可以调用 launchMiniProgram 启动指定的微信小程序。

3.1 安卓应用与微信小程序通信

微信小程序启动后,应用可以通过下列方式和微信小程序内进行通信

  • 简单的「安卓应用 -> 微信小程序」单向单次传递参数的场景,可以直接在启动微信小程序的 path 中拼接 query。
  • 如果安卓应用要接收微信小程序发来的事件、需要双向通信或者数据量大时可以通过 WMPF 提供的通信通道(Invoke Channel)

3.2 运行开发版/体验版微信小程序

在使用开发版/体验版微信小程序进行调试时,请参照下列步骤。

注意:必须扫码登录后才能正常下载开发版/体验版。开发版/体验版更新后,建议重启 WMPF 以更新到最新。

  1. 开发者在开发者工具点击「预览」,将开发版微信小程序代码包上传到后台。也可提交成体验版;
  2. 在 WMPF 上调用 login 弹出扫码登录界面,由在开发者工具上登录的同个微信号扫码登录;
  3. WMPF launchMiniProgram 时指定 appType 为开发版或体验版;
  4. 开发版有有效期,过期后需要重新进行上述步骤

微信小程序音视频通话 SDK (Linux 设备)

此 SDK 运行于搭载 Linux 系统的硬件设备上,为设备提供向手机微信内的微信小程序拨打 VoIP 通话的能力。

使用此 SDK 之前,请先参考《微信小程序音视频通话(for 硬件)》完成前置的接入和微信小程序开发流程。

1. 设备要求

1.1 硬件要求

  • CPU:未定最低要求,推荐双核 500MHz CPU 或更高规格。
  • 内存:推荐 64M+ RAM。SDK 本身至少需要 13M 内存。
  • 磁盘
    • 空间:32M+ ROM (SDK 代码文件本身有 6.5M, 此外还需要预留文件读写空间)。
    • 规格:推荐 EMMC/UFS;若设备包含 RPMB,则必须确保 RPMB 分区未被使用。
  • 麦克风
    • 采样率:需要支持 16000,不支持的需要厂商自行重采样。
    • 编码格式:必须支持 PCM;可选支持 OPUS/G711/G729(软编软解)。
  • 扬声器:
    • 采样率:需要支持 16000,不支持的需要厂商自行重采样。
    • 编码格式:必须支持 PCM;可选支持 OPUS/G711/G729(软编软解)。
  • 摄像头(可选)
    • 分辨率:至少 240×320。
    • 编码格式
      • H264:必须支持, 如果设备确不支持 H264, 你可以选择语音通话。
      • H265:可选支持, 仅微信 8.0.36 及以上版本支持。
      • 暂不考虑支持其它视频编码格式。