nodejs微信公众号开发
本文主要介绍使用开发微信公众号
公众号注册
开发公众号第一步我们当然是先注册一个公众号啦!
到微信公众平台注册一个微信公众号,个人只能注册订阅号。企业或者组织等可以注册服务号等,个人订阅号调用接口权限少。按官网说明完成注册即可。微信公众平台
公众号配置
完成了注册之后我们需要进行公众号配置,公众号的运行流程大致为用户发送消息到微信服务器->转发消息到开发者服务器->开发者服务器处理消息->返回消息到微信服务器->用户
所以呢,我们需要配置下才能让公众号收到的消息转发到我们的服务器。微信开发可参考微信公众平台技术文档
如图所示,登录微信公众平台,在开发模块的基本配置中,主要配置的就是服务器配置。
服务器地址:配置微信服务器要转发啊消息的地址(也就是我们要处理微信消息的服务器地址,该地址只能为域名)
令牌:开发者手动填写的一个令牌,认证时会用到。
消息可以选加密和不加密,加密时我们需要实现消息解密吧。
公众号配置完成之后我们就要来实现我们的服务器代码了。
服务器实现
本文主要介绍使用提供服务、当然服务还可以由java,php等来提供,全凭个人喜好。
//server.js
var express = require('express');
var app = express();
var crypto = require('crypto');
var bodyParser = require('body-parser');
var wxRouter = require('./router/wxrouter')
app.use(bodyParser.urlencoded({ extended: true }))/*app.get('/weixin', function(req, res){res.send('hello world');
});*/
app.use('/weixin',wxRouter) //weixin 下的所有请求交给wxRouter处理app.listen(3000);
以上主要是利用启动web服务。使用请参考官网。在这里可能有人会奇怪,我配置的服务器地址不是在3000端口上为啥会转发到这里呢。答案是利用nginx做一个请求转发
//wxrouter.js
var router = require('express').Router();
var crypto = require('crypto');
var wxService = require('../api/wxapi');
function sha1(str) { var md5sum = crypto.createHash("sha1"); md5sum.update(str); str = md5sum.digest("hex"); return str;
}
router.get('/validateToken', function(req, res, next) {var signature = req.query.signature;var timestamp = req.query.timestamp;var nonce = req.query.nonce;var echostr = req.query.echostr;var oriArray = [];oriArray[0] = nonce; oriArray[1] = timestamp; oriArray[2] = "SDS232JK32KLDSscx"; oriArray.sort(); console.log(req.query)if(signature == sha1(oriArray.join(''))){console.log(echostr)res.send(echostr); }else{res.send("false"); console.log("validateToken failed!"); }next();
});router.post('/validateToken',function(req, res,next){wxService.parseMsg(req,res);next();
})module.exports = router;
路由我们需要实现2个请求的处理。一个是的get请求,用于微信服务器向我们服务器的消息转发认证,只有通过该认证,微信服务器才会把消息转发到我们的服务器。
然后最重要是的的post请求处理了,该路由是处理微信服务器消息的。
微信服务器与我们服务器消息交互是基于xml的发送-回复消息
//wxapi.js
var xml2js = require('xml2js');
var Wx = {data: '',msgType: 'text',fromUserName: '',toUserName: '',content:'暂不支持处理该类型消息',parseMsg(req, res) {var buf = '';req.on('data', function(chunk) {buf += chunk;})req.on('end', () => {xml2js.parseString(buf, function(err, result) {if (err) {err.status = 400;} else {req.body = result;}});this.data = req.body.xml;this.fromUserName = this.data.FromUserName[0];this.toUserName = this.data.ToUserName[0];switch (this.data.MsgType[0]) {case 'text':this.content = this.data.Content[0];this.handleTextMsg();break;default:// statements_defbreak;}var responseTxt = this.getXmlMsg();console.log(responseTxt)res.type('xml');res.send(responseTxt)})},handleTextMsg() {},getXmlMsg() {return `<xml><ToUserName>CDATA[${this.fromUserName}]]>ToUserName><FromUserName>CDATA[${this.toUserName}]]>FromUserName><CreateTime>${new Date().getTime()}CreateTime><MsgType>CDATA[${this.msgType}]]>MsgType><Content>CDATA[${this.content}]]>Content>xml>`;}
}
module.exports = Wx;
我们使用来处理xml消息,写好程序打印下req.body.xml就知道这个将xml转化成便于我们使用的json对象了。然后用简单的()方法通过公众号像用户发送消息。至此,我们就完成了简单的微信公众号开发入门。