Node.js微信 access_token ( jsapi_ticket ) 存取與刷新的示例
access_token
微信文檔里存在兩種access_token:普通 access_token 和 網(wǎng)頁(yè)授權(quán) access_token。具體區(qū)別參考:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
以下提到的 access_token 均為普通的 access_token
1. 首先我們先去看看是如何請(qǐng)求 access_token 的? 微信公眾平臺(tái)技術(shù)文檔
GET請(qǐng)求:https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
正常返回:{"access_token":"ACCESS_TOKEN","expires_in":7200}
錯(cuò)誤返回:{"errcode":40013,"errmsg":"invalid appid"}
2. 所以獲取 access_token 的代碼如下:
const request = require('request') // 請(qǐng)安裝第三方包 request request.get({ uri: 'https://api.weixin.qq.com/cgi-bin/token', json: true, qs: { grant_type: 'client_credential', appid: APPID, // APPID請(qǐng)換成你的 appid secret: APPSECRET // APPSECRET請(qǐng)換成你的 appsecret } }, (err, res, body) => { if (err) { console.log(err) return } console.log(body) if (body.errcode) { // 返回錯(cuò)誤時(shí)的處理 return } })
3. guard_dog 實(shí)現(xiàn)數(shù)據(jù)持久化和定時(shí)刷新
guard_dog 會(huì)生成 .dog 文件,每個(gè)文件對(duì)應(yīng)一個(gè)KEY
const guard_dog = require('guard_dog') // 請(qǐng)安裝第三方包 guard_dog guard_dog.init(KEY, (handler) => { // KEY是guard_dog存取數(shù)據(jù)的鍵名 // 拿到數(shù)據(jù)后調(diào)用 handler handler(DATA, EXPIREDS_IN) // DATA是要持久化的數(shù)據(jù),EXPIREDS_IN是數(shù)據(jù)的有效時(shí)間,單位是秒 }, DIR) // DIR是 .dog 文件的存放目錄,這個(gè)參數(shù)可以不傳
4. 現(xiàn)在把以上兩塊代碼合并起來(lái)就是我們要的效果
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請(qǐng)換成你的 appid secret: APPSECRET // APPSECRET請(qǐng)換成你的 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 多傳個(gè)參數(shù)
5. guard_dog 初始化這個(gè) key 之后,獲取到的都是有效的值了。guard_dog 獲取值代碼如下:
guard_dog.get('ACCESS_TOKEN', (data) => { // 上面初始化時(shí)用的鍵名為'ACCESS_TOKEN',所以這里取值也要用這個(gè)鍵名 // 在這里拿到的 data 就是 access_token 了 })
6.如果想用著方便點(diǎn),可以直接封裝成一個(gè)模塊
access_token.js
const request = require('request') const guard_dog = require('guard_dog') // 加載這個(gè)模塊的時(shí)候給 ACCESS_TOKEN 這個(gè)鍵名初始化 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請(qǐng)換成你的 appid secret: APPSECRET // APPSECRET請(qǐng)換成你的 appsecret } }, (err, res, body) => { if (err) { console.log(err) return } console.log(body) if (body.errcode) { return } handler(body.access_token, body.expires_in) }) }) // 只要向外暴露一個(gè)獲取值的方法就可以了 module.exports = function (callback) { guard_dog.get('ACCESS_TOKEN', callback) }
使用:
const access_token = require('./access_token') // 這里把這個(gè)模塊與 access_token 模塊當(dāng)成在同一目錄下來(lái)作為例子。 access_token((data) => { // 這個(gè) data 就是 access_token })
jsapi_ticket
上面關(guān)于 access_token 的例子已經(jīng)說(shuō)得很詳細(xì)了,jsapi_ticket 處理起來(lái)也大同小異,所以下面直接貼代碼了:
(需要注意一點(diǎn):獲取 jsapi_ticket 需要依賴 access_token,下面的代碼直接依賴了上面所寫(xiě)的 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) => { // 這個(gè) data 就是 jsapi_ticket })
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- vue項(xiàng)目中js-cookie的使用存儲(chǔ)token操作
- 詳解Node.js使用token進(jìn)行認(rèn)證的簡(jiǎn)單示例
- node.js 微信開(kāi)發(fā)之定時(shí)獲取access_token
- NodeJs crypto加密制作token的實(shí)現(xiàn)代碼
- php實(shí)現(xiàn)JWT(json web token)鑒權(quán)實(shí)例詳解
- 詳解JSON Web Token 入門教程
- node.js+captchapng+jsonwebtoken實(shí)現(xiàn)登錄驗(yàn)證示例
- 詳解Node.js access_token的獲取、存儲(chǔ)及更新
- JSON Web Tokens的實(shí)現(xiàn)原理
- JS提示:Uncaught SyntaxError: Unexpected token ILLEGAL錯(cuò)誤的解決方法
- JS提示:Uncaught SyntaxError:Unexpected token ) 錯(cuò)誤的解決方法
- token 機(jī)制和實(shí)現(xiàn)方式
相關(guān)文章
node.js實(shí)現(xiàn)博客小爬蟲(chóng)的實(shí)例代碼
這篇文章通過(guò)實(shí)例代碼來(lái)給大家介紹如何利用node.js實(shí)現(xiàn)博客小爬蟲(chóng),有需要的朋友們可以直接運(yùn)用文中給出的實(shí)例代碼來(lái)進(jìn)行實(shí)踐學(xué)習(xí),感興趣的朋友們下面來(lái)一起看看吧。2016-10-10小結(jié)Node.js中非阻塞IO和事件循環(huán)
本文針對(duì)在Node.js關(guān)鍵的兩個(gè)概念:非阻塞IO和事件循環(huán)進(jìn)行了適當(dāng)?shù)目偨Y(jié),需要的朋友可以參考下2014-09-09kafka調(diào)試中遇到Connection to node -1 could not be established. Br
這篇文章主要介紹了kafka調(diào)試中遇到Connection to node -1 could not be established. Broker may not be available的解決方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-09-09Node.js操作Firebird數(shù)據(jù)庫(kù)教程
這篇文章主要為大家分享了Node.js操作Firebird數(shù)據(jù)庫(kù)教程,思路清晰便于大家理解,感興趣的小伙伴們可以參考一下2016-03-03簡(jiǎn)單實(shí)現(xiàn)nodejs上傳功能
這篇文章主要為大家詳細(xì)介紹了如何簡(jiǎn)單實(shí)現(xiàn)nodejs上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01nodejs 整合kindEditor實(shí)現(xiàn)圖片上傳
這篇文章主要介紹了nodejs 整合kindEditor實(shí)現(xiàn)圖片上傳,需要的朋友可以參考下2015-02-02解決Linux無(wú)法正常安裝與卸載Node.js的方法
最近在學(xué)習(xí)node.js,所以下面這篇文章主要給大家介紹了關(guān)于如何解決Linux無(wú)法正常安裝與卸載Node.js的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-01-01使用cluster 將自己的Node服務(wù)器擴(kuò)展為多線程服務(wù)器
nodejs在v0.6.x之后 增加了一個(gè)模塊 cluster 用于實(shí)現(xiàn)多進(jìn)程,利用child_process模塊來(lái)創(chuàng)建和管理進(jìn)程,增加程序在多核CPU機(jī)器上的性能表現(xiàn)。本文將介紹利用cluster模塊創(chuàng)建的多線程的問(wèn)題。2014-11-11