1、OAuth2.0簡介
OAuth(開放授權)是一個開放标準,允許使用者讓第三方應用通路該使用者在某一網站上存儲的私密的資源(如照片,視訊,聯系人清單),而無需将使用者名和密碼提供給第三方應用。
允許使用者提供一個令牌,而不是使用者名和密碼來通路他們存放在特定服務提供者的資料。每一個令牌授權一個特定的網站(例如,視訊編輯網站)在特定的時段(例如,接下來的2小時内)内通路特定的資源(例如僅僅是某一相冊中的視訊)。這樣,OAuth允許使用者授權第三方網站通路他們存儲在另外的服務提供者上的資訊,而不需要分享他們的通路許可或他們資料的所有内容。
我們這裡主要模拟在微信公衆号中使用OAuth2.0進行授權,擷取使用者的基本資訊的過程。詳細的開發文檔可檢視微信的官方文檔。
微信公衆平台開發者文檔:
http://mp.weixin.qq.com/wiki/14/89b871b5466b19b3efa4ada8e577d45e.html
2、擷取測試公衆賬号及其相關配置
1)、公衆測試賬号擷取
通路上面的連接配接,選擇“接口測試号申請”獲得直接打開http://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index通過微信用戶端掃碼登入即可登入。
登入完即可擷取到一個測試公衆賬号的資訊。主要有appId和appsecret兩個參數,這将唯一标示一個公衆号,并且需要将他們作為參數擷取使用者的資訊。

2)、關注公衆号
使用者隻有關注了這個公衆号了,才能通過打開有公衆号資訊的連結去授權第三方登入,并擷取使用者資訊的操作。故我們還需要用我們的微信關注微信号,操作如下:
還是剛剛那個登入成功後跳轉的頁面,我們可以看到,該頁面有一個二維碼,我們可以通過掃描該二維碼進行關注,關注成功在右邊的“使用者清單”會多一個使用者的資訊。如下圖所示:
3)、配置回調函數
我們在微信用戶端通路第三方網頁(即我們自己的網頁)的時候,我們可以通過微信網頁授權機制,我們不僅要有前面擷取到的appid和appsecret還需要有當使用者授權之後,回調的域名設定,即使用者授權後,頁面會跳轉到哪裡。具體的配置如下:
還是在剛剛的頁面,有一個“網頁授權擷取使用者基本資訊”,點選後面的修改
然後,域名配置就成功了!
注意:
1、這裡填寫的是域名(是一個字元串),而不是URL,是以請勿加http://等協定頭;
2、授權回調域名配置規範為全域名,比如需要網頁授權的域名為: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鑒權
到這裡,我們就擷取到我們必須用到的測試資訊了,包括
- 公衆号appID、appsecret的擷取;
- 關注我們測試的公衆号;
- 配置掃碼使用者授權後回調的域名。
3、微信授權登入并擷取使用者基本資訊
微信授權使用的是OAuth2.0授權的方式。主要有以下簡略步驟:
第一步:使用者同意授權,擷取code
第二步:通過code換取網頁授權access_token
第三步:重新整理access_token(如果需要)
第四步:拉取使用者資訊(需scope為 snsapi_userinfo)
詳細的步驟如下:
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時無此步驟)
1)、使用者授權并擷取code
在域名(前面配置的回調域名)根目錄下,建立一個檔案,命名為oauth.php(名字随便你取,下面的redirect_uri做相應修改即可)該php實作的功能也很簡單,隻是将url上的code參數取出來并列印出來而已,友善我們進行接下來的操作。
Oauth.php中的内容如下:
<?php
if (isset($_GET['code'])){
echo $_GET['code'];
}else{
echo "NO CODE";
}
?>
這個php的主要目的是當使用者确認授權登入之後,會調轉到redirect_uri這個位址上,并帶上code參數(微信生成),我們為了友善擷取,這裡也可以是一個空白的頁面,下面有其他方法得到url上面的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參數,開發者可以填寫a-zA-Z0-9的參數值,最多128位元組,該值會被微信原樣傳回,我們可以将其進行比對,防止别人的攻擊。 |
#wechat_redirect | 直接在微信打開連結,可以不填此參數。做頁面302重定向時候,必須帶此參數 |
應用授權作用域:由于snsapi_base隻能擷取到openid,意義不大,是以我們使用snsapi_userinfo。
回調位址:填寫為剛才上傳後的oauth.php的檔案位址,
state參數:随便一個數字,這裡填123
尤其注意:由于授權操作安全等級較高,是以在發起授權請求時,微信會對授權連結做正則強比對校驗,如果連結的參數順序不對,授權頁面将無法正常通路
構造請求url如下:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx4a22b50d7e897f97&redirect_uri=http%3a%2f%2fad.seewo.com%2foauth.php&response_type=code&scope=snsapi_userinfo&state=123#wechat_redirect
這個需要發到微信中,使用微信浏覽器才能打開。
點開上面的連結,點選确認登入即可跳轉到剛剛配置的回調頁面,并擷取了微信傳回的code參數,用于下面的操作。
授權頁面如下:
授權後跳轉的頁面(我們前面配置的redirect_uri):
假如我們沒有在php中列印出了code,這個時候我們可以通過右上角按鈕中的複制連結,得到連結如下:
http://ad.seewo.com/oauth2.php?code=0217a07e9c194dbf539c45c266b2dcfZ&state=123
code說明 :
code作為換取access_token的票據,每次使用者授權帶上的code将不一樣,code隻能使用一次,5分鐘未被使用自動過期。
1)、使用code換取access_token
換取網頁授權access_token頁面的構造方式:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code |
參數說明
是否必須 | ||
公衆号的唯一辨別 | ||
secret | 公衆号的appsecret | |
code | 填寫第一步擷取的code參數 | |
grant_type | 填寫為authorization_code |
code:在這裡填寫為上一步獲得的值。
構造的url如下,在網頁中打開連結就行:
https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx41cb8dbd827a16e9&secret=d4624c36b6795d1d99dcf0547af5443d&code=00137323023ab55775be09d6d8e75ffA&grant_type=authorization_code
隻有擷取code的連結必須是在微信用戶端中點開的,擷取access_token和使用者資訊可以直接在網頁打開即可。
傳回說明
正确時傳回的JSON資料包如下:
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}
描述 | |
access_token | 網頁授權接口調用憑證,注意:此access_token與基礎支援的access_token不同 |
expires_in | access_token接口調用憑證逾時時間,機關(秒) |
refresh_token | 使用者重新整理access_token |
openid | 使用者唯一辨別 |
使用者授權的作用域,使用逗号(,)分隔 |
錯誤時微信會傳回JSON資料包如下(示例為Code無效錯誤):
{"errcode":40029,"errmsg":"invalid code"}
2)、通過access_token、openid擷取使用者資訊
請求方法:
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
參數說明
使用者的唯一辨別 |
構造url如下:
https://api.weixin.qq.com/sns/userinfo?access_token=OezXcEiiBSKSxW0eoylIeABONBTt9gBE6cK3arF_L6aOvwU4ynS5ZxG4r6ZUIJxh7y_ClmPRkYbMeOc_r30LAGB2IEAlCFsQQvfQMJSwHcU6109-6vz603Jho4oZhdns6AOXwoxaWcLujT1RWnC_hQ&openid=oF3PcsnsrMiJzEwalZZbAfWQpxCI
可以在浏覽器中直接執行這個。
得到的json格式資料如下:
{
"openid":" OPENID",
" nickname": NICKNAME,
"sex":"1",
"province":"PROVINCE"
"city":"CITY",
"country":"COUNTRY",
"headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
"privilege":[
"PRIVILEGE1"
"PRIVILEGE2"
],
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
nickname | 使用者昵稱 |
sex | 使用者的性别,值為1時是男性,值為2時是女性,值為0時是未知 |
province | 使用者個人資料填寫的省份 |
city | 普通使用者個人資料填寫的城市 |
country | 國家,如中國為CN |
headimgurl | 使用者頭像,最後一個數值代表正方形頭像大小(有0、46、64、96、132數值可選,0代表640*640正方形頭像),使用者沒有頭像時該項為空。若使用者更換頭像,原有頭像URL将失效。 |
privilege | 使用者特權資訊,json 數組,如微信沃卡使用者為(chinaunicom) |
unionid | 隻有在使用者将公衆号綁定到微信開放平台帳号後,才會出現該字段。詳見:擷取使用者個人資訊(UnionID機制) |
錯誤時微信會傳回JSON資料包如下(示例為openid無效):
{"errcode":40003,"errmsg":" invalid openid "}
值得注意的地方:
使用者管理類接口中的“擷取使用者基本資訊接口”,是在使用者和公衆号産生消息互動或關注後事件推送後,才能根據使用者OpenID來擷取使用者基本資訊。這個接口,包括其他微信接口,都是需要該使用者(即openid)關注了公衆号後,才能調用成功的。
網頁授權擷取使用者基本資訊也遵循UnionID機制。即如果開發者有在多個公衆号,或在公衆号、移動應用之間統一使用者帳号的需求,需要前往微信開放平台(open.weixin.qq.com)綁定公衆号後,才可利用UnionID機制來滿足上述需求。
UnionID機制的作用說明:如果開發者擁有多個移動應用、網站應用和公衆帳号,可通過擷取使用者基本資訊中的unionid來區分使用者的唯一性,因為同一使用者,對同一個微信開放平台下的不同應用(移動應用、網站應用和公衆帳号),unionid是相同的。
尤其注意:由于公衆号的secret和擷取到的access_token安全級别都非常高,必須隻儲存在伺服器,不允許傳給用戶端。後續重新整理access_token、通過access_token擷取使用者資訊等步驟,也必須從伺服器發起。