背景

虚拟拨号一般是指通过一个第三方的号码实现 用户 A 和 A 用户 B 之间的通讯,使双方不必知道对方的号码就可以建立通讯。起到了保护双方用户隐私和企业机密数据保障的作用。

常见使用场景是网约车打车和外卖,此时保护的是乘客和用户的隐私。

另一个场景是房地产销售等企业客户数据的保护,一些机密的号码不能直接交给销售,以防止客户流失。

还有一个比较小众的场景是类似小号的产品,用户使用小号来拨打其他号码、接收短信,但是这种用法并非本文需要讨论的场景。

虚拟拨号的原理

系统上下文图

主被叫双方通过虚拟服务商关联到一个虚拟号码上,主叫向承担中转角色的虚拟号码拨号可以与用户 a 进行通话。

此时双方只能看到中转用的虚拟号码,而看不到对方的真实手机号。

在小程序端实现虚拟拨号流程

虚拟拨号的流程

以小程序端为例,介绍虚拟拨号的通用流程是如何实现的。

  1. 用户 A,主叫,用户 B 被叫。呼叫中心居中对接。
  2. 用户 A 获取当前用户的手机号,确定用户使用哪个号码拨打虚拟号码
  3. 用户 A 获取虚拟号码。将当前用户将会拨号的手机号发送给拨号中心,返回分配的虚拟号码,以及虚拟号码拨向目标号码
  4. 用户 A 小程序端调用 wx.makePhoneCall 接口,入参是虚拟号码,也就是向虚拟号码拨号
  5. 用户 A 拨号到呼叫中心后,呼叫中心开始呼叫用户 B。两边联通后,通话开始
sequenceDiagram
    participant A as 用户A (主叫)
    participant MP as 小程序
    participant CC as 呼叫中心
    participant B as 用户B (被叫)

    Note over A, B: 小程序虚拟拨号流程

    A->>MP: 1. 发起拨号请求
    MP->>MP: 2. 获取当前用户手机号
    Note right of MP: 确定用户使用哪个号码拨打虚拟号码

    MP->>CC: 3. 发送用户手机号,请求虚拟号码
    CC->>MP: 返回分配的虚拟号码
    Note right of CC: 虚拟号码映射到目标号码

    MP->>MP: 4. 调用wx.makePhoneCall接口
    Note right of MP: 入参为虚拟号码

    A->>CC: 5. 拨打虚拟号码
    Note over CC: 用户A呼叫到达呼叫中心

    CC->>B: 6. 呼叫用户B
    B->>CC: 7. 用户B接听
    CC->>A: 8. 建立通话连接

    Note over A, B: 通话开始,双方通过呼叫中心通信

关键点

这里最核心的是实现 A B 两个账号关系的绑定。

同时一个虚拟号码可以绑定多个账号关系,通常可以支撑多组号码的同时通讯。

上面两点都依赖于虚拟拨号服务商向电信运营商申请号段资源,属于合法拿到的虚拟号码资源