1. 程式人生 > >微信公眾平臺開發 OAuth2.0網頁授權

微信公眾平臺開發 OAuth2.0網頁授權

一、什麼是OAuth2.0

官方網站:http://oauth.net/   http://oauth.net/2/

權威定義:OAuth is An open protocol to allow secure authorization in a simple and standard method from web, mobile and desktop applications. 

OAuth是一個開放協議,允許使用者讓第三方應用以安全且標準的方式獲取該使用者在某一網站、移動或桌面應用上儲存的私密的資源(如使用者個人資訊、照片、視訊、聯絡人列表),而無需將使用者名稱和密碼提供給第三方應用。

OAuth
2.0是OAuth協議的下一版本,但不向後相容OAuth 1.0。 OAuth 2.0關注客戶端開發者的簡易性,同時為Web應用,桌面應用和手機,和起居室裝置提供專門的認證流程。 OAuth允許使用者提供一個令牌,而不是使用者名稱和密碼來訪問他們存放在特定服務提供者的資料。每一個令牌授權一個特定的網站(例如,視訊編輯網站)在特定的時段(例如,接下來的2小時內)內訪問特定的資源(例如僅僅是某一相簿中的視訊)。這樣,OAuth允許使用者授權第三方網站訪問他們儲存在另外的服務提供者上的資訊,而不需要分享他們的訪問許可或他們資料的所有內容。 新浪微博API目前也使用OAuth 2.0。

二、微信公眾平臺OAuth2.0授權

  • 微信公眾平臺OAuth2.0授權詳細步驟如下:

    1. 使用者關注微信公眾賬號。
    2. 微信公眾賬號提供使用者請求授權頁面URL。
    3. 使用者點選授權頁面URL,將向伺服器發起請求
    4. 伺服器詢問使用者是否同意授權給微信公眾賬號(scope為snsapi_base時無此步驟)
    5. 使用者同意(scope為snsapi_base時無此步驟)
    6. 伺服器將CODE通過回撥傳給微信公眾賬號
    7. 微信公眾賬號獲得CODE
    8. 微信公眾賬號通過CODE向伺服器請求Access Token
    9. 伺服器返回Access Token和OpenID給微信公眾賬號
    10. 微信公眾賬號通過Access Token向伺服器請求使用者資訊(scope為snsapi_base時無此步驟)
    11. 伺服器將使用者資訊回送給微信公眾賬號(scope為snsapi_base時無此步驟)

    使用的AppId和AppSecret在開發者中心-開發者ID中,可以找到。

    1. 配置授權回撥頁面域名
      進入微信公眾平臺後臺後,依次進入開發者中心-許可權表,找到網頁授權獲取使用者基本資訊
    2. 使用者授權並獲取code
      在域名根目錄下,新建一個檔案,命名為oauth2.php,其內容為
<?php
if (isset($_GET['code'])){
    echo $_GET['code'];
}else{
    echo "NO CODE";
}
?>

先了解下請求授權頁面的構造方式:

引數 必須 說明
appid 是 公眾號的唯一標識
redirect_uri 是 授權後重定向的回撥連結地址
response_type 是 返回型別,請填寫code
scope 是 應用授權作用域,snsapi_base (不彈出授權頁面,直接跳轉,只能獲取使用者openid),snsapi_userinfo (彈出授權頁面,可通過openid拿到暱稱、性別、所在地。並且,即使在未關注的情況下,只要使用者授權,也能獲取其資訊)
state 否 重定向後會帶上state引數,開發者可以填寫任意引數值
wechat_redirect 否 直接在微信開啟連結,可以不填此引數。做頁面302重定向時候,必須帶此引數
應用授權作用域:由於snsapi_base只能獲取到openid,意義不大,所以我們使用snsapi_userinfo。
回撥地址:填寫為剛才上傳後的oauth2.php的檔案地址,
state引數:隨便一個數字,這裡填1

構造請求url如下:

OAuth2.0網頁授權演示

<a href="https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx8888888888888888&redirect_uri=http://mascot.duapp.com/oauth2.php&response_type=code&scope=snsapi_userinfo&state=1#wechat_redirect">點選這裡體驗</a>

3.使用code換取access_token 換取網頁授權access_token頁面的構造 https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
引數說明是否必須 說明

appid 是 公眾號的唯一標識
secret 是 公眾號的appsecret
code 是 填寫第一步獲取的code引數
grant_type 是 填寫為authorization_code
code:在這裡填寫為上一步獲得的值

構造請求url如下:

https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx8888888888888888&secret=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&code=00b788e3b42043c8459a57a8d8ab5d9f&grant_type=authorization_code

demo

<?php

 //微信獲取code
      public function getWXcode(){
        $weixin = new class_weixin();
        $redirect_url = 'http://www.xxxx.com/weixin_oauth2.php';
        $weixin->oauth2_url($redirect_url,'snsapi_userinfo');
      }
    //  //微信openid
   public function weixin_oauth2(){
          // var_dump('fef');
    //       $weixin = new class_weixin();
          if(!isset($GLOBALS['code'])&&empty($GLOBALS['code'])){
             exit('引數非法!');      
          }
          //登入完微信,獲取使用者的基本資訊
           $token = $weixin->oauth2_access_token($GLOBALS["code"]);  
           if ($token) {
                //把返回的code存到session裡
                $_SESSION['token'] = $token;
                $openid=$_SESSION['token']['openid'];
                echo $openid;
          }

    }
       //生成授權url
   public function oauth2_url($redirect_url,$scope,$state=1){
       $url = "https://open.weixin.qq.com/connect/qrconnect?appid=".$this->appid."&redirect_uri=".urlencode($redirect_url)."&response_type=code&scope=".$scope."&state=".$state."#wechat_redirect";
        $res = $this->http_request($url);
        error_log(print_r($res,1),3,'d:2.php');
        echo  $res;
   }
    //生成OAuth2的Access Token
    public function oauth2_access_token($code)
    {
        $url = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=".$this->appid."&secret=".$this->appsecret."&code=".$code."&grant_type=authorization_code";
        $res = $this->http_request($url);
        return json_decode($res, true);
    }

    //HTTP請求(支援HTTP/HTTPS,支援GET/POST)
    protected function http_request($url, $data = null)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        if (!empty($data)){
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        }
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
        $output = curl_exec($curl);
        curl_close($curl);
        return $output;
    }
?>