1. 程式人生 > >微信網頁授權——獲取code、access_token、openid,及跨域問題解決

微信網頁授權——獲取code、access_token、openid,及跨域問題解決

首先在微信開發文件中有提到微信網頁授權的操作步驟:

第一步:使用者同意授權,獲取code

在確保微信公眾賬號擁有授權作用域(scope引數)的許可權的前提下(服務號獲得高階介面後,預設擁有scope引數中的snsapi_base和snsapi_userinfo),引導關注者開啟如下頁面:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri = REDIRECT_URL&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

其中scope有靜默授權和非靜默授權兩種,在這裡我們使用非靜默授權:scope等於snsapi_userinfo,為後面獲取使用者資訊做準備。

如果使用者同意授權,頁面將跳轉至 redirect_uri/?code=CODE&state=STATE。

code說明:code作為換取access_token的票據,每次使用者授權帶上的code將不一樣,code只能使用一次,5分鐘未被使用自動過期。

第二步:通過code換取網頁授權access_token

獲取code後,請求以下連結獲取access_token:  https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

但是在獲取access_token的過程中,我們會遇到一個跨域問題,什麼post、get和jsonp方法都試過了,都不行,那麼怎麼解決這個跨域問題呢?

首先我們知道我們是不可能改變微信的程式碼,那麼我們就只能想到的解決方法是利用別人的代理來進行中轉,那麼從網上找到了如下方法:

qu(){
  console.log("aaa")
  let _this = this
  let URL = _this.url + "?appid=" + api.appId + "&secret=" + api.appSecret + "&code=" + _this.code + "&grant_type=" + _this.authorization_code
  $.ajax({
     url:'http://query.yahooapis.com/v1/public/yql',
     dataType:'jsonp',
     data:{
         q:"select*from json where url=\'" + URL + "'",
         format:'json'
     },
     success:function(data){
        console.log(data)
        _this.access_token = data.query.results.json.access_token
        _this.openid = data.query.results.json.openid
     }
  })
}

以上的用的就是yahoo的代理ypl進行一箇中轉,ypl是雅虎旗下一個用來轉換資料的,從而獲取到了access_token和openid。