nodejs微信開發---受權登陸+獲取用戶信息

上一篇:獲取access_token+自定義菜單
這部分代碼是以前就已經完成了,可是考慮篇幅的問題就和上篇分開了,這部分相較前面的方式較爲複雜一點,可是也是很容易理解的。
這裏簡單介紹一下微信網頁受權。html

微信網頁受權

配置回調域名:

注:下面引自官方文檔
一、在微信公衆號請求用戶網頁受權以前,開發者須要先到公衆平臺官網中的「開發 - 接口權限 - 網頁服務 - 網頁賬號 - 網頁受權獲取用戶基本信息」的配置選項中,修改受權回調域名。請注意,這裏填寫的是域名(是一個字符串),而不是URL,所以請勿加 http:// 等協議頭;
二、受權回調域名配置規範爲全域名,好比須要網頁受權的域名爲:www.qq.com,配置之後此域名下面的頁面http://www.qq.com/music.htmlhttp://www.qq.com/login.html 均可以進行OAuth2.0鑑權。但http://pay.qq.comhttp://music.qq.comhttp://qq.com沒法進行OAuth2.0鑑權。
好比:須要受權的網頁域名爲http://xiadd.weixin.qq.com/demo,那麼須要配置回調域名爲xiadd.weixin.qq.com。其餘域名同理。配置圖示以下:
在權限裏找到這部分,點擊修改。
clipboard.png
將回調域名改成本身須要的域名:
clipboard.png
這樣回調域名就修改爲功了。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

引導用戶獲取code

由於受權登陸的權限較高,因此微信平臺會對連接的順序進行校驗,順序是固定的。連接格式以下:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirectsegmentfault

其中appid是固定的,就是公衆號的appid。
redirect_uri就是受權成功後須要跳轉到的連接。
response_type是固定的就是code。
scope就是受權權限,主要有兩種:snsapi_base (不彈出受權頁面,直接跳轉,只能獲取用戶openid),snsapi_userinfo (彈出受權頁面,可經過openid拿到暱稱、性別、所在地。而且,即便在未關注的狀況下,只要用戶受權,也能獲取其信息)。api

這裏的scope以snsapi_userinfo爲例,獲取用戶的信息。點進連接進入到受權頁面。如圖:瀏覽器

clipboard.png
受權後獲得url形式以下。code就包含在url裏:緩存

clipboard.png

這樣code就獲得了。code只能使用一次,5分鐘未被使用自動過時。安全

經過code換取網頁受權access_token

再次提醒,這裏的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

clipboard.png

對於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);
      }
    });
  })
}

具體響應到網頁上如圖所示:

clipboard.png

這樣就經過受權登陸拉取到了用戶信息。

github地址奉上:https://github.com/xiadd/shorthand 歡迎star?

相關文章
相關標籤/搜索