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

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

本文章轉自方倍工作室:http://www.cnblogs.com/txw1958/p/weixin71-oauth20.html

一、什麼是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。

原文:http://www.cnblogs.com/txw1958/p/weixin71-oauth20.html

二、微信公眾平臺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. 配置授權回撥頁面域名

進入微信公眾平臺後臺後,依次進入開發者中心-許可權表,找到網頁授權獲取使用者基本資訊

點選右側的修改。原文: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連結封裝如下:

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>
技術支援 方倍工作室

在微信中顯示如下

點選繫結後,彈出應用授權介面

選擇允許,點選

跳轉到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

可以在瀏覽器中直接執行這條語句:

得到如下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": "簡體中文",
    "city": "深圳",
    "province": "廣東",
    "country": "中國",
    "headimgurl": "http://wx.qlogo.cn/mmopen/utpKYf69VAbCRDRlbUsPsdQN38DoibCkrU6SAMCSNx558eTaLVM8PyM6jlEGzOrH67hyZibIZPXu4BK1XNWzSXB3Cs4qpBBg18/0",
    "privilege": []
}
複製程式碼

引數解讀:

引數 描述
openid 使用者的唯一標識
nickname 使用者暱稱
sex 使用者的性別,值為1時是男性,值為2時是女性,值為0時是未知
province 使用者個人資料填寫的省份
city 普通使用者個人資料填寫的城市
country 國家,如中國為CN
headimgurl 使用者頭像,最後一個數值代表正方形頭像大小(有0、46、64、96、132數值可選,0代表640*640正方形頭像),使用者沒有頭像時該項為空
privilege 使用者特權資訊,json 陣列,如微信沃卡使用者為(chinaunicom)

這與我個人的微信資訊是一致的

 

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

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