NodeJS 监控微信公众号关注事件推送
1.首先要在微信公众号后台填写服务器信息。
具体可看微信的文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319
2.在服务器上配置具体代码反馈微信的验证
如第三步的
this.ctx.body = params.echostr;
3.和关注、取消关注相关的业务逻辑代码
这里我使用了 xml2js 将 xml 转成对象和 js-sha1 来生成 sha1 加密字符串
const XMLJS = require("xml2js");
const sha1 = require("js-sha1");
// 解析URL里的参数
const params = Url.parse(this.ctx.req.url, true).query;
// 微信传来的加密字符串
const signature = params.signature;
// 根据传来的其他值计算加密字符串
const timestamp = params.timestamp;
const nonce = params.nonce;
const token = "weixin"; // 这是在公众平台上自己设置的
const array = [token, timestamp, nonce];
array.sort();
const scyptoString = sha1(array.join(""));
// 比对两个加密字符串是否相等,相等则为微信官方传来的信息
if (scyptoString === signature) {
// 获取请求内的xml参数
this.ctx.req.on("data", (data) => {
// 将xml解析
XMLJS.parseString(data.toString(), (err, result) => {
if (result) {
const event = result.xml.Event[0];
if (event === "subscribe") {
// 订阅,获取用户基本信息存入订阅表,建议使用非同步写法以加快response
this.ctx.service.wechat.saveSubscibeUser(result.xml.FromUserName[0]);
} else if (event === "unsubscribe") {
// 取消订阅
this.ctx.service.wechat.deleteSubscibeUser(
result.xml.FromUserName[0]
);
}
}
});
});
}
// 假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试
if (params.echostr) {
// 用于通过微信验证
this.ctx.body = params.echostr;
} else {
this.ctx.body = "";
}
微信的其他事件推送:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140454