微信小程序

指引

# 设备认证

在使用小程序音视频通话(for 硬件)能力时,需要提前对发起或接听通话的设备在微信进行注册,以便于微信验证设备的真实可信。

# 1. 设备要求

微信需要使用 EMMC/UFS 存储上的 RPMB(Replay Protected Memory Block) 分区来保证设备的身份。设备厂商需要保证:

  • 设备的 RPMB 分区未被使用过。
  • 设备厂商需要内置一个 RPMB 分区读写及通信的 RPMBD 服务(由微信提供,参考第 2 节),并保证服务能够开机正常启动。

# 2. 部署 RPMBD 服务(安卓设备)

小程序音视频通话(for 硬件)需要使用 EMMC/UFS 存储上的 RPMB 分区来保证设备的身份,需要设备厂商内置一个 RPMB 分区读写及通信的服务,并保证服务能够开机正常启动。

对于 Linux 设备,小程序音视频通话 SDK (for Linux) 已内置了 rpmbd 服务,不需要单独部署,可跳过这个步骤。

# 2.1 下载服务

请在 此处 下载对应平台、版本的 rpmbd 二进制文件(名称为 rmpbd)

  • rpmbd/arm32:是通用的 rpmbd,可适用于诸如 RK、MTK、全志等 kernel 可以访问 rpmb 的平台。
  • rpmbd/arm64:上述平台的 64 位版本。
  • rpmbd/arm64_tee:用于 tee 里访问 rpmb 的平台。

注意:arm64_tee 需要设备商按照规范开发 TEE 对应的 TA 模块,详细规范与流程参考设备认证 TEE 规范。

# 2.2 运行服务

将 rpmbd 二进制集成至系统里并以服务的方式运行起来。

注意

  • RPMBD 服务不仅用于注册设备过程,后续使用小程序音视频通话(for 硬件)能力时,都需要保证 RPMBD 服务一直运行
  • 每一颗 EMMC/UFS 存储芯片的 RPMB KEY 只能被写一次,不能修改。 如果被写入错误的值 (非注册时的 model_id 和 sn),那么这颗芯片就无法用于 VOIP 通话服务。
  • 高版本的 android 安全性较强,可能还需要配置 SELinux,且只支持在 system 分区启动。可参考 SELinux 参考配置

运行方式为:

rpmbd /dev/mmcblk1rpmb # /dev/mmcblk1rpmb 为rpmb分区路径, 开发者需要根据自己设备的情况具体填写(高通平台不需要指定)

参考如下 rc 的启动方式:

  • /system/etc/init,放到 system 分区启动(建议)

    service rpmbd /system/bin/rpmbd /dev/mmcblk1rpmb
      class main
      user root
      group root system
    
  • /vendor/etc/init,放到 vendor 分区启动(仅 Android < 8 支持)

    service rpmbd /vendor/bin/rpmbd
      class main
      user root
      group root system
    

# 3. 注册设备

  • 安卓设备在完成 RPMBD 服务部署后,需要使用微信提供的设备认证 SDK(安卓)完成设备的注册。
  • Linux 设备请使用「小程序音视频通话 SDK」5.2 注册设备 接口进行设备注册。

# 4. 常见问题

(1) 注册设备报错 emmc write fail00

检查 rpmbd 服务启动参数里的 rpmb 分区路径是否正确。 若路径正确,确认此路径对应的 rpmb 分区在 Android OS 下能否被访问。


(2) 报错 cert fail

Android 认为 APK 有变动导致 keystone 中数字证书失效,需要清理 apk 数据缓存再使用相同的 appid、model_id、SN 调用 registerVoipDevice 刷新密钥。


(3) 接口报错 ticket 1 invalid rpmb_buffer

当前 rpmbd 与 SDK aar 的版本不兼容。需保持二者使用相同版本。例如:rpmbd 服务使用了 1.3 以下版本,而 SDK 使用了 1.3 或以上的版本。


(4) 注册设备返回 -7,或调用接口报错 failed to get native service 或其他获取 rpmbd 服务失败的错误

  • 确认已部署 rpmbd 服务,且服务正常运行。(可以通过 ps 查看)
  • Android >= 8 版本,请确认 rpmbd 是在 system 分区启动
  • 如果启用了 SELinux,需确认 SELinux 的相关规则已正确配置

(5) 注册设备报错 register: null

高版本 android 不允许在主线程里进行网络请求,需要单独开线程里来调用 SDK 接口


(6) 使用物联网卡时,网络请求一直失败

物联网卡请使用 1.3.1 及以上版本 SDK,并确保 servicewechat.com 域名能够正常访问。


(7) 注册设备报错 9800004,device xxx is not confirmed

绝大多数情况是因为注册设备时使用了 1.3 以下版本的 SDK,且同时发起了多次 registerVoipDevice 请求,此时有概率设备端使用的密钥与后台不同步,导致设备再也无法成功注册,且该过程不可逆。

建议开发者升级到 SDK 1.3 及以上版本,使用低版本时请务必保证前一次 registerVoipDevice 返回前不要重复调用。


(8) 获取票据 getCallerTicket 报错 9800004

一般是因为传入的 mode_id 与最初注册设备时不一致。


(9) 报错 ticket 0 digital-sig check fail

多数是因为当前设备已经在这台设备的另一个 App 中注册过,目前设备验证只能用于单个应用。需要再使用相同的 appid、model_id、SN 重新调用 registerVoipDevice 刷新密钥。


(10) 注册设备报错 40234 hmac check fail

可能有以下原因

  • 设备已经使用其它的 model_id/sn 注册过,此次注册传入了不同的 model_id;
  • 设备曾经注册过,且注册设备时使用了 1.3 以下版本的 SDK,且同时发起了多次 registerVoipDevice 请求,此时有概率设备端使用的密钥与后台不同步,导致设备再也无法成功注册,且该过程不可逆。