wjeymiantan 2019-06-26
截止目前,阿里云服务器已经搭建差不多了,你可以将自己编写的网站部署到阿里云上,将IP地址告诉的小伙伴们,大家就可以看到你的作品了,现在企业越来越重视学生的动手能力,如果你能自主搭建一个个人网站,那还是很受企业欢迎的。2018新年到来时,微信又狠狠的将小程序往前推了一把。跳一跳游戏相信大家都玩了吧。相信小程序将会被越来越多人使用。在这一章中,我们不讲解小程序,而是讲解微信公众号的开发。都是微信的产品,举一反三。小程序应该也不会很难的。
要想进行公众号开发,必须进行公众号的申请。地址为:https://mp.weixin.qq.com/。
申请成功后进行登录。通过查看介绍后,我们注册订阅号!服务号不允许个人注册,图文不符,请注意。
选定类型后,按照要求完成信息登记与公众号信息登记。
微信只对企业开放高级接口,但是如果我们想学习开发又不能注册企业号该怎么办呢?微信取了一个折中的办法,允许程序员申请测试号,熟悉微信公众号开发。
当然,如果你只是这么简单的配置上,那必然会报错。提示我们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); });
验证成功后就可以正式进行微信公众号的开发了!这里介绍消息回复程序的实现。
如果用户给公众号发送一个消息,我们如何接收到用户请求信息并且给出回应。是这样,当用户发送消息的时候,微信会将用户的消息封装成一个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...