微信公众号开发

1、微信服务器与咱们服务器的交流

微信开发者拥有本身的服务器,在咱们服务器上能够与微信服务器进行交流。既然能够交流,那就一定须要前提条件(微信认证),也就是说,只有本身的服务器与微信服务器进行认证经过后,才能与他交流。如何进行认证?node

1. 接口认证

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

而后,微信规定咱们json

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

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

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

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

nodejs代码以下:app

复制代码
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')
        }
    })
复制代码

这样,咱们就完成了微信接口认证。咱们能够与微信进行交流了。post

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);
                    }
                });
            });
})
复制代码

2、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失效并不知道。。尴尬。。。。。。

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

另外附上最新本身搞的网站,还在开发中,不要脸的附上。有看到的同窗能够进来看看啊,支持一下:   记忆课堂

相关文章
相关标签/搜索