1. 程式人生 > >那些年用node接入微信走過的坑之(二)---微信自定義選單

那些年用node接入微信走過的坑之(二)---微信自定義選單

簡介

上一篇講到如何成為開發者,這一篇繼續,那麼設計到自定義選單和對微信事件的監聽,例如說監聽使用者發來的訊息,給使用者發推送等等,監聽使用者的關注和取消關注的事件。

準備

上一篇介紹到,cnode大神們提供的node-wechat,node-wechat-api,方便了廣大開發者,不過用的時候還是研究了一下,才看懂了,估計太差了(冷汗),也記錄一些使用心得給大家,首先安裝他們吧。。

npm -install wechat --save
nmp -install wechat-api --save

微信選單操作

微信一個梗,如果使用操作欄裡的自定義選單則微信不會再轉發響應的事件到我們設定的伺服器url中,一句話,操作選單裡的自定義選單是給普通微信公眾號人員使用的,那作為開發人員只有一條路,使用程式碼進行,這裡用到wechat-api。

var WechatAPI = require('wechat-api');
//公眾號初始化api
var wxOpenApi = new WechatAPI(constant.WX_OPEN_APPID, constant.WX_OPEN_APPSECRET, function (callback) {
    // 傳入一個獲取全域性token的方法
    //程式碼就不貼了,這裡用到的是從資料庫讀取token的方式,token是事先請求好放在資料庫的
});

我們看下原始碼中,WechatAPI的建構函式,在api_common.js中是這樣的:

var API = function
(appid, appsecret, getToken, saveToken) {
this.appid = appid; this.appsecret = appsecret; this.getToken = getToken || function (callback) { callback(null, this.store); }; this.saveToken = saveToken || function (token, callback) { this.store = token; if (process.env.NODE_ENV === 'production'
) { console.warn('Don\'t save token in memory, when cluster or multi-computer!'); } callback(null); }; //這裡設定了一些微信請求的字首 this.prefix = 'https://api.weixin.qq.com/cgi-bin/'; this.mpPrefix = 'https://mp.weixin.qq.com/cgi-bin/'; this.fileServerPrefix = 'http://file.api.weixin.qq.com/cgi-bin/'; this.payPrefix = 'https://api.weixin.qq.com/pay/'; this.merchantPrefix = 'https://api.weixin.qq.com/merchant/'; this.customservicePrefix ='https://api.weixin.qq.com/customservice/'; this.defaults = {}; // set default js ticket handle this.registerTicketHandle(); };

傳入了一個獲取token和設定token的方法,如果不傳,那麼將每次請求信的token來完成操作,雖然這樣做也可以,不過不建議。

下面看下設定menu的方法,createMenu。

exports.createMenu = function (menu, callback) {
  this.preRequest(this._createMenu, arguments);
};

/*!
 * 建立自定義選單的未封裝版本
 */
exports._createMenu = function (menu, callback) {
  var url = this.prefix + 'menu/create?access_token=' + this.token.accessToken;
  this.request(url, postJSON(menu), wrapper(callback));
};

preRequest方法呢在api_common.js中主要作用是驗證token是否過期,過期的話從新獲取token後進行請求。postJson是將http請求的頭部設定dataType為json,使用在utils.js

最關鍵的是wrapper,先看原始碼

exports.wrapper = function (callback) {
  return function (err, data, res) {
    callback = callback || function () {};
    if (err) {
      err.name = 'WeChatAPI' + err.name;
      return callback(err, data, res);
    }
    if (data && data.errcode) {
      err = new Error(data.errmsg);
      err.name = 'WeChatAPIError';
      err.code = data.errcode;
      return callback(err, data, res);
    }
    callback(null, data, res);
  };
};

這裡的callback形式是callback(err, data, res),不過例子上沒有將,如果不看原始碼的話寫的時候容易寫錯。

使用如下:


/*
 * ***** 選單操作
 * */

function createMenu(req, res) {
    var menu = {
        "button": [
            {
                "type": "view",
                "name": "我的課表",
                "url":"xxxxxx"
            },{
                "name": "關於",
                "sub_button": [
                    {
                        "type": "view",
                        "name": "下載應用",
                        "url": "",
                        "sub_button": [ ]
                    },
                    {
                        "type": "view",
                        "name": "商務合作",
                        "url": "x",                       "sub_button": [ ]
                    }
                ]
            }]
    }

//這裡看callback的格式
    wxOpenApi.createMenu(menu, function (error, data, result) {
        if (!error) {
            res.success("success");
        } else {
            res.error(error);
        }
    });
}

選單設定完畢,去公眾號看下,還可以��。

結語:

大神們寫的東西確實好用,這裡只是借鑑並講了用法吧!

ITDogFire –sky