我是靠谱客的博主 热情纸飞机,这篇文章主要介绍那些年用node接入微信走过的坑之(三)---微信事件监听简介,现在分享给大家,希望可以做个参考。

简介

上一篇将了如何利用wechat-api设置自定义菜单,这一篇说下事件监听的问题。

什么是微信事件

在开发文档中,消息管理–》接收消息-接收事件推送,事件消息分为如下几种:
1 关注/取消关注事件
2 扫描带参数二维码事件
3 上报地理位置事件
4 自定义菜单事件
5 点击菜单拉取消息时的事件推送
6 点击菜单跳转链接时的事件推送
7.当然用户发送一条消息给公众号,公众号也可以收到事件(这个文档上没有,难道这个不是事件么(⊙﹏⊙)b)。

复制代码
1
2
当我们设置服务器url后,这些事件都将通过post请求转发到这个url上,记得是---post请求

监听事件

这里用到了node-wechat,再次膜拜大神们。
先看实现的监听关注事件的代码,这里实现了当用户关注后再服务器保存用户openId的例子。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
//设置 var config = { token: '这里是你在服务器设置时候的token', appid: constant.WX_OPEN_APPID, encodingAESKey: '这个也是设置的时候自动生成的' }; /* 比如关注事件 { ToUserName: 'gh_409828134b4a', FromUserName: 'oZca1v6aUyyJyytYCUVcmQ8sPgUU', CreateTime: '1467947631', MsgType: 'event', Event: 'subscribe', EventKey: '' }*/ //公众号消息和事件接收,这里是post exports.getWxRequest = wechat(config, function (req, res, next) { var message = req.weixin; if (message.MsgType === 'event') { //关注事件,需要将用户openId保存到用户 if (message.Event === 'subscribe') { _wxSubscribeEvent(message, res); } //用户点击自定义菜单事件 if (message.Event === 'CLICK') { //_wxMenuEvent(message,res); } } }) //关注 function _wxSubscribeEvent(message, res) { var openId = message.FromUserName; //获取Unionid,我们平台保存的是unionid,你可以使用openId wxOpenApi.getUser(openId, function (error, data, result) { if (!error) { var unionid = data.unionid; //这里做你想做的事情喽 }; }

原理:
先看下wechat的封装吧,在wechat-》lib-》wechat.js 里。
看关键代码:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/** * 根据口令 * * Examples: * 使用wechat作为自动回复中间件的三种方式 * ``` * wechat(token, function (req, res, next) {}); * * wechat(token, wechat.text(function (message, req, res, next) { * // TODO * }).location(function (message, req, res, next) { * // TODO * })); * * wechat(token) * .text(function (message, req, res, next) { * // TODO * }).location(function (message, req, res, next) { * // TODO * }).middlewarify(); * ``` * 加密模式下token为config * * ``` * var config = { * token: 'token', * appid: 'appid', * encodingAESKey: 'encodinAESKey' * }; * wechat(config, function (req, res, next) {}); * ``` * * 静态方法 * * - `text`,处理文字推送的回调函数,接受参数为(text, req, res, next)。 * - `image`,处理图片推送的回调函数,接受参数为(image, req, res, next)。 * - `voice`,处理声音推送的回调函数,接受参数为(voice, req, res, next)。 * - `video`,处理视频推送的回调函数,接受参数为(video, req, res, next)。 * - `location`,处理位置推送的回调函数,接受参数为(location, req, res, next)。 * - `link`,处理链接推送的回调函数,接受参数为(link, req, res, next)。 * - `event`,处理事件推送的回调函数,接受参数为(event, req, res, next)。 * - `shortvideo`,处理短视频推送的回调函数,接受参数为(event, req, res, next)。 * @param {String} token 在微信平台填写的口令 * @param {Function} handle 生成的回调函数,参见示例 */ var middleware = function (token, handle) { if (arguments.length === 1) { return new Handler(token); } if (handle instanceof Handler) { handle.setToken(token); return handle.middlewarify(); } else { return new Handler(token, handle).middlewarify(); } }; ['text', 'image', 'voice', 'video', 'shortvideo', 'location', 'link', 'event'].forEach(function (method) { middleware[method] = function (fn) { return (new Handler())[method](fn); }; });

使用方法写的还是非常简单的,写的也比较清晰,这里封装成了中间件,曾静自己去写过,最大的问题,莫过于微信用的是 XML格式的数据,需哟啊用到xml2js,var xml2js = require(‘xml2js’);可以看到wechat的开发者使用的也是这个,曾经的代码就不放出来了,有兴趣的童鞋可以去看源码,大神们写的太好了。


结语

用别人写好的东西固然爽,但是还是要研究透如何写出来的,才能从根本上提高自己的水平,这里一起共勉。

ITDogFire–sky

最后

以上就是热情纸飞机最近收集整理的关于那些年用node接入微信走过的坑之(三)---微信事件监听简介的全部内容,更多相关那些年用node接入微信走过内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(77)

评论列表共有 0 条评论

立即
投稿
返回
顶部