微信開發——OAuth2.0受權

微信公衆平臺最近新推出微信認證,認證後能夠得到高級接口權限,其中一個是OAuth2.0網頁受權,不少朋友在使用這個的時候失敗了或者沒法理解其內容,但願我出個教程詳細講解一下,因而便有了這篇文章。html

 

1、什麼是OAuth2.0

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

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

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

OAuth 2.0是OAuth協議的下一版本,但不向後兼容OAuth 1.0。 OAuth 2.0關注客戶端開發者的簡易性,同時爲Web應用,桌面應用和手機,和起居室設備提供專門的認證流程。數組

OAuth容許用戶提供一個令牌,而不是用戶名和密碼來訪問他們存放在特定服務提供者的數據。每個令牌受權一個特定的網站(例如,視頻編輯網站)在特定的時段(例如,接下來的2小時內)內訪問特定的資源(例如僅僅是某一相冊中的視頻)。這樣,OAuth容許用戶受權第三方網站訪問他們存儲在另外的服務提供者上的信息,而不須要分享他們的訪問許可或他們數據的全部內容。瀏覽器

新浪微博API目前也使用OAuth 2.0。安全

原文:http://www.cnblogs.com/txw1958/p/weixin71-oauth20.Html服務器

2、微信公衆平臺OAuth2.0受權微信

微信公衆平臺OAuth2.0受權詳細步驟以下:app

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. 配置受權回調頁面域名

進入微信公衆平臺後臺後,依次進入開發者中心-權限表,找到網頁受權獲取用戶基本信息,

 

 

技術分享

點擊右側的修改。原文:http://www.cnblogs.com/txw1958/p/weixin71-oauth20.Html

技術分享

受權回調域名配置規範爲全域名而且不帶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鑑權。

這裏咱們填寫方倍工做室的一個百度應用二級域名爲 mascot.duapp.com

技術分享原文:http://www.cnblogs.com/txw1958/p/weixin71-oauth20.Html

若是你的網址沒有被列入過黑名單,就會在頂部出現

技術分享

技術分享

而後,域名配置就成功了。

 

2. 用戶受權並獲取code

在域名根目錄下,新建一個文件,命名爲oauth2.PHP,其內容爲

<?PHP
if (isset($_GET[‘code‘])){
    echo $_GET[‘code‘];
}else{
    echo "NO CODE";
}
?>

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

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

參數說明

參數 必須 說明
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以下:

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連接封裝以下:

歡迎關注【近寶】,它能讓你更加方便尋找在你附近合你心意的餐飲、服裝、百貨、美容美髮店鋪。 
<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>
技術支持 方倍工做室

在微信中顯示以下

技術分享

點擊綁定後,彈出應用受權界面

技術分享

選擇容許,點擊

技術分享

跳轉到auth2.PHP頁面,執行

echo $_GET[‘code‘]

界面上顯示的就是code,這時候經過右上角按鈕中的複製連接,獲得連接以下:

http://mascot.duapp.com/oauth2.PHP?code=00b788e3b42043c8459a57a8d8ab5d9f&state=1

咱們成功獲得了code了。

注意:若是在綁定的時候出現這樣的界面,就說明參數不對,須要回頭檢查一下參數
技術分享

 

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

能夠在瀏覽器中直接執行這條語句:

(

這裏是關鍵,就是經過上面的url獲取JSon數據的代碼

    $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);    // 要求結果爲字符串且輸出到屏幕上
        curl_setopt($ch, CURLOPT_HEADER, 0); // 不要http header 加快效率
        curl_setopt($ch, CURLOPT_USERAGENT, ‘Mozilla/5.0 (compatible; MSIE 5.01; Windows NT 5.0)‘);
        curl_setopt($ch, CURLOPT_TIMEOUT, 15);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);    // https請求 不驗證證書和hosts
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);        
        $output = curl_exec($ch);
        curl_close($ch);
        $jsondecode = json_decode($output); //對JSON格式的字符串進行編碼
        $array = get_object_vars($JSondecode);//轉換成數組 
     //紅色兩行是重點,針對https的,讓我糾結了一天多
echo $array;

 

)

獲得以下JSon數據:

{
    "Access_token": "OezXcEiiBSKSxW0eoylIeAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5AI1bw2uqN--2jXoBLIM5d6L9RImvm8Vg8cBAiLpWA8Vw",
    "expires_in": 7200,
    "refresh_token": "OezXcEiiBSKSxW0eoylIEAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5CZPAwZksiuz_6x_TfkLoXLU7kdKM2232WDXB3Msuzq1A",
    "openid": "oLVPpjqs9BhvzwPj5A-vTYAX3GLc",
    "scope": "snsapi_userinfo,"
}

數據格式解讀以下:

參數 描述
Access_token 網頁受權接口調用憑證,注意:此access_token與基礎支持的Access_token不一樣
expires_in Access_token接口調用憑證超時時間,單位(秒)
refresh_token 用戶刷新Access_token
openid 用戶惟一標識,請注意,在未關注公衆號時,用戶訪問公衆號的網頁,也會產生一個用戶和公衆號惟一的OpenID
scope 用戶受權的做用域,使用逗號(,)分隔

因而,咱們成功的經過code換取到了Access_token,以及refresh_token。

刷新Access_token
官方文檔中提到了刷新Access_token的功能,但這不是必需要作的,初次使用能夠先忽略。

url請求方法以下:
https://api.weixin.QQ.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
參數說明
參數 是否必須 說明
appid 公衆號的惟一標識
grant_type 填寫爲refresh_token
refresh_token 填寫經過Access_token獲取到的refresh_token參數
構造以下:
https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=wx8888888888888888&grant_type=refresh_token&refresh_token=OezXcEiiBSKSxW0eoylIEAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5CZPAwZksiuz_6x_TfkLoXLU7kdKM2232WDXB3Msuzq1A
瀏覽器中執行獲得前面一樣格式的JSon數據

 

4. 使用Access_token獲取用戶信息

請求方法:

https://api.weixin.QQ.com/sns/userinfo?access_token=Access_TOKEN&openid=OPENID

參數說明

參數 描述
Access_token 網頁受權接口調用憑證,注意:此access_token與基礎支持的Access_token不一樣
openid 用戶的惟一標識

構造url以下:

https://api.weixin.QQ.com/sns/userinfo?Access_token=OezXcEiiBSKSxW0eoylIEAsR0GmYd1awCffdHgb4fhS_KKf2CotGj2cBNUKQQvj-G0ZWEE5-uBjBz941EOPqDQy5sS_GCs2z40dnvU99Y5AI1bw2uqN--2jXoBLIM5d6L9RImvm8Vg8cBAiLpWA8Vw&openid=oLVPpjqs9BhvzwPj5A-vTYAX3GLc

能夠在瀏覽器中直接執行這條語句:

獲得以下JSon數據:

{
    "openid": "oLVPpjqs9BhvzwPj5A-vTYAX3GLc",
    "nickname": "方倍",
    "sex": 1,
    "language": "zh_CN",
    "city": "Shenzhen",
    "province": "Guangdong",
    "country": "CN",
    "headimgurl": "http://wx.qlogo.cn/mmopen/utpKYf69VAbCRDRlbUsPsdQN38DoibCkrU6SAMCSNx558eTaLVM8PyM6jlEGzOrH67hyZibIZPXu4BK1XNWzSXB3Cs4qpBBg18/0",
    "privilege": []
}

參數解讀:

參數 描述
openid 用戶的惟一標識
nickname 用戶暱稱
sex 用戶的性別,值爲1時是男性,值爲2時是女性,值爲0時是未知
province 用戶我的資料填寫的省份
city 普通用戶我的資料填寫的城市
country 國家,如中國爲CN
headimgurl 用戶頭像,最後一個數值表明正方形頭像大小(有0、4六、6四、9六、132數值可選,0表明640*640正方形頭像),用戶沒有頭像時該項爲空
privilege 用戶特權信息,JSon 數組,如微信沃卡用戶爲(chinaunicom)

這與我我的的微信信息是一致的

 技術分享

至此,在不輸入個人帳號及密碼的狀況下,微信公衆帳號近寶得到了個人我的信息,這些信息包括暱稱、性別、國家、省份、城市、我的頭像以及特權列表。

一個完整的OAuth2認證就完成了。

 

3、詳細演示

關注方倍工做室(二維碼見下圖),回覆「受權」,返回圖文消息,點擊圖片

 技術分享

在確認頁面,點擊「容許」

技術分享

彈出獲取到的結果(圖片作了防盜處理,因此不能直接顯示出來,能夠下載到本地再來顯示)

技術分享技術分享技術分享

 

 

 

由於感受講的挺細的,因此就保留了下來。原網址:http://www.hzhike.com/School/2016/201607/20160703090418.html。

相關文章
相關標籤/搜索