微信公众号开发总结(Node.js + express + winston)

时间:2022-01-20 22:11:48

关于订阅号、服务号、企业号

官方定位

订阅号:主要偏于为用户传达资讯(类似报纸杂志),认证后每天可以群发一条消息,可达到宣传效果,构建与读者之间更好的沟通和管理模式。
服务号:主要偏于服务交互(类似银行,114,提供服务查询),认证前后都是每个月可群发4条消息。给企业和组织提供更强大的业务服务与用户管理能力。
企业号:主要用于公司内部通讯使用,用来管理内部企业员工、团队。

接口权限区别

下图展示了接口权限的区别,虽然是官方的图,但不是时分准确了,详细请看 微信公众平台官网开发者文档

微信认证

认证费用300元/次,需要年审,即300元/年

详细请查看 官网资料

环境搭建

  1. 安装 node.js,这里选择的是 v4.5.0 LTS,node.js 官网
  2. 安装 express$ npm install express -g
  3. 初始化项目,找到项目所要放置的文件夹,$ express WechatDemo$ cd WechatDemo$ npm install$ npm start,执行完以上命令,一个最基本的基于 express 的 node 项目已经搭建好了,此时访问 localhost:3000 应该能看到 express 初始化的页面。

项目调整为 MVC 结构

项目初始化时,目录是这样的:

项目最终目录结构:

  1. 创建一个 app_server 文件夹,将根目录的 routes、views 移动到 app_server 文件夹下,再创建 controllers、dao、models 文件夹
  2. 此时如果启动项目,会报错,因为 app.js 还要相应修改如下,才能正常启动:

    var routes = require('./app_server/routes/index');
    var users = require('./app_server/routes/users');
    //...
    app.set('views', path.join(__dirname, 'app_server', 'views'));
  3. 由于 routes 中,路由与业务逻辑耦合在一起了,所以将路由文件中的内容移至 controllers 中, 在 controllers 中处理业务逻辑,详细可以查看源码
  4. 增加一个 dao 文件夹,操作数据库的逻辑写在这里。
  5. 增加一个 common 文件夹,用于存放公共的组件。

项目调试

  1. 为了不每次修改都手动重启服务器,这里采用 nodemon + WebStorm 2016.1.3 来调试项目,先安装 nodemon:`$ npm install nodemon -g。
  2. 在 WebStorm 中,点击右上角的下拉箭头,如果没有配置过,应该是灰色的,然后选择 Edit Configurations,选择弹出框左上角的 + 号,新增一个 Node.js 项,然后配置如下方第一个图:
  3. 配置完成之后,点击右上角的 debug 按钮(小虫形状的按钮)即可采用 nodemon 在运行项目了,console 信息会显示在 WebStorm 的控制台中。但是断点调试却不起作用,那么接下来这样配置后就可以断点调试了(第二个图):
  • Node interpreter:node.js 安装目录下的可执行文件 node.exe,一般 WebStorm 会默认配置好
  • Node parameters:nodemon 的安装路径,一般在 C:\Users\yourUserName\AppData\Roaming\npm\node_modules\nodemon\bin\nodemon.js,后面的 --debug=5858 是断点调试起作用的关键,配合 remote debug 的 port 使用
  • Working directory:当前工作目录,WebStorm 一般会默认选中
  • JavaScript file:bin\www 项目的入口文件,这个项目是 express 生成的,入口文件在 bin\www 中
  • 按 + 号新增一个 remote debug,名字自己起一个,port 填成和刚刚 --debug=5858 一样的就可以了

这个时候既可以热更新,又可以断点调试了

微信公众号接入

官网:微信公众平台开发者文档开始开发/接入指南 中有讲到如何接入。

用户与微信公众号交互时,主要有两种形式:

  1. 点击一个按钮,或者发送一段文字,这时,微信 app 会发送请求到微信服务器,微信服务器会转发请求到开发者的服务器。
  2. 点击一个链接,这时,微信 app 不会发送请求到微信服务器,而是直接请求链接所在的服务器。

对于第一种,为了安全起见(比如可能有心怀不轨的人故意给开发者的服务器发送请求,取消某人的关注,这时开发者的程序将该用户的openid移除,此后该用户再也收不到公众号的消息,除非开发者主动刷新用户列表从微信服务器取回来。更甚者可能会对支付等比较敏感的操作进行模拟请求),微信服务器每次发来的请求都带了加密的参数,通过特定的算法可以验证该请求来自微信服务器,算法在开发者文档里写得很清楚了,在接入认证的时候就需要用这种算法响应一次微信服务端的请求。

这里采用微信官方开发的一个 npm 包 wechat 来处理请求,这意味着可以不写那套验证算法。$npm install wecaht --save,关于 wechat 的使用方法,请看官方文档,写得很详细。另外可以查看源码示例

另外,可以申请一个测试号,测试号几乎有所有的接口权限。

本地调试微信公众号

微信公众号接入的时候,是需要一台能够被微信服务器访问到的服务器,如果采用本地开发,localhost 不能被微信服务器访问到,那么就要想办法把本地服务器暴露出去,这里采用花生壳将本地服务器映射到外网(注册时需要付费,我注册时是15元),但不是很稳定,偶尔映射会失败,需要重新启动软件或电脑。因为微信服务器需要接入到开发者服务器的 80 端口或者 443 端口,如果这两个端口都被占用,可用花生壳将本地 3000 的端口映射为外网 80 端口,软件挺人性化的,一个按键即可映射到外网。

关于 access_token

开发者每次请求微信服务器提供的接口(除了获取access_token的接口),都需要在请求里带上 access_token 这个参数,但是这个参数的有效期只有 7200 秒,也就是两个小时,所以需要定期(setTimeout)去请求 access_token,但是如果服务器重启了,setTimeout 也就失效了,官方建议用一*立的服务器专门获取 access_token,但如果不用独立的服务器,可以将 access_token 和 expired_in 保存到数据库。可以查看源码AccessTokenController.js 和 AccessTokenDao.js来了解详细的过程。

关于 log

  1. 在控制台、文件、Mysql 数据库记录 log
  2. 文件 log 每天记录在不同的文件
  3. 每个 request.on("end") 时记录 log
  4. 有需要时可以记录 log
  5. 格式为:2016-08-18 17:55:02 INFO NoticeDao.js [sql:SELECT * FROM gdas_notice]

自定义 Logger API
logger.log 等级默认为 'info',接收一个字符串或者一个对象,对象会被序列化成对应的格式
logger.info 与 logger.log 的作用是一样的
logger.warn level 为 warn
logger.error level 为 error

自定义 log 是在 winston 的基础上写出来的,winston 没有自带 Mysql log,可以自定义,详情请看 winston 官方文档
关于上面 log 的第 2 点,可以查看:winston-daily-rotate-file
自定义 log 也可以查看源代码

微信公众号开发总结(Node.js + express + winston)的更多相关文章

  1. 利用OpenShift托管Node.js Web服务进行微信公众号开发

    最近写了一个微信的翻译机器人.用户只要关注该公众号,发送英文的消息,就能收到中文翻译的回复.有兴趣的读者可以扫描下面的二维码关注该公众号,尝试发送英文单词试试看.(有时候第一次发送单词会收到“该公众号 ...

  2. Nodejs微信公众号开发

    概览 key value 项目名称 node微信公众号开发 项目描述 使用node编写接口,前后端分离获取签名数据 开发者 leinov 发布日期 2018-11-07 仓库 github地址 安装& ...

  3. 你所误解的微信公众号开发、以及微信公众号网页授权、接收url跳转参数等问题

    前言:有一星期没跟新博客了,最近太忙.项目赶进度就没把时间花在博客上:今天来说说所谓的微信公众号开发和填坑记录: 微信公众号:运行在微信终端的应用 (对于开发者来说比较爽的你只需考虑兼容微信浏览器,因 ...

  4. C# 微信公众号开发--准备工作

    前言 最初打算熟悉下微信开发打算用node.js开发,结果底气不足先用C#开发,先踩了踩坑. 准备工作 微信公众平台开发者文档. 这个先多看几遍. 测试公众号,申请开通后会看到微信号,appID,ap ...

  5. NET微信公众号开发-5.0微信支付(待测试)

    开发前准备. 1.0微信支付官方开发者文档 2.0官方demo下载 我们用c#所以选择.net版本 不过这个官方的demo根本跑步起来 3.0官方demo运行起来解决方案 4.0微信支付官方.net版 ...

  6. .NET微信公众号开发-4.0公众号消息处理

    一.前言 微信公众平台的消息处理还是比较完善的,有最基本的文本消息,到图文消息,到图片消息,语音消息,视频消息,音乐消息其基本原理都是一样的,只不过所post的xml数据有所差别,在处理消息之前,我们 ...

  7. .NET微信公众号开发-5.0微信支付

    一.前言 在开始做这个功能之前,我们要做的第一件事情就是思考,如何做这个微信支付,从哪里开始,从哪里入手,官方的sdk说明什么的,有没有什么官方的demo,还有就是老板给我的一些资料齐全不,那些要申请 ...

  8. nodejs 中koa框架下的微信公众号开发初始篇

    最近在搞微信公众号开发,后端采用的是nodejs下的koa框架,初识后端的菜鸟,自己搞难度太大了,网上找了很多文章,采用的中间件大都是express框架下的,不过好在爬了许多坑之后总算看见点曙光了,遂 ...

  9. 微信公众号开发《三》微信JS-SDK之地理位置的获取,集成百度地图实现在线地图搜索

    本次讲解微信开发第三篇:获取用户地址位置信息,是非常常用的功能,特别是服务行业公众号,尤为需要该功能,本次讲解的就是如何调用微信JS-SDK接口,获取用户位置信息,并结合百度地铁,实现在线地图搜索,与 ...

随机推荐

  1. Dotnet文件格式解析

    0x0.序 解析过程并没有介绍对pe结构的相关解析过程,网上此类相关资料很多可自行查阅,本文只介绍了网上资料较少的从pe结构的可选头中的数据目录表中获取dotnet目录的rva和size,到完全解析d ...

  2. 使用VS2012 开发SharePoint 2013 声明式的action(activity) 综合实例

    本文讲述使用VS2012 开发SharePoint 2013 声明式的action 综合实例. 需求同: http://blog.csdn.net/abrahamcheng/article/detai ...

  3. HDU 5700 区间交(线段树)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5700 [题目大意] 给出一个长度为n的数列和m个区间,现在求k个区间,使得他们的区间交内的数列项和 ...

  4. mysql 初识之日志文件篇

    日志文件 1. err日志     error log 记录mysql在运行的过程中所有较为严重的警告和错误信息,以及mysql server每次启动和关闭的详细信息.系统在默认情况下关闭error ...

  5. springMVC源码分析--HandlerMethod

    在之前的博客中我们已经接触过HandlerMethod,接下来我们简单介绍一下HandlerMethod,简单来说HandlerMethod包含的信息包括类.方法和参数的一个信息类,通过其两个构造函数 ...

  6. day14 闭包

    闭包的概念 必须要有函数嵌套,内部函数调用外部函数的变量 简单的例子 此种方法会导致每次使用内部函数inner的时候需要不断的调用外部函数. 结果导致外部函数的变量不断的被调用被释放,比较低效,相当于 ...

  7. SQLite中的运算符表达式

    SQLite中的运算符表达式 在SQLite中,运算符包括了一元运算符,二元运算符(二进制运算符)和三元元素符.图3.12中给出了这些运算符需要的参数以及优先级.其中,一元运算符的优先级最高,三元运算 ...

  8. Mac下驱动BCM20702A0 USB蓝牙

    偶然高了一个USB蓝牙,查到Mac下能识别,无法驱动,就去找了一下.方法很简单,就是把蓝牙的PID和VID加入到驱动里边去,具体方法和步骤如下: 1. 进入到/System/Libary/Extens ...

  9. shell脚本中的几个括号总结(小括号/大括号/花括号)

    from:http://www.cnblogs.com/hanyan225/archive/2011/10/06/2199652.html 是毋庸置疑的,方便了我们也迷惑了我们,比如这些杂七杂八的括号 ...

  10. 在SUSE Linux Enterprise 11 SP1上用UDEV SCSI配置ASM

    1. 编辑/etc/scsi_id.config文件,如果该文件不存在,则创建该文件,添加如下行: options=–whitelisted –replace-whitespace 2. 获取需要绑定 ...