使用koa2開發(fā)微信公眾號(hào)之網(wǎng)頁授權(quán)

最近做需求要對(duì)接微信公眾號(hào)悬而,看了兩天文檔函喉,基本算是理清楚了避归,在這里做下記錄。

準(zhǔn)備工作

了解公眾號(hào)類型和接口權(quán)限

微信公眾號(hào)分為訂閱號(hào)服務(wù)號(hào)管呵,兩種賬號(hào)都可以進(jìn)行微信認(rèn)證以獲取更多接口權(quán)限(個(gè)人注冊(cè)的訂閱號(hào)不能進(jìn)行微信認(rèn)證)梳毙。

具體接口權(quán)限見:官方文檔 >>

獲取微信公眾平臺(tái)測(cè)試號(hào)

如果沒有申請(qǐng)好的公眾號(hào),可以使用官方提供的測(cè)試賬號(hào)捐下,使用自己微信號(hào)掃描登錄即可账锹。

登錄地址:微信公眾平臺(tái)測(cè)試號(hào) >>

網(wǎng)頁授權(quán)回調(diào)域名設(shè)置

我們要想在我們的網(wǎng)頁中獲取用戶信息萌业,就必須通過網(wǎng)頁授權(quán)來實(shí)現(xiàn)。網(wǎng)頁回調(diào)域名是指獲取用戶信息后需要跳轉(zhuǎn)的域名地址奸柬,因?yàn)楂@取用戶信息是微信提供的鏈接生年,獲取后需要再重定向到我們自己的頁面。

  1. 使用之前需要到公眾號(hào)里把我們的域名設(shè)置成網(wǎng)頁授權(quán)域名廓奕。
    設(shè)置方法:登錄微信公眾平臺(tái) > 設(shè)置 > 公眾號(hào)設(shè)置 > 功能設(shè)置 > 網(wǎng)頁授權(quán)域名

  2. 配置規(guī)范為全域名(不需要加http://https://)抱婉,設(shè)置后可以在該域名下所有的頁面使用,但不能在該域名的二級(jí)域名下使用桌粉。

如:設(shè)置了 www.raydom.wang 蒸绩,http://www.raydom.wang/index.html 中可以使用,但 http://note.raydom.wang 中不能使用铃肯。

后臺(tái)環(huán)境搭建

為了安全起見患亿,微信的接口調(diào)用都需要放到后臺(tái)進(jìn)行。這里使用的是基于node環(huán)境的koa2服務(wù)環(huán)境押逼。


開始

第一步:用戶同意授權(quán)窍育,獲取code

引導(dǎo)用戶打開如下鏈接:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

參數(shù)說明:

參數(shù) 必填 說明
appid 公眾號(hào)的唯一標(biāo)識(shí)
redirect_uri 授權(quán)后重定向的回調(diào)鏈接地址, 請(qǐng)使用 urlEncode 對(duì)鏈接進(jìn)行處理
response_type 返回類型宴胧,請(qǐng)?zhí)顚慶ode
scope 應(yīng)用授權(quán)作用域漱抓,snsapi_base (不彈出授權(quán)頁面,直接跳轉(zhuǎn)恕齐,只能獲取用戶openid)乞娄,snsapi_userinfo (彈出授權(quán)頁面,可通過openid拿到昵稱显歧、性別仪或、所在地。并且士骤, 即使在未關(guān)注的情況下范删,只要用戶授權(quán),也能獲取其信息 )
state 重定向后會(huì)帶上state參數(shù)拷肌,開發(fā)者可以填寫a-zA-Z0-9的參數(shù)值到旦,最多128字節(jié)
#wechat_redirect 無論直接打開還是做頁面302重定向時(shí)候,必須帶此參數(shù)

注意:redirect_uri 的值需要經(jīng)過 urlEncode 處理巨缘。
js中沒有提供原生方法添忘,可以使用工具處理以后使用: urlEncode處理工具 >>

如果用戶關(guān)注了公眾號(hào),scope 使用 snsapi_userinfo 獲取用戶信息時(shí)若锁,也不會(huì)彈出授權(quán)框(測(cè)試公眾號(hào)每次都會(huì)彈)

第二步:通過code獲取用戶信息
  1. 跳轉(zhuǎn)到我們自己的頁面以后搁骑,url中會(huì)自動(dòng)添加code。
    示例:http://test.raydom.wang/?code=081tRRYX1Bk2IT0JNqVX16RAYX1tRRYT&state=123

  2. 獲取url中的code到后臺(tái)
    前端代碼示例:

// 獲取url中的參數(shù)
function GetQueryString(name) {
    var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
    var r = window.location.search.substr(1).match(reg);
    if (r != null) return unescape(r[2]);
    return null;
}

// 這里使用的axios進(jìn)行ajax請(qǐng)求
axios.get("http://testapi.raydom.wang/login", {
        params: {
            code: GetQueryString("code")
        }
    })
    .then((res) => {
        console.log(res)
    })

  1. 在后臺(tái)用拿到的 code 獲取 ACCESS_TOKENopenid和更多信息
    后臺(tái)代碼示例:
const router = require('koa-router')()  // 引入router
const superagent = require('superagent') // 一個(gè)node環(huán)境http(s)請(qǐng)求中間件
const cache = require('memory-cache')  // 緩存處理中間件

const appid = "xxxxxxxxxxxxxxx"  // appid
const appsecret = "xxxxxxxxxxxxxxxxxxx"  // appsecret

router.get("/login", async(ctx, next) => {
    let ACCESS_TOKEN = "",
        openid = "";
    
    // 使用code獲取openid和access_token 
    await superagent
        .get("https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + 
            appid + "&secret=" + 
            appsecret + "&code=" + 
            ctx.query.code + "&grant_type=authorization_code")
        .then(res => {
            // 此處本來應(yīng)該用res.body獲取返回的json數(shù)據(jù)仲器,但總是獲取不到煤率,只能用text代替
            let result = JSON.parse(res.text)
            ACCESS_TOKEN = result.access_token
            openid = result.openid
        })
        .catch(res => {
            console.log(res)
        })
    
    // 使用ACCESS_TOKEN和openid
    await superagent
        .get("https://api.weixin.qq.com/sns/userinfo?access_token=" + 
        access_token + "&openid=" + openid + "&lang=zh_CN")
        .then(res => {
            console.log(JSON.parse(res.text))
            ctx.body = {
                state: 1,
                msg: '獲取access_token成功!'
            }
        })
        .catch(res => {
            console.log(res)
        })
})
  1. 刷新access_token(如果需要)
    由于access_token擁有較短的有效期乏冀,當(dāng)access_token超時(shí)后蝶糯,可以使用refresh_token進(jìn)行刷新,refresh_token有效期為30天煤辨,當(dāng)refresh_token失效之后裳涛,需要用戶重新授權(quán)。
    請(qǐng)求方法:
    獲取第二步的refresh_token后众辨,請(qǐng)求以下鏈接獲取access_token:https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
    返回結(jié)果:
參數(shù) 描述
access_token 網(wǎng)頁授權(quán)接口調(diào)用憑證,注意:此access_token與基礎(chǔ)支持的access_token不同
expires_in access_token接口調(diào)用憑證超時(shí)時(shí)間端三,單位(秒)
refresh_token 用戶刷新access_token
openid 用戶唯一標(biāo)識(shí)
scope 用戶授權(quán)的作用域,使用逗號(hào)(,)分隔
關(guān)于UnionID機(jī)制(測(cè)試賬號(hào)無法獲染槌埂)
  1. 如果開發(fā)者擁有多個(gè)移動(dòng)應(yīng)用郊闯、網(wǎng)站應(yīng)用和公眾帳號(hào),可通過獲取用戶基本信息中的unionid來區(qū)分用戶的唯一性蛛株,因?yàn)橥挥脩敉帕蓿瑢?duì)同一個(gè)微信開放平臺(tái)下的不同應(yīng)用(移動(dòng)應(yīng)用、網(wǎng)站應(yīng)用和公眾帳號(hào))谨履,unionid是相同的欢摄。

  2. 獲取 unionid 需要 scope 使用 snsapi_userinfo

檢驗(yàn)授權(quán)憑證(access_token)是否有效

請(qǐng)求接口:http:GET(請(qǐng)使用https協(xié)議) https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID

有效返回的JSON結(jié)果:

{ "errcode":0,"errmsg":"ok"}

錯(cuò)誤時(shí)的JSON返回示例:

{ "errcode":40003,"errmsg":"invalid openid"}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末笋粟,一起剝皮案震驚了整個(gè)濱河市怀挠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌害捕,老刑警劉巖绿淋,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異尝盼,居然都是意外死亡吞滞,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門盾沫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來裁赠,“玉大人,你說我怎么就攤上這事疮跑∽楹兀” “怎么了?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵祖娘,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng)渐苏,這世上最難降的妖魔是什么掀潮? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮琼富,結(jié)果婚禮上仪吧,老公的妹妹穿的比我還像新娘。我一直安慰自己鞠眉,他們只是感情好薯鼠,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著械蹋,像睡著了一般出皇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上哗戈,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天郊艘,我揣著相機(jī)與錄音,去河邊找鬼唯咬。 笑死纱注,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的胆胰。 我是一名探鬼主播狞贱,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蜀涨!你這毒婦竟也來了瞎嬉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤勉盅,失蹤者是張志新(化名)和其女友劉穎佑颇,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體草娜,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挑胸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了宰闰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片茬贵。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖移袍,靈堂內(nèi)的尸體忽然破棺而出解藻,到底是詐尸還是另有隱情,我是刑警寧澤葡盗,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布螟左,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏胶背。R本人自食惡果不足惜巷嚣,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望钳吟。 院中可真熱鬧廷粒,春花似錦、人聲如沸红且。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽暇番。三九已至嗤放,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間奔誓,已是汗流浹背斤吐。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留厨喂,地道東北人和措。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蜕煌,于是被迫代替她去往敵國(guó)和親派阱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • title: 微信公眾號(hào)開發(fā):獲取openId和用戶信息 tags: 微信公眾號(hào) categories: 筆記 ...
    行徑行閱讀 140,172評(píng)論 5 63
  • 微信服務(wù)號(hào)開發(fā) 整體流程 域名報(bào)備斜纪,服務(wù)器搭建 Python開發(fā)環(huán)境和項(xiàng)目的初始化搭建贫母; 微信公眾號(hào)注冊(cè)及開發(fā)模式...
    飛行員suke閱讀 4,472評(píng)論 0 14
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,517評(píng)論 25 707
  • 一、公眾號(hào)介紹 微信公眾號(hào)分類 訂閱號(hào):主要偏于為用戶傳達(dá)資訊(類似報(bào)紙雜志)盒刚,認(rèn)證前后都是每天只可以群發(fā)一條消息...
    小花的胖次閱讀 6,389評(píng)論 3 37
  • 過去一段時(shí)間曾在無數(shù)個(gè)夜里被夢(mèng)驚醒 滿身是汗腺劣。醒了嚇得不敢再睡,也害怕黑夜的到來因块,一個(gè)人無法熬過橘原,不能入眠。 過去...
    春風(fēng)十里w閱讀 308評(píng)論 0 2