0

0

Node.js+Koa开发之响应事件实例

零下一度

零下一度

发布时间:2017-06-25 09:15:11

|

1746人浏览过

|

来源于php中文网

原创

微信公众号中的事件有订阅事件/扫码事件/点击事件/跳转链接事件等等,具体可以查阅文档。

这里来实现一下订阅事件,其他的事件的实现过程也都类似。

当有人订阅了公众号后,微信服务器会向我们的服务器推送一个事件,这个事件是XML格式的数据包。

一、我们在index路由下实现post事件的响应。

可以理解为当微信向我们的服务器推送消息时,消息就会先走到这里。

/routes/index.js加入:

router.post('/', index_middleware.post(config.wechat));

二、实现index_middleware中的post方法:

就是我们该如何处理微信服务器给我们的服务器的post请求。

大致过程是先把微信服务器发来的数据包接收到,然后解析这个XML数据包,然后根据接收来的数据,在我们服务器上进行逻辑处理后形成一个XML格式的回复消息。

/wechat/index_middleware.js加入:

exports.post = function(opts) {return function *(next) {var token = opts.token;var signature = this.query.signature;var nonce = this.query.nonce;var timestamp = this.query.timestamp;var echostr = this.query.echostr;var str = [token, timestamp, nonce].sort().join('');var sha = sha1(str);if (sha !== signature) {this.body = 'wrong';return false;
        }var data = yield getRawBody(this.req, {
            length: this.length,
            limit: '1mb',
            encoding: this.charset
        });var message = yield util.parseXMLAsync(data);var xml = yield autoReply(message.xml, wechat);
        console.log(message);
        console.log(xml);this.status = 200;this.type = 'application/xml';this.body = xml;
    };
};

这里的data就是我们接收到的数据包,使用了raw-body这个组件。同时使用了util这个工具函数和autoReply这个自定义的函数。

因此在/wechat/index_middleware.js中需要加入以下代码:

Seele AI
Seele AI

3D虚拟游戏生成平台

下载
var getRawBody = require('raw-body');var util = require('./util');var autoReply = require('./autoReply');

三、实现util工具函数中的parseXMLAsync方法,它的作用是异步地将xml格式化为json数据。

/wechat/util.js:

var fs = require('fs');var xml2js = require('xml2js');

exports.parseXMLAsync = function(xml) {return new Promise(function(resolve, reject) {
        xml2js.parseString(xml, {
            trim: true,
            explicitArray: false}, function(err, content) {if (err) {
                reject(err);
            }
            resolve(content);
        });
    });
};

这里用到了xml2js这个组件。

四、实现autoReply函数,它的作用是将微信服务器发来的数据包进行逻辑处理,形成我们需要发送给微信的XML格式数据。

/wechat/autoReply.js:

var createXML = require('./createXML');function autoReply(message, wechat) {if (message.MsgType === 'event') {if (message.Event === 'subscribe') {if (message.EventKey) {
                console.log('扫码进入');
            }var now = new Date().getTime();return Promise.resolve(createXML({
                ToUserName: message.FromUserName,
                FromUserName: message.ToUserName,
                MsgType: 'text',
                Content: 'Hello!!'}));
        }else if (message.Event === 'unsubscribe') {
            console.log('取关');return Promise.resolve('');
        }
    }
}

这里只实现了关注和取关的事件,同时用到了createXML函数,它的作用是将数据封装成xml格式:

/wechat/createXML.js:

function createXML(messageObj) {var { ToUserName, FromUserName, MsgType = 'text'} = messageObj;var CreateTime = new Date().getTime();var header = `
                    
                    
                    ${CreateTime}
                    `;var content = '';switch(MsgType) {case 'text':var { Content } = messageObj;
            content = `
                     `;break;case 'image':var { MediaId }  = messageObj;
            content = `
                         
                       
                     `;break;case 'voice':var { MediaId } = messageObj;
            content = `
                         
                       
                     `;break;case 'video':var { MediaId, Title, Description } = messageObj;
            content = ` 
                     `;break;case 'music':var { Title, Description, MusicUrl, HQMusicUrl, ThumbMediaId } = messageObj;
            content = `
                         <![CDATA[${Title}]]>
                         
                         
                         
                         
                       
                     `;break;case 'news':var { Articles } = messageObj;var ArticleCount = Articles.length;
            content = `${ArticleCount}`;for (var i = 0; i < ArticleCount; i++) {
                content += `
                                <![CDATA[${Articles[i].Title}]]>
                                
                                
                                
                              `;            }
            content += '';break;default:
            content = `
                     `;    }    var xml = header + content;return xml;
}

module.exports = createXML;

完成以上工作以后,启动我们的服务器,再次关注公众号,应该能收到一条Hello!!的信息。

这样就实现了对关注事件的处理。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
AO3官网入口与中文阅读设置 AO3网页版使用与访问
AO3官网入口与中文阅读设置 AO3网页版使用与访问

本专题围绕 Archive of Our Own(AO3)官网入口展开,系统整理 AO3 最新可用官网地址、网页版访问方式、正确打开链接的方法,并详细讲解 AO3 中文界面设置、阅读语言切换及基础使用流程,帮助用户稳定访问 AO3 官网,高效完成中文阅读与作品浏览。

64

2026.02.02

主流快递单号查询入口 实时物流进度一站式追踪专题
主流快递单号查询入口 实时物流进度一站式追踪专题

本专题聚合极兔快递、京东快递、中通快递、圆通快递、韵达快递等主流物流平台的单号查询与运单追踪内容,重点解决单号查询、手机号查物流、官网入口直达、包裹进度实时追踪等高频问题,帮助用户快速获取最新物流状态,提升查件效率与使用体验。

24

2026.02.02

Golang WebAssembly(WASM)开发入门
Golang WebAssembly(WASM)开发入门

本专题系统讲解 Golang 在 WebAssembly(WASM)开发中的实践方法,涵盖 WASM 基础原理、Go 编译到 WASM 的流程、与 JavaScript 的交互方式、性能与体积优化,以及典型应用场景(如前端计算、跨平台模块)。帮助开发者掌握 Go 在新一代 Web 技术栈中的应用能力。

11

2026.02.02

PHP Swoole 高性能服务开发
PHP Swoole 高性能服务开发

本专题聚焦 PHP Swoole 扩展在高性能服务端开发中的应用,系统讲解协程模型、异步IO、TCP/HTTP/WebSocket服务器、进程与任务管理、常驻内存架构设计。通过实战案例,帮助开发者掌握 使用 PHP 构建高并发、低延迟服务端应用的工程化能力。

4

2026.02.02

Java JNI 与本地代码交互实战
Java JNI 与本地代码交互实战

本专题系统讲解 Java 通过 JNI 调用 C/C++ 本地代码的核心机制,涵盖 JNI 基本原理、数据类型映射、内存管理、异常处理、性能优化策略以及典型应用场景(如高性能计算、底层库封装)。通过实战示例,帮助开发者掌握 Java 与本地代码混合开发的完整流程。

5

2026.02.02

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

62

2026.01.31

go语言 math包
go语言 math包

本专题整合了go语言math包相关内容,阅读专题下面的文章了解更多详细内容。

55

2026.01.31

go语言输入函数
go语言输入函数

本专题整合了go语言输入相关教程内容,阅读专题下面的文章了解更多详细内容。

27

2026.01.31

golang 循环遍历
golang 循环遍历

本专题整合了golang循环遍历相关教程,阅读专题下面的文章了解更多详细内容。

33

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Node.js 教程
Node.js 教程

共57课时 | 10.1万人学习

【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 2万人学习

Node.js-前端工程化必学
Node.js-前端工程化必学

共19课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号