微信号:imooc-com

介绍:慕课网是一个超酷的互联网、IT技术免费学习平台,创新的网络一站式学习、实践体验;服务及时贴心,内容专业、有趣易学。专注服务互联网工程师快速成为技术高手!

微信公众号与小程序后台的 10 个上车姿势

2018-08-16 08:35 Scott


我想大家也会有自己的判断,微信开发是一个很好的职业切入点,关键是它的门槛一点都不高,不需要费太大力气就能基本掌握,加上多一门技能就多一个职场可能性,特别是对于刚出校门的同学,工作经验欠缺,那么微信开发就是一个很好的实战场景。




公众号和小程序开发看过去是前端的部分,最重要的还有后端的部分,本文重点讨论下后端部分,要开发对应的后台服务,有哪些必备功课和注意事项,小程序后台和公众号后台,Token 管理等,这些本质是一个套路,会开发公众号后台,那么小程序后台就易如反掌,我们以公众号为例来展开,小程序的后台就不需要涉及了,能力和架构都是复用的。



01

如何选择公众号


关于微信号的知识,首先要知道微信号的分类,这个非常重要,弄清楚以后才能动手选择自己适合的。


一共就三种,企业号,订阅号,和服务号,企业号不太适合与我们这种个人和普通的企业开发,这个课程更适合于开发订阅号和服务号,不过触类旁通,对开发企业号也有帮助的。


订阅号:比较适合与个人,小团队,主要是用于信息传播,帮助管理用户以及和用户互动,比如撰写文章,资讯的传播,消息定制等等。


服务号:是给企业和组织提供更强大的业务服务与用户管理能力,帮助企业快速实现全新的公众号服务平台,比如网页上的支付权限,消息模板、客服功能以及智能接口等等。


企业号:是为企业或组织提供移动应用入口,帮助企业建立与员工、上下游供应链及企业应用间的连接,比如早期的物流公司内部,员工上下班打卡,每日业务进度就可以通过企业号管理。




注册公众号还有一点需要注意的,就是权限列表,并不是永远不变的,微信的生态在不断发展,这里的不同类型公众号的差异性也会时不时发生变化,大家在具体开发和维护的时候,要定期的对这些接口权限保持关注,当官方升级的时候,我们也能及时跟进。


还有一个小技巧,如果你一开始是订阅号也不要担心,订阅号在后台可以一键转服务号的,只不过这个过程是不可逆的,转了服务号,就可以绑定到商户账号里面,调用支付这样的高阶功能了。



02

域名和服务器


除了找第三方微信平台做公众号接入,比如有赞微店这些微信电商生态体系,自己公司开发公众号,就必须要有自己的服务,来运行后端服务,要有自己的已经备案的域名,来配置到微信后台,做请求转发和业务备案。


关键词就是域名要备案过,服务器最好是在国内,其他倒没太多需要注意的,无非是环境搭建、防火墙、安全端口、日志监控、请求转发、协议支持等这一系列运维相关的工作,关于这个和最后的第十点部署相关的知识,大家想要深度了解,可以来看这篇文章


具体的作用呢,用户发消息给公众号,消息被微信官方服务器接收,可以理解为别人的服务器,它接收后,转发给我们的服务器,但怎么转发给我们的服务器呢,是通过域名找到的,这个域名就是外网可以访问到的备案过的,在微信公众号后台配置过的域名。


那么怎么配置呢,请看第三点。



03

本地代理工具


之所以提本地代理工具,是因为通过第二点,我们知道域名和服务器是必须的,但通常我们在开发的时候,服务器还没有部署我们的代码,而且域名可能也可能没有指向到我们的服务器,重点是我们再服务器上开发和调试也确实是不方便的,我们经常在本地开发,开发差不多了,再推到服务器发布,那么在本地就需要一个端口代理工具,可以把我们家里公司里的某个端口,比如 3001 的 Node 服务,代理到某一个域名上面,这个域名往往是一个临时的代理域名,配置到微信后台,微信就能把消息及时推送到我们本地,具体流程可以参考下图,代理的工具和手段有很多, Ngrok 是我自己常用的一个。



无论代理不代理,微信后台都是需要配置的,通常我们会把本地代理的临时域名,或者线上正式域名,配置到公众号后台,就像下图,当然也有一些 Token 配置加密等,配置后,微信服务器就知道找谁来处理用户的消息了。



配置后,就需要再我们的服务里面,来实现开发者身份验证,这个往往是开发代码做的第一件事情,让微信识别出我们的代码能运作,来认可我们的开发者身份,从而公众号后台才能配置成功,往往这里的 1、2 步是一口气做掉的。


04

数据存储介质


这里的存储,可以理解为如下三类:


  • 图片、视频,音频这些微信相关的素材存储

  • 提供给用户的服务中用到的非微信的素材

  • 整个业务中所沉淀下来的数据,比如回复内容、商品字,字段等


对于微信相关的素材,如果没有特别需求,就通过微信的 API 存储到微信的服务器就行,对于第二个服务中用到的非微信素材,比如某些电影海报图,可以存储到图床上,比如 七牛、阿里 OSS、腾讯云图床等等,对于业务数据,则可以存储到我们自己的数据库,这个数据库可自建也可以购买存储商的,比如 ali RDS,MongoDB 等等,比如说说 MongoDB,MongoDB 数据库,是一个非关系型数据库,它的数据都是以对象形式存储,表之间也没有关系,跟关系型数据库是不同的,在使用方面,支持的数据类型很丰富,比如日期,数组,嵌套对党等等,学习成本更低,对于多变的业务场景也比较适合。



来看下这个对比图,左边的这个是 Mongodb,右边的是 Mysql,两者数据库,都是 database,数据库里都是又表组成的,那么在 Mysql 里面,这个叫做表,在 mongodb 里面,这个表可以理解为是 collection 也就是集合。


有了存储介质,我们就可以把微信公众号后台所需要的一些资源持久化下来,但后两种情况并不一定 100% 需要,比如你就是一个简单回复的公众号,那么用微信的素材 API 就足够了。



05

Node 框架选择


放在几年前,Node 可用的成熟框架,几乎只有 Express 一个,到今天为止,已经很成熟了,比如 Koa、Thinkjs、Eggjs、Hapi 等等,甚至可以基于 Koa 自研,在 Scott 看来,一个公众号后台,如果不是特别复杂的系统,建议从 Koa 入手,尤其是它的中间件洋葱模型,路由的使用,这些框架比较核心的部分掌握好了,再换其他框架就很容易了。





框架帮我们解决掉的问题,主要有两个一个是合理的代码架构方式,比如如何继承模块,如何处理流转的 HTTP 流,如何分拆路由到不同的业务控制类,统统这些我们都不需要从头来起,第二个是帮我们规划了项目的架构层级,MVC 的合理抽象,让我们的代码写的更健壮更规范。

当然框架还可以帮你做更多事情,比如 Egg 可以帮你规划好了多进程的运行模型,都不需要借助 PM2 来做进程守护,Egg 已经做的很精细了。




06

微信消息交互


消息交互这个,一图胜千言,本质就是转发,转发给我们的服务器做各种处理,再一步步回流给微信服务器做推送。




看完这个图,我们对微信公众号的流程已经比较清楚了,其实一共分四个关键节点,分别是,首先用户在它的手机上访问微信公众号,其次访问时候产生的事件被微信服务器接受并转发,再次这些微信进一步包装后的事件数据,转发给了我们的服务器中,并被我们的微信中间件处理,最后再处理的时候,会调用到我们 Node.js 搭建的后台 API 服务,或者其他的 API 服务,这些服务返回数据给中间件,中间件返回给微信服务器,微信服务器再推送给用户,是不是很简单呢?再具象一下,就是四个蛋模型,分别是发生在用户手机上的事情,被微信服务器拿到,交给我们的服务器,以及 API 对应的服务器,一路调过去又一路跑回来,这是时间顺序上,也是物理地点上参于的四个主要节点。



07

微信接口能力


微信的接口能力,其实是微信生态开放的力量,你借助于它的生态力量,可以给用户提供更多更丰富的交互体验和服务,下面罗列了项目中的一些接口,没有全部罗列,可以看到有语义分析、素材管理、用户标签管理、二维码、菜单等等,让公众号变得极为强大。


但这里面有一个很关键的点,就是 Token 的刷新和管理,Token 是微信这个火车的进场票,没有这个票,在它里面开发寸步难行,想要开发微信必须破了 Token 的这个坎儿。



08

网站前后台集成


对于项目的请求处理流程,我们脑海中其实很容易描绘出这样的画面,一个 HTTP 请求进来,服务器接受,服务器处理,服务器返回。


现实的确是这样的,只是在每个环节都有一些特定要素的参与而已,并没有让整个过程变复杂,本质上就是不同的技术库,技术方案的组合。


那么对于我们的项目来说,可以简单把所有服务器需要处理的外部事务,都看做是 HTTP 请求,无论它来自微信还是来自浏览器,这些请求都会访问我们的特定域名,被解析到我们特定的服务器,可以使用 nginx 来做转发,同时做一些静态资源的代理和 HTTPS 证书的集成,他会把请求再原封不动的转发给我们通过 Node.js 开发,使用 koa2 框架所实例化的服务,在这个服务器启动的时候,就已经连接好了数据库,初始化完毕了项目所需要的数据模型,同时集成了一些特定的中间件,比如 维持用户登录态的 session,解析提交表单的 bodyparser,以及渲染页面的模板引擎 pug,当然还有最核心的路由模块,路由是整个项目的枢纽,无论什么请求进来,微信的,还是 PC 的,Get 还是 Post,都会被路由中间件,依据我们配置的方法动词和路径做对应的匹配,把它们再进一步交给微信中间件,和后台的电影、分类、用户的业务控制层,同时我们还拆出来一个 API 层,来服务于中间件和控制层,API 之前总结过,它还包含其他的 API,在我们课程里面,可以简单的认为,通过 API 来跟我们的数据库进行增删改查的互动。



那么通过微信流程的总结,和项目中请求流程的总结,大家应该有一个更加具体的认知了,至于到了代码层面,无非就是编程熟练度的问题,反而不是最难的,流程掌握了,我们就可以去有效的组合技术框架,编程工具,一定能做出优秀的作品。




09

微信用户体系


微信体系里的用户,在公众号里面,在小程序里面,同一个人是有不同的 openid,但是却有同一个 unionid,但是 unionid 需要先把应用绑定到微信开放平台才能拿到这个 ID,这是在微信体系里面的用户特征:


  • 公众号里面,推送过来的 message XML 包,经过解析后,包含 FromUserName,就是公众号中用户的 openID,而经过 getUserInfo 后的数据中,就包含了除了 openID 外的 unionID


  • 微信网站 App 里面,经过用户 OAuth 2.0 授权后,拿到的 openID 公众号中用户的 openID 以及 unionID


  • 小程序里面,通过 code 再对用户的 userInfo 进行解析后,拿到的 openID 以及 unionID


以上的三个 openID 是不同的 openID,但是 unionID 却是同一个,那么对于一个集成了非微信,比如电商前后台的项目来说,不仅要处理微信体系的用户,还要处理网站的用户,那么就需要对网站的用户做兼容,让这个用户在微信体系里面,可以使用微信用户登录访问和操作,在网站里面,可以用传统的账号密码形式来操作,或者扫码登录等等。


但有时会存在过渡期,什么意思呢?只有公众号的时候,获取用户资料保存信息,都是通过 openID 一网打尽,而随着业务的覆盖面,openID 切换到了 unionID,但是一开始可能是没有 unionID 权限的,或者不确定将来会不会切换到 unionID,那么可以在初次数据建模的时候,把 openID 保存一下,存成一个数组,等到将来有了 unionID 后,再逐步来筛选替换即可。



10

代码部署上线


一切都做完了,就该上线了,还是两图胜千言:



通过 PM2 把本地,把之前推送到 Git 仓库的代码,拉到服务器上,做一些前置的预安装处理初始化,项目编译后,直接把服务开起来,开起来的服务,可以接受来自这台服务器上 Nginx 转发过来的请求,无论是普通的网页访问,还是微信公众号的消息推送,图上面是相对网站的部署流程和环境,实际上我们在学习过程中,可以简化处理,跳过安全相关的流程,只关心部署流程。



11

总结


对于微信开发的展望,API 层可以不断去维护优化,以及微信的工具方法和类方法,其实是可以封装成 npm 模块,来作为项目依赖,这样项目就更加的纯粹,想要支持将来的小程序,作为小程序的后台,也是很容易去扩展,在服务器部署方面,建议大家真实的走一遍流程,这样你对于前后端的角色分工也会更为了解。


了解上述更多知识技能,可关注课程
《Koa2 实现微信公众号前后端开发》




同时,推荐一门《纯正商业级应用-微信小程序开发实战》,这是“七月”老师又一力作,全方位解读小程序最新特性。






 
慕课网 更多文章 我是怎么把一个项目带崩的 “职业程序员”不必那么“职业” 如影随形的设计模式与现实世界 作为50 岁的开发者,面对被裁的命运,我如何绝地求生? @程序员,面试必懂的套路,看完整个人通透多了
猜您喜欢 浅谈企业级产品设计 Nxlog——日志采集神器简介 程序员如何缓解压力 SparkR:数据科学家的新利器 当无人汽车遇上横穿马路的动物