1. 程式人生 > >微信公眾號開發筆記1(nodejs開發的)

微信公眾號開發筆記1(nodejs開發的)

.post err log 加密 課堂 是我 targe 分享 gty

本篇記錄了微信公眾號開發的一些筆記

一、微信服務器與我們服務器的交流

微信開發者擁有自己的服務器,在我們服務器上可以與微信服務器進行交流。既然可以交流,那就必定需要前提條件(微信認證),也就是說,只有自己的服務器與微信服務器進行認證通過後,才能與他交流。如何進行認證?

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開發的)