背景
虚拟拨号一般是指通过一个第三方的号码实现 用户 A 和 A 用户 B 之间的通讯,使双方不必知道对方的号码就可以建立通讯。起到了保护双方用户隐私和企业机密数据保障的作用。
常见使用场景是网约车打车和外卖,此时保护的是乘客和用户的隐私。
另一个场景是房地产销售等企业客户数据的保护,一些机密的号码不能直接交给销售,以防止客户流失。
还有一个比较小众的场景是类似小号的产品,用户使用小号来拨打其他号码、接收短信,但是这种用法并非本文需要讨论的场景。
虚拟拨号的原理
系统上下文图
主被叫双方通过虚拟服务商关联到一个虚拟号码上,主叫向承担中转角色的虚拟号码拨号可以与用户 a 进行通话。
此时双方只能看到中转用的虚拟号码,而看不到对方的真实手机号。

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

虚拟拨号的流程
以小程序端为例,介绍虚拟拨号的通用流程是如何实现的。
- 用户 A,主叫,用户 B 被叫。呼叫中心居中对接。
- 用户 A 获取当前用户的手机号,确定用户使用哪个号码拨打虚拟号码
- 用户 A 获取虚拟号码。将当前用户将会拨号的手机号发送给拨号中心,返回分配的虚拟号码,以及虚拟号码拨向目标号码
- 用户 A 小程序端调用
wx.makePhoneCall
接口,入参是虚拟号码,也就是向虚拟号码拨号 - 用户 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 两个账号关系的绑定。
同时一个虚拟号码可以绑定多个账号关系,通常可以支撑多组号码的同时通讯。
上面两点都依赖于虚拟拨号服务商向电信运营商申请号段资源,属于合法拿到的虚拟号码资源