nodejs微信開發(fā)之授權(quán)登錄+獲取用戶信息
這部分代碼是之前就已經(jīng)完成了,但是考慮篇幅的問題就和上篇分開了,這部分相較前面的方式較為復(fù)雜一點,但是也是很容易理解的。
這里簡單介紹一下微信網(wǎng)頁授權(quán)。
微信網(wǎng)頁授權(quán)配置回調(diào)域名:
注:下面引自官方文檔
1、在微信公眾號請求用戶網(wǎng)頁授權(quán)之前,開發(fā)者需要先到公眾平臺官網(wǎng)中的“開發(fā) - 接口權(quán)限 - 網(wǎng)頁服務(wù) - 網(wǎng)頁帳號 - 網(wǎng)頁授權(quán)獲取用戶基本信息”的配置選項中,修改授權(quán)回調(diào)域名。請注意,這里填寫的是域名(是一個字符串),而不是URL,因此請勿加 http:// 等協(xié)議頭;
2、授權(quán)回調(diào)域名配置規(guī)范為全域名,比如需要網(wǎng)頁授權(quán)的域名為:www.qq.com,配置以后此域名下面的頁面http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以進行OAuth2.0鑒權(quán)。但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com無法進行OAuth2.0鑒權(quán)。
比如:需要授權(quán)的網(wǎng)頁域名為http://xiadd.weixin.qq.com/demo,那么需要配置回調(diào)域名為xiadd.weixin.qq.com。其他域名同理。配置圖示如下:
在權(quán)限里找到這部分,點擊修改。

將回調(diào)域名改為自己需要的域名:

這樣回調(diào)域名就修改成功了。
授權(quán)登錄
關(guān)于授權(quán)登錄的各種參數(shù)細節(jié)這里就不多說了,但是這里也有一個access_token需要注意一下,和全局緩存的那個注意不要搞混了(話說tx為啥不做一下命名區(qū)分)。這里的access_token是oauth的一個憑證,全局緩存的那個是調(diào)用微信公眾平臺各個基礎(chǔ)接口所要用到的憑證。
具體而言,網(wǎng)頁授權(quán)流程分為四步:
1、引導(dǎo)用戶進入授權(quán)頁面同意授權(quán),獲取code
2、通過code換取網(wǎng)頁授權(quán)access_token(與基礎(chǔ)支持中的access_token不同)
3、如果需要,開發(fā)者可以刷新網(wǎng)頁授權(quán)access_token,避免過期
4、通過網(wǎng)頁授權(quán)access_token和openid獲取用戶基本信息
這里的第三步不是必須的,這里先不提,也就是授權(quán)登錄主要是三部分。引導(dǎo)用戶點擊相應(yīng)鏈接獲取code,code換區(qū)access_token,通過access_token去的相應(yīng)信息。
引導(dǎo)用戶獲取code
因為授權(quán)登錄的權(quán)限較高,所以微信平臺會對鏈接的順序進行校驗,順序是固定的。鏈接格式如下:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
其中appid是固定的,就是公眾號的appid。
redirect_uri就是授權(quán)成功后需要跳轉(zhuǎn)到的鏈接。
response_type是固定的就是code。
scope就是授權(quán)權(quán)限,主要有兩種:snsapi_base (不彈出授權(quán)頁面,直接跳轉(zhuǎn),只能獲取用戶openid),snsapi_userinfo (彈出授權(quán)頁面,可通過openid拿到昵稱、性別、所在地。并且,即使在未關(guān)注的情況下,只要用戶授權(quán),也能獲取其信息)。
這里的scope以snsapi_userinfo為例,獲取用戶的信息。點進鏈接進入到授權(quán)頁面。如圖:

授權(quán)后得到url形式如下。code就包含在url里:

這樣code就得到了。code只能使用一次,5分鐘未被使用自動過期。
通過code換取網(wǎng)頁授權(quán)access_token
再次提醒,這里的access_token和全局緩存的access_token是不一樣的。具體返回參數(shù)請看文檔,這里不一一列出了。
得到code后,通過get請求https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code,參數(shù)分別為appid,appsecret,和前一步獲取的code,雖然這里可以通過瀏覽器進行請求,但是因為安全級別高,所以千萬在服務(wù)端進行請求。代碼如下:
//getWebToken.js
function getToken(code) {
let reqUrl = 'https://api.weixin.qq.com/sns/oauth2/access_token?';
let params = {
appid: config.appId,
secret: config.appSecret,
code: code,
grant_type: 'authorization_code'
};
let options = {
method: 'get',
url: reqUrl+qs.stringify(params)
};
console.log(options.url);
return new Promise((resolve, reject) => {
request(options, function (err, res, body) {
if (res) {
resolve(body);
} else {
reject(err);
}
})
})
}
就是很簡單的一個請求得到想要的數(shù)據(jù)。但是注意得到的數(shù)據(jù)是個字符串,需要進行處理,響應(yīng)格式如下:

對于scope為snsapi_base的授權(quán),這里是最后一步,會返回openid。如果需要再進行下一步。
拉取用戶信息
如果網(wǎng)頁授權(quán)作用域為snsapi_userinfo,則此時開發(fā)者可以通過access_token和openid拉取用戶信息了。
請求方法
http:GET(請使用https協(xié)議) https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
這里也很簡單。直接看代碼:
function getUserInfo(AccessToken, openId) {
let reqUrl = 'https://api.weixin.qq.com/sns/userinfo?';
let params = {
access_token: AccessToken,
openid: openId,
lang: 'zh_CN'
};
let options = {
method: 'get',
url: reqUrl+qs.stringify(params)
};
return new Promise((resolve, reject) => {
request(options, function (err, res, body) {
if (res) {
resolve(body);
} else {
reject(err);
}
});
})
}
具體響應(yīng)到網(wǎng)頁上如圖所示:

這樣就通過授權(quán)登錄拉取到了用戶信息。
github地址奉上:https://github.com/xiadd/shorthand 歡迎star
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
輕松創(chuàng)建nodejs服務(wù)器(2):nodejs服務(wù)器的構(gòu)成分析
這篇文章主要介紹了輕松創(chuàng)建nodejs服務(wù)器(2):nodejs服務(wù)器的構(gòu)成分析,本文是對第一節(jié)中簡單服務(wù)器的代碼進行分析總結(jié),需要的朋友可以參考下2014-12-12
node.js監(jiān)聽文件變化的實現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于node.js監(jiān)聽文件變化的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用node.js具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-04-04

