微信公衆號開發筆記2(nodejs)

本篇主要記錄調用微信各類api和功能實現json

1、始於access_token

不管調用微信的什麼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好了。

2、最基礎的菜單生成

看文檔,這是規定

菜單的類型,最經常使用的就是click和view:

博主在這裏煞費苦心,看半天也不懂。主要是,在作自定義菜單時,還沒搞懂筆記1中的微信接口接入和服務器間的交互。如今懂了,菜單是這樣生成的。

一、view類型的菜單

通常用來訪問咱們的h5頁面。用戶點擊菜單進入咱們的h5頁面,通常咱們須要靜默受權或者用戶受權來獲取用戶的一些信息。從而與用戶交互。

受權也很簡單,在這裏先不說,文檔說的也很詳細了。

2.click類型菜單

 不少菜單時點擊推送一篇圖文或者其餘視頻或者其餘消息,這個怎麼作呢,就用到了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才能完成。

微信頁面受權的流程在微信文檔很清楚,看文檔就好了。

相關文章
相關標籤/搜索