Node.js 輕松搞定微信 access_token ( jsapi_ticket ) 存取與刷新


access_token

微信文檔里存在兩種access_token:普通 access_token 和 網頁授權 access_token。具體區別參考:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842

以下提到的 access_token 均為普通的 access_token

1. 首先我們先去看看是如何請求 access_token 的? 微信公眾平臺技術文檔

GET請求:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
正常返回:{"access_token":"ACCESS_TOKEN","expires_in":7200}
錯誤返回:{"errcode":40013,"errmsg":"invalid appid"}

2. 所以獲取 access_token 的代碼如下:
const request = require('request')    // 請安裝第三方包 request

request.get({
        uri: 'https://api.weixin.qq.com/cgi-bin/token',
        json: true,
        qs: {
            grant_type: 'client_credential',
            appid: APPID,    // APPID請換成你的 appid
            secret: APPSECRET    // APPSECRET請換成你的 appsecret
        }
    }, (err, res, body) => {
        if (err) {
            console.log(err)
            return
        }
        console.log(body)
        if (body.errcode) {
            // 返回錯誤時的處理
            return
        }
})
3. guard_dog 實現數據持久化和定時刷新
  • guard_dog 會生成 .dog 文件,每個文件對應一個KEY
const guard_dog = require('guard_dog')    // 請安裝第三方包 guard_dog

guard_dog.init(KEY, (handler) => {    // KEY是guard_dog存取數據的鍵名
    // 拿到數據后調用 handler
    handler(DATA, EXPIREDS_IN)    // DATA是要持久化的數據,EXPIREDS_IN是數據的有效時間,單位是秒
}, DIR)    // DIR是 .dog 文件的存放目錄,這個參數可以不傳
4. 現在把以上兩塊代碼合并起來就是我們要的效果
const request = require('request')
const guard_dog = require('guard_dog')

guard_dog.init('ACCESS_TOKEN', (handler) => {
    request.get({
        uri: 'https://api.weixin.qq.com/cgi-bin/token',
        json: true,
        qs: {
            grant_type: 'client_credential',
            appid: APPID,    // APPID請換成你的 appid
            secret: APPSECRET    // APPSECRET請換成你的 appsecret
        }
    }, (err, res, body) => {
        if (err) {
            console.log(err)
            return
        }
        console.log(body)
        if (body.errcode) {
            return
        }
        handler(body.access_token, body.expires_in)
    })
})    // 如有需要指定目錄,可以再給 guard_dog.init 多傳個參數
5. guard_dog 初始化這個 key 之后,獲取到的都是有效的值了。guard_dog 獲取值代碼如下:
guard_dog.get('ACCESS_TOKEN', (data) => {    // 上面初始化時用的鍵名為'ACCESS_TOKEN',所以這里取值也要用這個鍵名
    // 在這里拿到的 data 就是 access_token 了
})
6.如果想用著方便點,可以直接封裝成一個模塊

access_token.js

const request = require('request')
const guard_dog = require('guard_dog')
// 加載這個模塊的時候給 ACCESS_TOKEN 這個鍵名初始化
guard_dog.init('ACCESS_TOKEN', (handler) => {
    request.get({
        uri: 'https://api.weixin.qq.com/cgi-bin/token',
        json: true,
        qs: {
            grant_type: 'client_credential',
            appid: APPID,    // APPID請換成你的 appid
            secret: APPSECRET    // APPSECRET請換成你的 appsecret
        }
    }, (err, res, body) => {
        if (err) {
            console.log(err)
            return
        }
        console.log(body)
        if (body.errcode) {
            return
        }
        handler(body.access_token, body.expires_in)
    })
}) 
// 只要向外暴露一個獲取值的方法就可以了
module.exports = function (callback) {
    guard_dog.get('ACCESS_TOKEN', callback)
}

使用:

const access_token = require('./access_token')    // 這里把這個模塊與 access_token 模塊當成在同一目錄下來作為例子。
access_token((data) => {
    // 這個 data 就是 access_token
})

jsapi_ticket

jsapi_ticket 官方文檔說明
上面關于 access_token 的例子已經說得很詳細了,jsapi_ticket 處理起來也大同小異,所以下面直接貼代碼了:

(需要注意一點:獲取 jsapi_ticket 需要依賴 access_token,下面的代碼直接依賴了上面所寫的 access_token.js)

jsapi_ticket.js

const request = require('request')
const guard_dog = require('guard_dog')
const access_token = require('./access_token')

guard_dog.init('JSAPI_TICKET', (handler) => {
    access_token((access_token) => {
        request.get({
            uri: 'https://api.weixin.qq.com/cgi-bin/ticket/getticket',
            json: true,
            qs: {
                access_token: access_token,
                type: 'jsapi'
            }
        }, (err, res, body) => {
            if (err) {
                console.log(err)
                return
            }
            console.log(body)
            if (body.errcode) {
                return
            }
            handler(body.ticket, body.expires_in)
        })
    })
})

module.exports = function (callback) {
    guard_dog.get('JSAPI_TICKET', callback)
}

使用:

const jsapi_ticket = require('./jsapi_ticket')
jsapi_ticket((data) => {
    // 這個 data 就是 jsapi_ticket
})
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,321評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,559評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,442評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,835評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,581評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,922評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,931評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,096評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,639評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,374評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,591評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,104評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,789評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,196評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,524評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,322評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,554評論 2 379

推薦閱讀更多精彩內容

  • 本文檔僅為微信開發文檔記錄,非參考文檔,非官方文檔。如果其中出現錯誤,歡迎指正。然后其中有代碼是參考的網上資料,具...
    Hugh1029閱讀 1,080評論 0 0
  • 久違的新文章發布。。我的鍋這篇文章是在寫的太長,可以慢慢看一下,偽代碼,畢竟簡書上面,望大家見諒!!!先看官方文檔...
    wyatt_plus閱讀 1,649評論 0 2
  • 本文基于工作使用學習,做的整理筆記當我們進行微信分享時,分享出去的效果,我們最容易發現的是沒有圖,那我們就埋一個3...
    SeasonDe閱讀 14,049評論 12 17
  • 微信服務號開發 整體流程 域名報備,服務器搭建 Python開發環境和項目的初始化搭建; 微信公眾號注冊及開發模式...
    飛行員suke閱讀 4,569評論 0 14
  • 【9834小時計劃】今日完成情況: 運動模塊(六項)——達成率100% 學習模塊(三項)——達成率50% 增值模塊...
    進擊的太2真人閱讀 152評論 0 0