上一篇:獲取access_token+自定義菜單
這部分代碼是以前就已經完成了,可是考慮篇幅的問題就和上篇分開了,這部分相較前面的方式較爲複雜一點,可是也是很容易理解的。
這裏簡單介紹一下微信網頁受權。html
注:下面引自官方文檔
一、在微信公衆號請求用戶網頁受權以前,開發者須要先到公衆平臺官網中的「開發 - 接口權限 - 網頁服務 - 網頁賬號 - 網頁受權獲取用戶基本信息」的配置選項中,修改受權回調域名。請注意,這裏填寫的是域名(是一個字符串),而不是URL,所以請勿加 http:// 等協議頭;
二、受權回調域名配置規範爲全域名,好比須要網頁受權的域名爲:www.qq.com,配置之後此域名下面的頁面http://www.qq.com/music.html 、 http://www.qq.com/login.html 均可以進行OAuth2.0鑑權。但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com沒法進行OAuth2.0鑑權。
好比:須要受權的網頁域名爲http://xiadd.weixin.qq.com/demo,那麼須要配置回調域名爲xiadd.weixin.qq.com。其餘域名同理。配置圖示以下:
在權限裏找到這部分,點擊修改。
將回調域名改成本身須要的域名:
這樣回調域名就修改爲功了。git
關於受權登陸的各類參數細節這裏就很少說了,可是這裏也有一個access_token須要注意一下,和全局緩存的那個注意不要搞混了(話說tx爲啥不作一下命名區分)。這裏的access_token是oauth的一個憑證,全局緩存的那個是調用微信公衆平臺各個基礎接口所要用到的憑證。
具體而言,網頁受權流程分爲四步:
一、引導用戶進入受權頁面贊成受權,獲取code
二、經過code換取網頁受權access_token(與基礎支持中的access_token不一樣)
三、若是須要,開發者能夠刷新網頁受權access_token,避免過時
四、經過網頁受權access_token和openid獲取用戶基本信息
這裏的第三步不是必須的,這裏先不提,也就是受權登陸主要是三部分。引導用戶點擊相應連接獲取code,code換區access_token,經過access_token去的相應信息。github
由於受權登陸的權限較高,因此微信平臺會對連接的順序進行校驗,順序是固定的。連接格式以下:https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
segmentfault
其中appid是固定的,就是公衆號的appid。redirect_uri
就是受權成功後須要跳轉到的連接。response_type
是固定的就是code。
scope就是受權權限,主要有兩種:snsapi_base (不彈出受權頁面,直接跳轉,只能獲取用戶openid),snsapi_userinfo (彈出受權頁面,可經過openid拿到暱稱、性別、所在地。而且,即便在未關注的狀況下,只要用戶受權,也能獲取其信息)。api
這裏的scope以snsapi_userinfo爲例,獲取用戶的信息。點進連接進入到受權頁面。如圖:瀏覽器
受權後獲得url形式以下。code就包含在url裏:緩存
這樣code就獲得了。code只能使用一次,5分鐘未被使用自動過時。安全
再次提醒,這裏的access_token和全局緩存的access_token是不同的。具體返回參數請看文檔,這裏不一一列出了。
獲得code後,經過get請求https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
,參數分別爲appid,appsecret,和前一步獲取的code,雖然這裏能夠經過瀏覽器進行請求,可是由於安全級別高,因此千萬在服務端進行請求。代碼以下:微信
//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); } }) }) }
就是很簡單的一個請求獲得想要的數據。可是注意獲得的數據是個字符串,須要進行處理,響應格式以下:app
對於scope爲snsapi_base的受權,這裏是最後一步,會返回openid。若是須要再進行下一步。
若是網頁受權做用域爲snsapi_userinfo,則此時開發者能夠經過access_token和openid拉取用戶信息了。
請求方法
http:GET(請使用https協議) 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); } }); }) }
具體響應到網頁上如圖所示:
這樣就經過受權登陸拉取到了用戶信息。
github地址奉上:https://github.com/xiadd/shorthand 歡迎star?