前言
最近,在公司停车场看到很多车玻璃上都贴着挪车码,微信扫码之后会打开微信小程序或者网页,进而拨打电话呼叫车主挪车。相对于传统纸质版挪车牌,挪车码有以下几大优势:
- 美观,不占用过多空间。挪车码一般都是直接贴到车窗,和年检、保险标志一样,美观且撕下不留痕迹;
- 隐私保护车主手机号。部分挪车码具备隐私保护机制,也就是说车主和呼叫方之间通话采用的是虚拟号码,并不会暴露车主手机号。这个机制可以防止4s店销售、保险销售等通过真实手机号骚扰车主的可能;
- 成本极低。传统挪车牌一般都是几元、十几元甚至几十元,而挪车码成本不到1元,所以对车主和商家来讲成本都大幅降低;
- 运营空间极大。如果你的小程序或者公众号拥有大量的车主信息,那么流量带来的收益是非常可观的。
经典案例分析
下面分析一个扫码挪车经典案例,它是采用的微信小程序模式,之所以经典,完全是因为它是我自己写的😂。

上图是一张二维码,这是一个空码,空码的意思是它没被人绑定过,扫码之后界面如下:

绑定完成之后界面如下:

这时候车主注册过程已经完成了,下面就是呼叫车主的界面:

呼叫方扫码之后,会显示车主车牌号,点击电话通知,可以直接拨打电话:

可以看到,呼叫方和车主都不是171开头的号码,但是双方手机上显示的是171开头的号码,这就是隐私通话,而且10分钟之后双方再拨打这个号码就不通了,当然失效时间开发者可以根据自己的需要修改。这样彻底实现保护号码隐私。
华为云隐私保护通话
开发之前,首先需要了解下隐私保护通话机制。该机制通俗的来讲就是A和B通话,双方都不暴露真实号码,双方屏显号码为C。笔者结合市面上常见的几大云市场,权衡利弊,最后锁定使用华为云隐私保护通话。

进入华为云官网,在产品---企业应用---云通信,找到隐私保护通话,点击后查看产品介绍。

可以看到,该产品有5种模式,AXB模式、AX模式、X模式等。读者可以自己查看了解,我在这里就不一一介绍了。下面分析下我们扫码挪车的场景。
扫码挪车场景
呼叫方扫码挪车会有两种场景,一种是呼叫方本身就是我们的车主,也就是说呼叫方之前在我们这里注册过,我们知道他的手机号,这样A和B我们都知道手机号,所以在这种场景下我们采用AXB模式;另一种场景是呼叫方不是我们的车主,也就是说他并没有在我们这里注册过,我们不知道他的真实号码,在这种场景下我们采取X模式。
有读者会问,这样我们在呼叫之前还需要去判断是不是我们的用户,岂不是麻烦?其实当你真正的了解这两种模式之后你就不会有这种疑问了,AXB模式一个X号码可以绑定1000组关系,在挪车场景中X模式一个X号码在一定时间内只能是“冻结”状态。号码是有月租的,一个月5块钱,当你的用户量大的时候成本还是很高的,所以需要区分。这一问题后续也会讲到。
虚拟号码申请
既然是隐私通话,不暴露真实号码,那么中间肯定是需要虚拟号码的,虚拟号码需要申请开通,如果是前期测试阶段,建议申请一个AXB模式号码,2个X模式号码。账号注册、创建隐私保护通话应用、号码申请等流程在这里就不赘述了,按步骤来就可以。
开发
微信小程序开发我这里不再赘述,读者如有问题可以随时联系我,在这里主要讲的是对接华为云的开发细节,按上面讲的两个场景区分。
场景一:呼叫方是我们的用户
呼叫方既然是我们的用户,那么我们自然知道他的手机号,果断采取AXB模式。首先看一下AXB模式接口文档:
AXB模式绑定接口



可以看到,文档上写的很清晰,其实就是一个post请求,很简单,只需要注意以下几点:
- 请求Headers参数要严格按照文档上的来,否则请求失败;
- callerNum和calleeNum要求是全局号码格式,以”+86开头“;
- relationNum和areaCode是二选一关系,但建议使用areaCode,华为云接口会自动分配可用的虚拟号码。否则开发者还需要自己筛选空闲的relationNum;
- recordHintTone和lastMinVoice参数如果非空的话,需要提前上传放音文件。
示例:
/**
* AXB模式号码绑定
* @param callerNum 主叫
* @param calleeNum 被叫
* @param relationNum 虚拟号码X
* @return
*/
public static Map<String,Object> bindAXB(String callerNum,String calleeNum,String relationNum){
Map<String,Object> resultMap = new HashMap<String, Object>();
if (StringUtils.isEmpty(callerNum) || StringUtils.isEmpty(calleeNum)) {
resultMap.put("status", false);
resultMap.put("errorCode", "40001");
resultMap.put("msg", "参数错误");
return resultMap;
}
&nb


4070

被折叠的 条评论
为什么被折叠?



