那些年用node接入微信走过的坑之(三)---微信事件监听

简介

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

什么是微信事件

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

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

监听事件

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

//设置
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 里。
看关键代码:

/**
 * 根据口令
 *
 * 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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值