业务前置说明
微信 VoIP 通话涉及小程序、业务服务端、探鸽云平台、设备端四方交互。在开通小程序 VoIP 权限后,需先明确各平台能力边界,再分别完成业务服务端、小程序端、设备端的对接开发
整体业务流程
完整通话生命周期流程统一如下:
- 小程序完成设备来电呼入权限申请、用户授权绑定;
- 任意一端(小程序/设备)发起通话呼叫;
- 被叫未接听、处于振铃阶段时,主叫可中止本次呼叫;
- 被叫收到来电后,支持接听或拒接处理;
- 双方接听成功后,进入同一RTC通话房间,建立双向音视频对讲链路;
- 通话过程中任意一端可挂断,终止本次通话会话、释放媒体与房间资源。
各平台能力与开发分工
微信平台能力
- 提供官方 VoIP 通话插件,支撑小程序快速集成设备对讲、来电振铃、通话页面能力;
- 提供设备VoIP授权、呼叫回调、前台通话状态管理等基础能力。
探鸽云平台能力
- 提供标准 RTC 音视频传输通道,支撑双向实时流收发;
- 提供 RTC 命令信令通道,透传接通、挂断等控制指令;
- 提供设备侧标准接口:来电拒接、进房通话、关键帧请求、媒体订阅等能力;
- 统一维护
cmdw=0x2000(接通)、cmdw=0x2001(挂断)信令机制。
业务服务端(自行开发)
所有业务层呼叫状态透传、设备联动、业务逻辑均由自研服务端实现,具体能力如下:
- 对外提供接口,接收微信平台呼叫相关回调通知;
- 维护与设备端的长连接通道,作为业务信令中转链路;
- 向下透传小程序侧业务指令:发起呼叫、中止呼叫;
- 接收设备侧拒接、状态回调,同步推送至小程序端;
- 管理呼叫生命周期:振铃、待接听、通话中、已挂断、已中止。
开发指引:集成业务服务端
设备端(自行开发)
- 集成探鸽云 RTC SDK,完成 SDK 初始化、启动、连接管理;
- 实现音视频采集、编码与 RTC 流发送/接收能力;
- 主动发起呼叫、调用 TiRtcWhipConnect 加入对讲房间;
- 来电状态处理:未接通时拒接呼叫、振铃阶段中止呼叫;
- 通话态处理:接听建立媒体链路、主动挂断终止通话、释放资源;
- 监听 on_command 信令,同步接通、挂断、异常结束状态。
开发指引:集成设备端
小程序端(自行开发)
- 集成微信官方 VoIP 通话插件,实现来电振铃、通话页面、音视频通话基础能力;
- 完成小程序登录,获取用户 openid,引导用户完成设备来电权限授权,并将用户 - 设备授权关系上报至业务服务端绑定存储;
- 发起呼叫时调用业务服务端接口发起通话请求;被叫尚未接听、处于振铃阶段可再次调用服务端接口,下发中止呼叫指令,终止本次呼叫流程。
开发指引:集成微信小程序
场景一:小程序主动呼叫设备
呼叫发起阶段
- 小程序发起呼叫
- 基于微信小程序官方 VoIP 插件能力发起通话,接口规范参考:微信官方文档。
- 小程序主动中止呼叫(被叫未接听前)
- 小程序调用自研业务服务端中止呼叫接口,由业务服务端下发中止呼叫指令至设备端,该信令转发逻辑需要业务方自主开发实现。
- 设备端拒接来电
- 设备收到呼叫请求后如需拒接,通过探鸽云 SDK 调用服务请求接口:
TiRtcServiceRequest("/v1/wxvoip/reject", ...)向小程序推送拒接通知。 - 入参
hangup_reason字段值参考 微信VoIP通话命令 取值遵循微信 VoIP 通话信令规范:忙线 = 5、用户主动拒接 = 7; - 注意:本接口用于来电未接通前拒接场景,不可与通话中挂断信令(
cmdw=0x2001)混用。
- 设备收到呼叫请求后如需拒接,通过探鸽云 SDK 调用服务请求接口:
通话中通用规则(双向呼叫共用)
媒体流传输约定
通话接通后,基于现有 RTC 连接按照《实时收发音视频》文档传输音视频数据。
- 音频流:stream_id = 0
- 视频流:stream_id = 1
接通判定与实现逻辑
设备调用 TiRtcWhipConnect 加入 RTC 房间成功后,会收到信令 cmdw=0x2000,代表双方对讲建立成功。振铃阶段即为待接听状态。
- 设备作为被叫(小程序主叫) 设备收到
call_incoming后调用TiRtcWhipConnect加入 RTC 房间,连接成功后收到cmdw=0x2000,双方对讲建立成功。 - 设备作为主叫(呼叫小程序) 设备收到服务端下发的
call_incoming后调用TiRtcWhipConnect加入 RTC 房间,连接成功后收到cmdw=0x2000双方对讲建立成功;此时房间已由微信侧建立,直接进入对讲状态。
挂断流程规范
- 设备端主动挂断 设备端通过
命令通道TiRtcSendCommand下发挂断信令:(cmdw=0x2001)通知小程序结束通话。 - 小程序端主动挂断 设备监听(
on_command)回调,接收小程序下发的挂断信令(cmdw=0x2001)执行通话释放、房间退出逻辑。
场景二:设备主动呼叫小程序
接通流程
- 设备调用业务服务端
POST /v1/voip/device/call,服务端内部调微信iot/voip/call发起呼叫; - 小程序振铃,用户接听后微信服务器回调
join_voip_room; - 业务服务端处理回调后通过下行通道推送
call_incoming至设备; - 设备收到后调用
TiRtcWhipConnect加入 RTC 房间,连接成功后收到cmdw=0x2000进入对讲状态;此时房间已由微信侧建立,直接开始音视频对讲; - 设备监听
on_command指令回调,用于接收对端挂断信令(cmdw=0x2001);用户未接听前,小程序持续来电振铃。
中止呼叫(设备主动取消呼叫)
设备需调用自研逻辑向业务服务端上报呼叫中止请求,由服务端推送取消来电通知给小程序,小程序停止振铃,本次呼叫结束。
补充通用约束说明
- 接通前:仅支持「中止呼叫、来电拒接」;接通后仅支持双向挂断,两类场景接口、信令不可混用;
- 所有跨端信令转发(呼叫、中止呼叫)依赖业务服务端透传,探鸽云仅提供设备侧 SDK 信令上报与下发能力;
- 两种呼叫场景共用同一套音视频流规则、接通 / 挂断信令,仅呼叫发起、来电拒接阶段业务流程存在差异;
- 主叫方可在
payload中传入自定义字段(如wxa_from标识主叫方、call_id标识唯一呼叫),微信与探鸽云全程透传、不做解析。设备端据此区分来电是小程序发起还是设备回铃。
参考实现
tirtc-server-example 是基于本文档及探鸽云 SDK 开发的开源参考项目,完整演示了微信 VoIP 通话的四方交互实现,可作为自研开发的起点:
| 模块 | 说明 |
|---|---|
voip-server | 业务服务端(Go):对接微信回调、调用探鸽云 Token 接口、MQTT 设备下行通道 |
device-sim-c / device-sim-py | 设备端模拟器(C / Python):WHIP 建连、信令收发、G.711a 音频推流 |
weixin-mini-program | 微信小程序:VoIP 插件集成、设备授权绑定、通话页面 |
user-server / device-server | 用户与设备管理服务(Go):登录、绑定、MQTT 凭证签发 |
设备与业务服务端之间通过 MQTT 长连接通信,ClientID 为 sn_{device_id},主要 Topic:
| Topic | QoS | 说明 |
|---|---|---|
device/sn_{device_id}/cmd | 1 | 指令通道:call_incoming(来电通知,设备需回复 ACK) |
device/sn_{device_id}/notify | 1 | 通知通道:call_cancel(取消呼叫)、callers_update(授权变更) |
项目完整覆盖了本文档描述的两种呼叫场景(小程序主叫 / 设备主叫)、来电拒接、通话中挂断、音频收发等流程,可直接运行和调试。