这是我第一次做微信公众号后台开发,期间花费了不少时间来学习,也踩了不少坑,本文及其系列文章对开发过程进行了梳理、归纳,对准备工作、编写代码、上线部署和运维的整个过程进行了总结,希望对要做公众号开发的朋友有所帮助。

“微信公众号后台开发”系列文章:

目录:

程序运行环境

开发环境

  • Mac
  • macOS Sierra 10.12.6
  • MySQL 5.7.19
  • Python 3.6.2

线上环境

  • 阿里云 ECS 服务器
  • Ubuntu 16.04.2 LTS
  • MySQL 5.7.19
  • Python 3.6.2

开发目标

完成一个公众号后台程序,具备以下功能:

  • 具备日记本的基本功能;
  • 数据库持久化数据;
  • 暂时不考虑开发前端页面;
  • 基于上一条,所以采用文字的交互方式;

准备工作

技术方案

  • 阿里云 ECS:用户群大、成熟、价格合理
  • MySQL 存储数据:稳定、可靠、熟悉
  • Python:熟悉、适合快速开发

用到的轮子

本后台程序开发过程中主要依赖了下面几个开源库:

  • SQLAlchemy 数据库 ORM(Object Relational Mapper)工具包,用于访问 MySQL;
  • whtsky/WeRoBot 微信公众号开发框架,封装了和微信服务器的交互;
  • pytransitions/transitions 有限状态机(Finite-state machine, FSM),用于和用户交互,简化交互流程;
  • getlogbook/logbook 用于记录 log,功能强大,使用简单,支持发送异常邮件;

工具

主要用到下面的工具:

编码

总体来说编码阶段是遇到问题最少的,主要完成了下面的工作:

  • 通过网上调研,最后决定基于 WeRoBot 开发,省去了和微信服务器的具体交互细节,节省大量时间;
  • 为了处理和用户的交互,需要有一定的上下文逻辑,最终决定采用有限状态机(FSM)处理交互逻辑;
  • 使用 SQLAlchemy 作为数据库访问层,支持 ORM,简化数据库交互代码;
  • 基于 logbook 定制自己的 log 系统,完成日志的记录,并将 Error 级别的 log 以邮件的方式发送到我的邮箱;
  • 定义配置文件,支持配置多种环境的配置,通过启动命令指定运行环境;
  • 完成业务代码;
  • 调试;
    • 微信公众号的调试只能线上调试;
    • 通过 ngrok 将本地的服务暴露给微信服务器;
    • ngrok 使用非常简单,除过偶尔出现超时之外,完全可以满足调试需要;

部署

搭建环境

在阿里云 ECS 服务器完成下面工作:

  • 安装、配置 MySQL;
  • 安装 Python 及其版本管理工具;
  • 配置项目运行的 Python 环境,安装需要的库;
  • 安装、配置 Nginx,方向代理,响应用户请求;
  • 安装、配置 Supervisor,管理公众号后台、Nginx 等进程;

对外提供服务

  • 修改阿里云 ECS 机器安全组配置,对外暴漏提供服务的端口号;
  • 在没有域名 或者 域名未备案的情况下,可直接通过 Ip:Port 方式对外提供服务;
  • 由于微信公众号后台要求 2017年 年底之前必须全部切换为 HTTPS 方式,所以需要支持 HTTPS;

支持 HTTPS

准备参考耗子叔的文章 如何免费的让网站启用HTTPS 部署 HTTPS,目前正在处理中;

要完成 HTTPS 需要准备下面两个工作:

  • 申请域名,可以直接在阿里云申请,也可以通过其他渠道申请,比如 GoDaddy;
  • 给域名配置路由规则,路由到服务器;
  • 完成域名备案,否则也是无法访问阿里云服务器的;
    • 工信部规定域名指向中国大陆境内服务器访问网站时必须备案
    • 所以只有访问国内服务器需要,如果你的服务部署在美国亚马逊云上,那么是不需要的;
    • 备案也可通过阿里云完成,具体参考:网站访问与备案

运维

  • 借助于 Supervisor 监控、管理进程;
  • 后台程序有详细的日志,通过 Supervisor 重定向输出,便于查找问题;
  • 公众号后台出现异常时会邮件通知我,及时发现问题;
  • 定期做数据库备份;

References