最近在写微信公众号应用,现在写是有点太晚了。不过何时开始应该都不晚吧。有了一些心得,写出来分享给大家,有任何意见或者建议请告诉我。

微信公众号应用模式

微信官方分为“网站应用”和“公众账号”,从技术上来说,其实就是

  • “网站应用”底层实现为OAuth2接口。任何一个已经成型的H5网站,都可以通过调用一次API获取到微信登录用户的OpenID,实现接入。在微信里面打开的网页天然就已经登录微信了,所以可以如丝般顺滑登录。你要具体开发的就是自有业务系统和微信OpenID的绑定功能代码。
  • “公众账号”底层实现为,你的应用提供一个页面handler,接收微信不定期POST过来的XML,解析并返回,结果会以会话形式在公众号内显示。你也可以不定期访问微信提供的各种API,比如发送推送模板等。

开发微信公众号应用有个好处是,由于手机屏幕都很小,限制多,所以你无须考虑排版和URL路由问题,一般都是只读的操作,点击进去看了就走,不需要到处导航来导航去。界面直接套用WeUI或者Bootstrap就可以,不需要懂太多美工的知识。

那怎么样做一个靠谱的微信公众号呢?

绑定身份应当支持绑定多个业务账户

功能相关。在学校内,一个人有多种身份很正常,比如一个本科硕士都在同一所学校就读并且留校工作的人,可能他就有3张“校园卡”、3个账户,很多信息系统暂不支持以同一个账户名和密码登录后切换身份,只是简单的你要以什么身份做什么事你用户自己重新登录切换。由于我们只有一个微信号,所以应当支持同一个微信号绑定多个不同业务账户,并可以切换。

这里说的业务身份不是指你一个老师账户登录业务进去以后有多个角色的概念,这个角色概念就比如你登录科研系统,你可能是一个普通科研工作着,同时也是一个科研秘书,或者是经费管理员,系统管理员,这个身份切换一般业务系统是有做的。

绑定应当是强关系绑定

我遇到过这个事情,有些停车场为了缴费方便,你可以绑定任意人的车牌号,他还会给你发送车进入某个停车场的提示,提示你缴费,很方便快捷。

在高校内,这种情况一般发生在比如你要给同学一卡通充值,或者电费缴费,如果你无法验证一卡通或者宿舍属于这个同学,你应当不要显示该账户的余额信息。

应当展示绑定历史记录

安全相关。一旦微信跟业务账户绑定后,业务账户如果变更密码可能不会重置绑定。所以你应当可以让用户可以看到,我的微信绑定了哪些业务账户,我目前绑定的业务账户也曾经被哪些微信绑定过。可以删除别人的绑定。甚至可以锁定是否可以被微信绑定和被哪个微信绑定。

举个例子,某个学生把账户和密码给了她男朋友,让他帮忙还书,抢课,占座,后来分手了,她可能改密码也无法解除微信的绑定,你应当提供能力让她可以删除她前男友的绑定,分手就应当如同 Groovetech 空气刀一样,不沾粘。

绑定机制引入防止暴力破解

安全相关。不允许一个业务账户被超过多少个微信账户绑定,不允许一个微信账户历史上绑定多少个业务账户。

引入授权机制

如果你的业务系统要去调用第三方的数据,对于敏感的数据最好可以引入授权机制。OAuth2是授权最好的实现方式,然而一般高校内的业务系统不会提供OAuth2接口,而且提供也意义不大,因为统一身份认证由信息中心控制,都是一个密码,除非业务系统还有自己的二次登录密码。所以敏感业务如果系统可以变更的话可以在系统内使用多因素认证确认是否允许数据被微信公众号业务系统调用,比如工资查询数据。。。

数据是否留存微信

安全相关。对于敏感数据需要考虑发送给微信服务器还是只发送链接点击后再显示。比如工资查询,点击后直接在会话形式展示很方便,然而也会导致微信可以收集到你的工资信息,包括也会在会话历史留下工资明细。防窃听防篡改我觉得你可以直接只支持>TLS 1.2,你不用担心兼容性问题,微信自带的QQ浏览器X5内核支持的。

handler必须启用消息加解密

安全相关。你的handler“消息加解密方式”必须配置为“安全模式(推荐)”,否则你无法判断是否微信给你发的信息。虽然伪造OpenID是非常困难的事情。但是你必须考虑OpenID被脱库后的影响,目前好像没有重置所有用户OpenID的方法。

系统账户体系应当以业务系统账户建立

这里我就杯具了,因为是新开发的网站,你可以以各种形式建立网站用户,前期我考虑了半天,为了程序好写以微信OpenID为UserName建立表,其他所有相关均以UserID关联,这就导致一个问题,如果一个业务账户被多个微信号绑定,我将无法提供业务系统自己的认证登录机制,因为我不知道要以哪个微信号登录系统。

这里还会导致一个问题是,以OpenID生成User应当在通过业务系统认证后生成,否则会导致产生很多垃圾账户。比如你来围观我写的微信公众号,虽然你没有统一身份认证账户,但是你乱点,我的用户表还是会建立一个你的账户。

应当让用户先看到功能菜单再登录

用户体验相关。你首先必须展示自己的功能,再让用户选择是否绑定账户来使用,要有这个自信。

应当让用户知道第三方数据的来源地址

如果你的微信集成了很多第三方的系统数据,应当在页面最下面提示信息来源哪个系统,由于信息滞后等问题导致信息可能不准确等提示。

推送消息注意时间点和频率

用户体验相关。推送消息应当关注工作日和节假日,上班后推送还是下班前推送,应当让用户可以设置是否打开推送。被关闭的推送应当在业务系统内可展示。应当让用户可以主动调试预览推送。

应当建立起Mock机制

开发相关。为了自己调试方便,应当建立多种Mock机制,否则依赖微信调试太麻烦了。