微信開發者擁有本身的服務器,在咱們服務器上能夠與微信服務器進行交流。既然能夠交流,那就一定須要前提條件(微信認證),也就是說,只有本身的服務器與微信服務器進行認證經過後,才能與他交流。如何進行認證?node
接口的認證是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
每個微信動態(如:咱們推送一篇圖文給某個用戶,或者用戶點擊了某個菜單),微信服務器都會給咱們推送事件消息。微信服務器會以post請求的方式以xml格式推送給咱們數據。所以,微信認證的路由咱們還須要定義post接口來接收來自微信的推送消息。網站
1. 某一個時間,咱們須要給某用戶發送一個圖文消息,發送成功後,微信服務器收到發送成功的響應,則微信服務器就會將這個動做的響應發給咱們服務端,告訴咱們結果,而後咱們作出相應的行爲。
2. 用戶點擊了某個圖文菜單,微信服務器接收到請求,則微信服務器將這個請求消息發送給咱們服務端,讓咱們作出進一步相應的行爲(返回給用戶圖文)。
這兩種狀況微信都是以xml格式發送給咱們數據的。咱們須要接收。每個微信服務器發送的post請求,咱們都必須作相應的回覆,好比用戶點擊圖文菜單,咱們要給用戶發送一個圖文,咱們只須要以微信規定的的xml格式send給微信服務器的這個請求就能夠了。
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介紹:這個東西是一個調用微信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失效並不知道。。尷尬。。。。。。
因爲並無專一研究微信公衆號開發,可能一些地方是錯的,然而我並無發現。有大佬看到了請指正。
另外附上最新本身搞的網站,還在開發中,不要臉的附上。有看到的同窗能夠進來看看啊,支持一下: 記憶課堂