本篇主要記錄調用微信各類api和功能實現json
不管調用微信的什麼api,都須要一個查詢參數,就是咱們每隔1小時或者2小時獲取的access_token,筆記1中已經保證了本地存儲的access_token與微信服務器端一致,此時,咱們就可使用咱們本地的atoken成功調用api了。api
個人思路是,寫一個函數getAccessToken,該函數接收一個函數參數,也就是回調函數。咱們在getAccessToken中獲取到咱們本地的atoken後執行咱們的回調函數邏輯,以參數形式,把atoken傳遞給回調函數,供回調函數使用。很簡單的邏輯,就是一個回調函數的使用。服務器
getAccessToken以下:微信
function getAccessToken(callback) { Weixin.findOne(filter, function(err, data) { // 查詢到accessToken後,執行回調函數 callback(data.accessToken) }) }
簡單寫一下邏輯,不會貼源代碼的。getAccessToken函數就如上所示,很簡單的道理。函數
調用api時以下:post
自定義菜單爲例測試
getAccessToken(function(accessToken) { // 菜單的json配置項,下面會介紹 var menusData = config.weixinMenu request({ method: 'POST', url: "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + accessToken, json: true, body: menusData }, function(err, res, body) { // 請求完成, body中保存着請求結果,可進一步操做 }) })
就如上所示,咱們在建立菜單時,先獲取accessToken,利用回調的特性,拿到accessToken來進行微信api調用。網站
我在開發時總是遇到accessToken失效致使了api調用失敗,筆記1中提到過,我也沒搞清楚失效的緣由,不明覺厲啊,若是你也遇到了這個問題,就看一下個人解決辦法,以下:getAccessToken獲取後,首先不會執行回調,而是利用accessToken發起一個微信api請求,查看返回的body結果,若是errcode是0,也就是accessToken是最新的,就執行回調。若是不是,本地的accessToken過時了,那麼從新從微信服務器獲取accessToken再執行回調。ui
代碼以下:url
function getAccessToken(callback) { Weixin.findOne(filter, function(err, data) { // 查詢到accessToken後,發起一個驗證請求 request({ url: "https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=" + data.accessToken, method: 'GET' }, function(err, res, body) { // 若是errcode是 0 ,則accessToken有效,執行回調,若是不是,就獲取新的atoken後執行回調 if (!body.errcode) { callback(data.accessToken) } else { getNewAccessToken(callback) } }) }) }
感受回調的優勢深,代碼有點差。就這麼個邏輯了。獲取新的accessToken函數就和從前同樣。 上面這個api是獲取微信服務器ip地址的,用來測試accessToken好了。
看文檔,這是規定
菜單的類型,最經常使用的就是click和view:
博主在這裏煞費苦心,看半天也不懂。主要是,在作自定義菜單時,還沒搞懂筆記1中的微信接口接入和服務器間的交互。如今懂了,菜單是這樣生成的。
通常用來訪問咱們的h5頁面。用戶點擊菜單進入咱們的h5頁面,通常咱們須要靜默受權或者用戶受權來獲取用戶的一些信息。從而與用戶交互。
受權也很簡單,在這裏先不說,文檔說的也很詳細了。
不少菜單時點擊推送一篇圖文或者其餘視頻或者其餘消息,這個怎麼作呢,就用到了click類型的菜單配置。
click類型相似於給此菜單按鈕加了點擊事件,用戶點擊這個菜單,微信服務器會發送信息給咱們服務器,告訴咱們用戶點擊了菜單,click事件的key值(咱們本身配的),也就是說咱們配置的全部click類型菜單,都會配置一個key值,用戶點擊對應菜單,會推送消息給咱們服務器,根據這個key值來進行主觀的操做,返回一篇圖文給用戶啊,或者返回一個鏈接給用戶啊,或者怎麼着。
一個菜單配置項的示例
var menusConfig = { "button": [{ name: "某某論壇", type: "view", url: homeUrl }, { name: "本站介紹", type: 'click', key: "intro" }, { name: "圖文列表", "sub_button": [{ name: "圖文1", type: "click", key: "new1" }, { name: "圖文2", type: "click", key: "new2" }, { name: "圖文3", type: "click", key: "new3" }] }] }
自定義菜單生成的格式,文檔上有,如上配置,會生成三個主菜單,第三個菜單下有3個圖文子菜單。第一個菜單是一個鏈接,url地址是咱們本身的h5頁面地址。
能夠看到咱們設置了好多click類型菜單,都是一個惟一的key值。那麼咱們怎麼根據不一樣的click菜單的key值進行響應呢。
回想筆記1中,咱們寫好了微信服務器通訊的post接口,接收微信服務器推送的消息。咱們在那裏判斷了事件類型,若是事件類型是click,那麼咱們以click的key值爲準來進行處理,若是是view或者其餘的事件,就用原事件類型處理。
代碼以下:
// 若是是click事件,用事件key值來觸發響應函數 var eventName = body.Event[0] === 'CLICK' ? body.EventKey[0]: body.Event[0]; // 一個對象,包含了全部的事件響應處理函數 weixinAutoMessage[eventName](body, res)
weixinAutoMessage配置以下:
module.exports = { view: function () { // 能夠進行處理或者無視 }, intro: function (body, res) { // 返回一個本站介紹的圖文 }, new1: function (body, res) { // 返回new1圖文 } // ..雷同 }
這就是自定義菜單和用戶點擊菜單的交互過程了。
微信發送給咱們的body格式中,有來源openId(用戶),對象openId(公衆號),表明着這個微信事件是用戶發給公衆號的,而後咱們給微信send 對應xml格式的消息讓微信服務器知道該幹什麼。例如:
intro: function (body, res) { var xml = { xml: { ToUserName: body.FromUserName, FromUserName: body.ToUserName, CreateTime: + new Date(), MsgType: 'text', Content: '這是一個文本消息' } }; xml = builder.buildObject(xml); res.send(xml); } }
用戶點擊intro時,咱們回覆了一個文本消息,內容是 這是一個文本消息。 這裏用了xml2js模塊,能夠百度一下看看。
xml格式在微信文檔很清晰很詳細,能夠在消息管理- 被動回覆消息一頁看獲得。
其餘類型的菜單博主也沒用過,也無法記錄了。
微信頁面受權的意思就是,若是你須要將用戶的openId與某些數據關聯起來,你就須要獲取一些權限,從而獲取到用戶的openId並保存,當用戶在咱們h5頁面註冊或者作一些須要記錄信息的事件時,咱們就能夠將它的openId到它的數據中。
好比你的頁面須要註冊,註冊時,也要把用戶的openId保存到表中,由於後期若是用戶在你的網站買了商品或者其餘動態,你須要動態的給用戶發送購買成功、支付成功等消息,這就須要這個用戶的openId才能完成。
微信頁面受權的流程在微信文檔很清楚,看文檔就好了。