微信公众号开发总结(Node.js + express + winston)
关于订阅号、服务号、企业号
官方定位
订阅号:主要偏于为用户传达资讯(类似报纸杂志),认证后每天可以群发一条消息,可达到宣传效果,构建与读者之间更好的沟通和管理模式。
服务号:主要偏于服务交互(类似银行,114,提供服务查询),认证前后都是每个月可群发4条消息。给企业和组织提供更强大的业务服务与用户管理能力。
企业号:主要用于公司内部通讯使用,用来管理内部企业员工、团队。
接口权限区别
下图展示了接口权限的区别,虽然是官方的图,但不是时分准确了,详细请看 微信公众平台官网、开发者文档
微信认证
认证费用300元/次,需要年审,即300元/年
详细请查看 官网资料
环境搭建
- 安装
node.js
,这里选择的是 v4.5.0 LTS,node.js 官网 - 安装
express
,$ npm install express -g
- 初始化项目,找到项目所要放置的文件夹,
$ express WechatDemo
,$ cd WechatDemo
,$ npm install
,$ npm start
,执行完以上命令,一个最基本的基于 express 的 node 项目已经搭建好了,此时访问localhost:3000
应该能看到 express 初始化的页面。
项目调整为 MVC 结构
项目初始化时,目录是这样的:
项目最终目录结构:
- 创建一个 app_server 文件夹,将根目录的 routes、views 移动到 app_server 文件夹下,再创建 controllers、dao、models 文件夹
此时如果启动项目,会报错,因为 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'));
- 由于 routes 中,路由与业务逻辑耦合在一起了,所以将路由文件中的内容移至 controllers 中, 在 controllers 中处理业务逻辑,详细可以查看源码。
- 增加一个 dao 文件夹,操作数据库的逻辑写在这里。
增加一个 common 文件夹,用于存放公共的组件。
项目调试
- 为了不每次修改都手动重启服务器,这里采用 nodemon + WebStorm 2016.1.3 来调试项目,先安装 nodemon:`$ npm install nodemon -g。
- 在 WebStorm 中,点击右上角的下拉箭头,如果没有配置过,应该是灰色的,然后选择 Edit Configurations,选择弹出框左上角的 + 号,新增一个 Node.js 项,然后配置如下方第一个图:
- 配置完成之后,点击右上角的 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 一样的就可以了
这个时候既可以热更新,又可以断点调试了
微信公众号接入
官网:微信公众平台、开发者文档,开始开发/接入指南 中有讲到如何接入。
用户与微信公众号交互时,主要有两种形式:
- 点击一个按钮,或者发送一段文字,这时,微信 app 会发送请求到微信服务器,微信服务器会转发请求到开发者的服务器。
- 点击一个链接,这时,微信 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
- 在控制台、文件、Mysql 数据库记录 log
- 文件 log 每天记录在不同的文件
- 每个 request.on("end") 时记录 log
- 有需要时可以记录 log
- 格式为: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)的更多相关文章
- 利用OpenShift托管Node.js Web服务进行微信公众号开发
最近写了一个微信的翻译机器人.用户只要关注该公众号,发送英文的消息,就能收到中文翻译的回复.有兴趣的读者可以扫描下面的二维码关注该公众号,尝试发送英文单词试试看.(有时候第一次发送单词会收到“该公众号 ...
- Nodejs微信公众号开发
概览 key value 项目名称 node微信公众号开发 项目描述 使用node编写接口,前后端分离获取签名数据 开发者 leinov 发布日期 2018-11-07 仓库 github地址 安装& ...
- 你所误解的微信公众号开发、以及微信公众号网页授权、接收url跳转参数等问题
前言:有一星期没跟新博客了,最近太忙.项目赶进度就没把时间花在博客上:今天来说说所谓的微信公众号开发和填坑记录: 微信公众号:运行在微信终端的应用 (对于开发者来说比较爽的你只需考虑兼容微信浏览器,因 ...
- C# 微信公众号开发--准备工作
前言 最初打算熟悉下微信开发打算用node.js开发,结果底气不足先用C#开发,先踩了踩坑. 准备工作 微信公众平台开发者文档. 这个先多看几遍. 测试公众号,申请开通后会看到微信号,appID,ap ...
- NET微信公众号开发-5.0微信支付(待测试)
开发前准备. 1.0微信支付官方开发者文档 2.0官方demo下载 我们用c#所以选择.net版本 不过这个官方的demo根本跑步起来 3.0官方demo运行起来解决方案 4.0微信支付官方.net版 ...
- .NET微信公众号开发-4.0公众号消息处理
一.前言 微信公众平台的消息处理还是比较完善的,有最基本的文本消息,到图文消息,到图片消息,语音消息,视频消息,音乐消息其基本原理都是一样的,只不过所post的xml数据有所差别,在处理消息之前,我们 ...
- .NET微信公众号开发-5.0微信支付
一.前言 在开始做这个功能之前,我们要做的第一件事情就是思考,如何做这个微信支付,从哪里开始,从哪里入手,官方的sdk说明什么的,有没有什么官方的demo,还有就是老板给我的一些资料齐全不,那些要申请 ...
- nodejs 中koa框架下的微信公众号开发初始篇
最近在搞微信公众号开发,后端采用的是nodejs下的koa框架,初识后端的菜鸟,自己搞难度太大了,网上找了很多文章,采用的中间件大都是express框架下的,不过好在爬了许多坑之后总算看见点曙光了,遂 ...
- 微信公众号开发《三》微信JS-SDK之地理位置的获取,集成百度地图实现在线地图搜索
本次讲解微信开发第三篇:获取用户地址位置信息,是非常常用的功能,特别是服务行业公众号,尤为需要该功能,本次讲解的就是如何调用微信JS-SDK接口,获取用户位置信息,并结合百度地铁,实现在线地图搜索,与 ...
随机推荐
- Java NIO 与 IO
我应该何时使用 IO,何时使用 NIO 呢?在本文中,我会尽量清晰地解析 Java NIO 和 IO 的差异.它们的使用场景,以及它们如何影响您的代码设计. Java NIO 和 IO 的主要区别 下 ...
- TcpView 查看端口的小工具(推荐)
介绍: TCPView是一个Windows程序,将显示你的详细清单的所有TCP和UDP端点在您的系统,包括拥有进程名称,远程地址和状态的TCP连接. 打开下面的链接就可以下载了. https://te ...
- innodb引擎redo文件维护
如果要对innodb的redo日志文件的大小与个数进行调整可以采用如下步骤: 1.关闭mysql mysqladmin -h127. -P3306 -uroot -p shutdown 2.修改配置文 ...
- iOS中UITextField 使用全面解析 分类: ios技术 2015-04-10 14:37 153人阅读 评论(0) 收藏
//初始化textfield并设置位置及大小 UITextField *text = [[UITextField alloc]initWithFrame:CGRectMake(20, 20, 13 ...
- BZOJ1237: [SCOI2008]配对
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1237 题目大意:你有n 个整数Ai和n 个整数Bi.你需要把它们配对,即每个Ai恰好对应一 ...
- 英文版Ubuntu安装配置搜狗拼音输入法
下载搜狗输入法 1 进入搜狗输入法官网,进入上面导航兰的 "输入法Linux版" 2 根据你安装的ubuntu是32位还是64位下载 END ubuntu安装搜狗输入法 1 进 ...
- 有限状态机(Finite-state machine)
var menu = { // 当前状态 currentState: 'hide', // 绑定事件 initialize: function() { var self = this; self.on ...
- Antx简介(ali_PPT)
Antx的由来: §最早,我们用Makefile来build系统 •Makefile不适合Java的编译 §后来,我们用Ant来build系统 •开始时很不错 •随着项目增多,出现困难 §利用bean ...
- 2.13. 获取托管对象(Core Data 应用程序实践指南)
用NSFetchRequest获取NSArray,里面都是托管对象.如果上下文里没有数据,就会从持久化存储区里获取. NSFetchRequest *request = [NSFetchRequest ...
- .NET DLL 保护措施详解(非混淆加密加壳)核心思路的实现
最近有很多朋友通过BLOG找到我询问我的相关细节,其实相关的实现细节我早已把源码上传到51aspx上面了,地址是http://www.51aspx.com/code/codename/56949 也有 ...