阿里云应用第四弹~依托阿里云平台使用Node+express实现微信公众号开发
截止目前,阿里云服务器已经搭建差不多了,你可以将自己编写的网站部署到阿里云上,将IP地址告诉的小伙伴们,大家就可以看到你的作品了,现在企业越来越重视学生的动手能力,如果你能自主搭建一个个人网站,那还是很受企业欢迎的。2018新年到来时,微信又狠狠的将小程序往前推了一把。跳一跳游戏相信大家都玩了吧。相信小程序将会被越来越多人使用。在这一章中,我们不讲解小程序,而是讲解微信公众号的开发。都是微信的产品,举一反三。小程序应该也不会很难的。
1. 公众号的申请
要想进行公众号开发,必须进行公众号的申请。地址为:https://mp.weixin.qq.com/。
申请成功后进行登录。通过查看介绍后,我们注册订阅号!服务号不允许个人注册,图文不符,请注意。
选定类型后,按照要求完成信息登记与公众号信息登记。
2. 申请成为开发者
微信只对企业开放高级接口,但是如果我们想学习开发又不能注册企业号该怎么办呢?微信取了一个折中的办法,允许程序员申请测试号,熟悉微信公众号开发。
- 配置服务器
我们需要有一个服务器来部署程序。当用户在操作公众号的时候会将信息发送到我们指定的服务器程序中。
当然,如果你只是这么简单的配置上,那必然会报错。提示我们token验证失败。
查看微信开发文档发现
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。校验流程:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
也就是说在上面我们设置的URL实际上是校验程序地址,该程序需要完成的事情是接受指定参数后进行排序,排序后加密,如果加密值为signature。返回该值。直接上代码吧。这里代码我使用依赖Node的Express框架。
#安装express脚手架 # npm install -g express-generator@4 #创建express项目app,然后安装依赖 # express app # cd app # npm install
接下来进行token验证程序的开发(这里我只是贴出了部分核心代码)
var sha1 = require('node-sha1'); //验证 router.get('/', function(req, res, next) { //与服务器设置的时候设置的Token保持一致 var token = 'helloweixin'; //获取客户端发来的三个参数 var signature = req.query.signature; var nonce = req.query.nonce; var timestamp = req.query.timestamp; var echostr = req.query.echostr; //排序后拼接为字符串 var str = [token,timestamp,nonce].sort().join(''); //使用SHA1算法进行加密 var sha = sha1(str); //判断加密后的值 var result = (sha === signature)? echostr + '' : 'failed'; res.send(result); });
3. 回复信息
验证成功后就可以正式进行微信公众号的开发了!这里介绍消息回复程序的实现。
如果用户给公众号发送一个消息,我们如何接收到用户请求信息并且给出回应。是这样,当用户发送消息的时候,微信会将用户的消息封装成一个XML发送给后台程序,那是哪个后台程序呢?就是你刚刚设置的url,只不过这次是以POST方式提交的。服务器接收到请求后该如何回应呢。公众号开发者文档中给给出了说明,需要后台程序也返回已给xml,与请求的XML格式相同。
<?xml version="1.0" encoding="utf-8"?> <xml> <ToUserName>接受者</ToUserName> <FromUserName>发送者</FromUserName> <CreateTime>创建时间</CreateTime> <MsgType>信息类型</MsgType> <Content>内容</Content> </xml>
那么在express中如何接受xml类型的数据呢?body-parser?只能接受form类型或者JSON类型,body-parser-xml中间件是可以预处理xml格式的数据。
# npm install body-parser-xml --save var bodyParser = require('body-parser'); require('body-parser-xml')(bodyParser); app.use(bodyParser.xml({ limit: '1MB', // Reject payload bigger than 1 MB xmlParseOptions: { normalize: true, // Trim whitespace inside text nodes normalizeTags: true, // Transform tags to lowercase explicitArray: false // Only put nodes in array if >1 } }));
之后使用req.body.xml来获取接收到的xml数据。那么接收到数据之后又如何返回xml数据呢?可以使用object-to-xml模块。
var o2x = require('object-to-xml'); // 回复消息 router.post('/', function(req, res, next) { //设置返回对象 var obj = { '?xml version=\"1.0\" encoding=\"utf-8\"?' : null, xml : { '#' : { ToUserName : req.body.xml.fromusername, FromUserName:req.body.xml.tousername, CreateTime:req.body.xml.createtime, MsgType:req.body.xml.msgtype, Content:'你好...,我是微信服务端程序' } } }; res.header("Content-Type", "text/xml") //将返回对象转换为xml返回 res.send(o2x(obj)); });
如果是Java开发者可以查看博客 http://blog.csdn.net/z6918378...