本篇记录了微信公众号开发的一些笔记

一、微信服务器与我们服务器的交流

微信开发者拥有自己的服务器,在我们服务器上可以与微信服务器进行交流。既然可以交流,那就必定需要前提条件(微信认证),也就是说,只有自己的服务器与微信服务器进行认证通过后,才能与他交流。如何进行认证?

1. 接口认证

接口的认证是token验证,微信服务器会发送一个get请求给我们在公众号配置的接口,如http://xxxx/weixin/api ,这个请求带了如下参数

然后,微信规定我们

1)将token、timestamp、nonce三个参数进行字典序排序 (token是在微信后台配置的)

2)将三个参数字符串拼接成一个字符串进行sha1加密

3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

通过上述三步,如果加密后的字符串与signature是相同的,那么认证成功,我们就给微信返回 echostr 接口结束。

nodejs代码如下:

app.get('/weixin/api', function (req, res) {
var query = req.query
var signature = query.signature
var nonce = query.nonce
var timestamp = query.timestamp
var echostr = query.echostr
// token在配置文件里
var str = [weixinConfig.token, timestamp, nonce].sort().join('')
// 利用sha1模块进行sha1加密
var sha = sha1(str) if (sha === signature) {
res.send(echostr)
} else {
res.send('wrong wrong wrong')
}
})

这样,我们就完成了微信接口认证。我们可以与微信进行交流了。

2. 接收微信推送内容

每一个微信动态(如:我们推送一篇图文给某个用户,或者用户点击了某个菜单),微信服务器都会给我们推送事件消息。微信服务器会以post请求的方式以xml格式推送给我们数据。因此,微信认证的路由我们还需要定义post接口来接收来自微信的推送消息。

2.1.情景模拟

1. 某一个时间,我们需要给某用户发送一个图文消息,发送成功后,微信服务器收到发送成功的响应,则微信服务器就会将这个动作的响应发给我们服务端,告诉我们结果,然后我们做出相应的行为。

2. 用户点击了某个图文菜单,微信服务器接收到请求,则微信服务器将这个请求消息发送给我们服务端,让我们做出进一步相应的行为(返回给用户图文)。

这两种情况微信都是以xml格式发送给我们数据的。我们需要接收。每一个微信服务器发送的post请求,我们都必须做相应的回复,比如用户点击图文菜单,我们要给用户发送一个图文,我们只需要以微信规定的的xml格式send给微信服务器的这个请求就可以了。

2.2 微信推送消息的类型(xml格式中的Event内容)

1. click:事件类型,又分自定义事件和微信端事件。

2. text:文本类型。

下面是nodejs的接口代码,用了xml2js的xml解析模块。weixinAutoMessage是个对象,下面包含了所有动作的接口。

app.post('/weixin/api', function (req, res) {
//获取xml数据
req.on("data", function(data) {
//将xml解析
console.log('收到微信消息的xml:' + data)
parser.parseString(data.toString(), function(err, result) {
var body = result.xml;
var messageType = body.MsgType[0]; if(messageType === 'event') { // 如果是自定义事件,那么就取事件名为body.EventKey的第一个参数
var eventName = body.Event[0] === 'CLICK' ? body.EventKey[0]: body.Event[0];
console.log('事件类型是:' + eventName);
weixinAutoMessage[eventName](body, res)
}else if(messageType === 'text') {
weixinAutoMessage.responseMessage(body, res);
}
});
});
})

二、access_token的获取

对于一个话都说不清楚的我,感觉上面写的自己都看不懂。语言组织能力太差了。不过这个access_token应该好懂的。

access_token介绍:这个东西是一个调用微信api时认证用的,每一个微信api都需要加上这个东西。下面称atoken。

微信规定,开发者需要从微信服务器上获取一个叫atoken的字串,并保存到自己的数据库中,微信端的atoken会每2小时更新一次,也就是说,我们服务器需要获取一次atoken后的2小时候再次获取一次atoken,保证我们存储的atoken与微信端保持一致,因为我们调用微信接口需要atoken认证。

这个atoken获取很简单了,看文档

我们调用这个微信接口就可以了,我们需要传递的就是appid secret,这两个都是在微信公众号后台的参数。我们调用这个接口,微信就返回一个最新的atoken,这里说一下2小时的计算是在你获取atoken后开始计算的。

如果你在9点获取了atoken, 微信就开始计算2小时后失效,也就是11点失效。

如果你在10点又获取了一次atoken,微信就重新计算2小时,也就是12点后失效。

因此根据特性,我们在一次获取atoken后,在2小时内重新获取即可。

getAccessToken () {
var url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential' +
'&appid=' + weixinConfig.appId +
'&secret=' + weixinConfig.appSecret
// request模块发送请求
request({
uri: url,
method: 'GET',
timeout: 10000,
followRedirect: true,
maxRedirects: 10,
json: true
}, function (err, res,body) {
// ... 进行存储操作
})
}

定时获取便是开启一个定时器了

//  一小时获取一次
setInterval(getAccessToken, 60 * 60 * 1000)

总结

access_token 我这样1小时获取一次,并且保证了重启服务器后开启新定时器不会超过两小时,为啥我在使用access_token是经常是已经过期!这个问题搞了很久都不知道原因,后来,在每一次使用access_token时都进行一个试探性验证,如果此时access_token失效了,重新获取后再做下一步操作。这是我的方法。但是为什么2小时内access_token失效并不知道。。尴尬。。。。。。

由于并没有专注研究微信公众号开发,可能一些地方是错的,然而我并没有发现。有大佬看到了请指正。

另外附上最新自己搞的网站,还在开发中,不要脸的附上。有看到的同学可以进来看看啊,支持一下:   记忆课堂

微信公众号开发笔记1(nodejs开发的)的更多相关文章

  1. 微信公众号开发笔记1(nodejs开发)

    本篇记录了微信公众号开发的一些笔记 一.微信服务器与我们服务器的交流 微信开发者拥有自己的服务器,在我们服务器上可以与微信服务器进行交流.既然可以交流,那就必定需要前提条件(微信认证),也就是说,只有 ...

  2. Node.js+Koa开发微信公众号个人笔记(一)准备工作

    本人也是在学习过程中,所以文章只作为学习笔记,如果能帮到你,那就更好啦~当然也难免会有错误,请不吝指出~ 一.准备工作 1.本人学习教程:慕课网Scott老师的<Node.js七天搞定微信公众号 ...

  3. C#开发微信公众号-学习笔记

    由于最近要做微信服务号的开发,所以开始找相关说明和接口文档开始学,故把学习过程及注意事项记录一下,帮助想学习的快速上手.废话不多少了,直接上干货! 1.申请微信公众号 这个就不需要多说了吧,大家直接照 ...

  4. Node.js+Koa开发微信公众号个人笔记(二)响应事件

    微信公众号中的事件有订阅事件/扫码事件/点击事件/跳转链接事件等等,具体可以查阅文档. 这里来实现一下订阅事件,其他的事件的实现过程也都类似. 当有人订阅了公众号后,微信服务器会向我们的服务器推送一个 ...

  5. 上篇: php 微信公众号 基于Thinkphp3.2框架开发

    说明:本教程是自己自学+自己的理解+扩展(包括学习过程中遇到的一些问题) 参考教程:麦子学院--李忠益--http://www.maiziedu.com/u/70409/ 微盟: http://www ...

  6. Node.js+Koa开发微信公众号个人笔记(三)响应文本

    响应输入文本和响应事件类似,首先对微信服务器发送来的数据的MsgType进行处理,如果是text,说明是文本,接下来可以对文本内容进行处理,比如用户输入了1,可以给用户回复一个文本或者图文或者视频等信 ...

  7. C#开发微信门户及应用(37)--微信公众号标签管理功能

    微信公众号,仿照企业号的思路,增加了标签管理的功能,对关注的粉丝可以设置标签管理,实现更加方便的分组管理功能.开发者可以使用用户标签管理的相关接口,实现对公众号的标签进行创建.查询.修改.删除等操作, ...

  8. Java微信公众号开发

    微信公众平台是腾讯为了让用户申请和管理微信公众账号而推出的一个web平台.微信公众账号的种类可以分为3种,并且一旦选定不可更改.按照功能的限制从小到大依次为:订阅号.服务号.企业号.个人只能注册订阅号 ...

  9. 13、ABPZero系列教程之拼多多卖家工具 微信公众号开发前的准备

    因为是开发阶段,我需要在本地调试,而微信开发需要配置域名,这样natapp.cn就有了用武之地,应该说natapp就是为此而生的. natapp.cn是什么 这是一个内网映射的网站,支持微信公众号.小 ...

随机推荐

  1. dreamweaver中的 map怎么调用?_制作热点图像区域

    我们浏览网页时,经常看到一些图片上会出现特别的超链接,即在一张图片上有多个局部区域和不同的网页链接,比如地图链接. 这就是映射图像(Image Map),它是指一幅根据链接对象不同而被人为划分为若干指 ...

  2. python rsa 加密解密 (编解码,base64编解码)

    最近有需求,需要研究一下RSA加密解密安全:在网上百度了一下例子文章,很少有文章介绍怎么保存.传输.打印加密后的文本信息,都是千篇一律的.直接在一个脚本,加密后的文本信息赋于变量,然后立马调用解密.仔 ...

  3. POP3是收邮件的协议,SMTP是发邮件的协议,IMAP是一种邮箱通信协议。

    我也是第一次接触这种服务,是因为我自己在做一个小小的自动推送天气情况到自己邮箱.所以才碰到这个的/ 看一下标题,我们可以先这样理解. POP3(Post Office Protocol - Versi ...

  4. (转)centos6.5安装VNC

    在Linux下用VNC远程桌面是个很不错的玩意.但在CentOS中默认没有安装VNC的.可以用下面语句查询,如果出现下面情况说明没有安装vnc #rpm -q tigervnc tigervnc-se ...

  5. SearchBar简单展示

    import UIKit class SearchViewController: UIViewController,UISearchBarDelegate { let SCREEN_WIDTH = U ...

  6. webp转png或jpg

    在项目开发的过程中,遇到了一个问题,就是webp的图片,先解释一下webp是啥,webp是谷歌开发的一种旨在加快图片加载速度的图片格式.图片压缩体积大约只有JPEG的2/3,说白了就是省空间,特别对于 ...

  7. 一个简单用原生js实现的小游戏----FlappyBird

    这是一个特别简单的用原生js实现的一个小鸟游戏,比较简单,适合新手练习 这是html结构 <!DOCTYPE html><html lang="en">&l ...

  8. 顺序线性表之大整数求和C++

    顺序线性表之大整数求和 大整数求和伪代码 1.初始化进位标志 flag=0: 2.求大整数 A 和 B 的长度: int aLength = a.GetLength(); int bLength = ...

  9. Java解决TopK问题(使用集合和直接实现)

    在处理大量数据的时候,有时候往往需要找出Top前几的数据,这时候如果直接对数据进行排序,在处理海量数据的时候往往就是不可行的了,而且在排序最好的时间复杂度为nlogn,当n远大于需要获取到的数据的时候 ...

  10. IOS 私有变量 私有属性的书写方法

    一.早期只能定义在.h文件中.用@private 关键字来定义私有变量. @interface ViewController{ @private Bool _isBool; } @end 二.允许在. ...