上一篇:自動回覆的實現
這兩天終於把獲取access_token+自定義菜單+受權登陸+獲取用戶信息部分完成了,nodejs其實不是很熟悉,因此估計有不少特性沒用起來的,還有不少冗餘代碼以及各類問題,只能說功能實現了,你們多多擔待吧。node
由於調用全部公衆號的接口都須要用到access_token,因此必須先將access_token緩存起來,方便之後使用,access_token的有效時間爲2小時,因此須要定時更新,下面是代碼實現。
有一點須要注意,本文會提到兩個access_token,還有一個是oauth時會用到,因此你們不要搞混了。git
access_token的獲取相對來講很簡單了,就是請求一個連接附加參數獲得access_token,代碼以下:github
const getAccessToken = function () { let queryParams = { 'grant_type': 'client_credential', 'appid': config.appId, 'secret': config.appSecret }; let wxGetAccessTokenBaseUrl = 'https://api.weixin.qq.com/cgi-bin/token?'+qs.stringify(queryParams); let options = { method: 'GET', url: wxGetAccessTokenBaseUrl }; return new Promise((resolve, reject) => { request(options, function (err, res, body) { if (res) { resolve(JSON.parse(body)); } else { reject(err); } }); }) };
請求的三個參數也比較簡潔:json
參數 | 是否必須 | 說明 |
---|---|---|
grant_type | 是 | 獲取access_token填寫client_credential |
appid | 是 | 第三方用戶惟一憑證 |
secret | 是 | 第三方用戶惟一憑證密鑰,即appsecret |
保存有不少種方法,放在緩存裏等,我這邊是存放在一個文件裏,由於僅僅是一個示例,定時7000s更新。segmentfault
//保存與更新 const saveToken = function () { getAccessToken().then(res => { let token = res['access_token']; fs.writeFile('./token', token, function (err) { }); }) }; const refreshToken = function () { saveToken(); setInterval(function () { saveToken(); }, 7000*1000); };
這樣access_token就能作到定時更新了,注意,若是不是測試好獲取token的次數是有限制的,不過通常沒什麼問題,測試最好仍是在測試號上進行。api
獲取access_token後自定義菜單的實現就很是簡單了,這裏僅僅簡單講一下請求,具體菜單內容請看微信的文檔。
http請求方式:POST(請使用https協議) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
可是body要帶上菜單的內容,就是json數據,可是微信返回的數據是string類型,因此下面也要注意,可能在這邊會遇到問題。簡單代碼以下:緩存
'use strict'; const fs = require('fs'); const request = require('request'); //token,由於token是存在文件裏的因此這裏進行文件讀取獲得token const token = fs.readFileSync('./token').toString(); //經常使用type爲view和click,分別爲點擊事件和連接 var menus = { "button": [ { "name": "測試菜單", "sub_button": [ { "type": "view", "name": "受權登陸", "url": "http://wuyrsp3tma.proxy.qqbrowser.cc/auth" }] }] }; function createMenu() { let options = { url: 'https://api.weixin.qq.com/cgi-bin/menu/create?access_token=' + token, form: JSON.stringify(menus), headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }; request.post(options, function (err, res, body) { if (err) { console.log(err) }else { console.log(body); } }) } module.exports = createMenu;
這樣在服務器啓動的時候調用這個模塊就能夠建立一個簡單的自定義菜單了:服務器
好這部分就算結束了,原本想連着jssdk一塊兒的可是那樣就顯得太長了,可是那部分代碼已經完成了,因此你們能夠自行看看代碼。
github地址奉上:https://github.com/xiadd/shorthand 歡迎star?微信