项目简介
- 项目名称:暂不方便透露
- 公司规模:整个项目当时前后端大概10人左右,没有测试,对第一版出现之前没有测试。
- 用户量:saas平台单学校人数平均3到4千人,正式环境最多的学校学生和家长人数一共2万多。上下学高峰期每个学生都刷卡考勤,消息推送数量还是挺恐怖的。
- 项目:借助企业微信的平台,在企业微信平台开发应用,让学校用户通过学校的企业微信安装我们开发的应用使用。不同角色在企业微信可以看到不同的应用列表,用户点击应用走企业微信跳转到项目业务平台做业务,企业微信消息推送涉及到教师学生的通知和考勤,考勤通过应用“智能安防”连接到企业微信推送消息。形成教师-学校-家长为一体的家校沟通解决方案,我做那会儿腾讯自己的企业微信后台家校沟通模块还未开发。
- 主要核心应用:个人中心,通知作业,智能安防,班级相册,通讯录等。部分移动端应用截图如下:
智能安防
个人中心
通讯录
- 职责:后端java开发。
- 任务:企业微信接口API开发,包括企业微信应用授权安装,通讯录管理开发,应用主页开发,数据回调开发,指令回调开发,应用菜单接口开发等,梳理业务与企业微信的消息推送逻辑等。
- 主要技术栈:对接企业微信HTTP接口API,后端:springboot+spring+mybatis+mysql,缓存:redis,消息中间件:RaabitMq
- 开发前提:单位申请企业微信为服务商,必须有备案的80端口或者443端口的域名。
项目背景
- 背景:有一天风和日丽的,作为才入职公司不到半年的我优哉游哉的写着接口划着水,突然被领导叫到办公室,我心生怀疑,难道我划水被发现了,难道我试用期过不了,不对呀前些天你才说我是你下面写代码效率最高的,还说19年招的最值得的人就是我(大概是因为我要的工资低)难道都是忽悠我的,正当我胡思乱想之际领导他开口了:他说现在客户往桌子上放了一百万,就看我们有没有本事拿到,现在客户要求我们自己的应用上架到企业微信上,企业微信?我当知道微信公众号,小程序,企业微信是个啥?完全没概念。那我们有自己的应用吗?没有,企业微信有人接触开发过吗?没有?那么你现在的任务就是去研究企业微信API,为期两周,在一个月之后需要出一版基于企业微信的应用。我摸摸我头发还算茂密的脑袋出去研究企业微信,入坑之路开启。
被关小黑屋997
- 服务划分:先大体拆分四个服务:微信用户中心(和企业微信对接and消息推送),代理分发服务(企业微信应用主要跳转代理层主要做用户鉴权和分发用户流量),核心业务服务(主要业务),用户中心服务(已有)。
- 按人员分配分别负责模块,我当时主要负责微信用户中心,领导当年亲自上阵负责的代理分发服务模块。
- 啃企业微信API,对于完全不熟悉的我,所有的官方文档文字我都看得懂,但是就是理不清主要逻辑,没有任何做出来的产品可以参照。完全硬看,实验着写。在试错的路上摇摇欲坠微信API地址。
- 被关办公室,997开始天天研究微信接口,凌晨3,4点的南三环经常见到,说一句题外话,那会儿骑自行车凌晨三点钟回家,走到高架桥下面被野狗追,差点咬坏我一个月没来的及洗的牛仔裤,一度想过在公司睡觉奈何媳妇不允许。
- 从微信应用通用参数配置,到企业微信获取第三方凭证,获取预授权码,设置授权配置,获取企业永久授权码,获取企业授权信息,获取企业凭证,再到获取企业微信个人信息。全部由我一人开发完成,最后的微信服务号,微信小程序都集成到微信服务中心了这是后话。后面业务模块也有参与开发,纯业务的逻辑在此不赘述。
- 30天的成果勉强完成了四个应用,能安装到学校的企业微信上使用,至今已经对接了不下50个应用了,涉及到到支付校园缴费,考勤,微官网,智阅卷,在线作业等等。
- 其他影响,那个月绩效A,入职半年涨了1000元,还是我入职要的工资低狗头保命,最后整个项目,对外对内都由我负责。
- 微信服务中心代码截图。以此证明我真的写过。
- 主要业务流程图,能力中心就是最初版本的微信服务中心。
- 在微信企业微信的用户部分截图。
总结思考
- 第一坑:微信服务中心的应用入口,就是客户点击应用的入口模块,和客户接受消息的模块放在一个服务中,导致有一次消息量大导致服务不可用,影响到所有的企业微信应用都不可用,意思是消息模块影响到用户体验服务,最后拆分成应用菜单模块服务和消息模块服务。
- 第二坑:因为企业微信调用token的接口对同一个ip同一段时间是有次数限制的,企业微信的token我开始是本地缓存的redis的2个小时过期,过期之后再去企业微信通过接口请求,请求成功后再缓存到本地redis。看上去没啥问题,但是如果当过期的那一秒打过来很多请求这些请求都会去调用企业微信获取token的接口,导致接口超限获取不到token,这个解决方案我的笨办法是起了一个服务单独1个小时59分钟去企业微信获取一次token,再把token更新到redis,保证redis里面同一个企业微信的的token永不过期。
- 第三坑:有次上线本地测试数据不多,线上有个一万多人的学校一下拉取全校通讯录的数据导致时间太久(老用户中心改不了导致)。解决办法:上线临时加redis缓存,牺牲一定的一致性只保证数据最终一致性,每次从redis取数据。通过定时任务或者新增和修改接口修改redis缓存的学校用户数据。教训:测试环境最好和正式环境一模一样,这之后我们通常会在预发布再测试一遍。
- 第四坑:也是我唯一熬通宵的坑,有次测试发现企业微信OAuth2.0的重定向的code一直报已经被使用,怎么找都找不到原因,最后发现测试的手机dns被劫持了。教训当找不到问题的时候,再确认代码没问题时,跳出程序员思维找找其他方面的问题,还要不管正式和测试有条件http的请求最好搞成https请求不容易被劫持。
结果发了小小的项目奖金
一年之后的一个风和日丽的下午,我被领导叫去,为了奖励我们被关小黑屋,发了小小的项目奖金。
项目至今未解之谜
当时真的有客户出一百万等着要企业微信这个项目吗?
备注
本文正在参与「掘金 2021 春招闯关活动」, 点击查看活动详情