OAuth(開放受權)是一個開放標準,容許用戶讓第三方應用訪問該用戶在某一網站上存儲的私密的資源(如照片,視頻,聯繫人列表),而無需將用戶名和密碼提供給第三方應用。json
容許用戶
提供一個令牌,
而不是用戶名和密碼來訪問他們存放在特定服務提供者的數據。每個令牌受權一個特定的網站(例如,視頻編輯網站)在特定的時段(例如,接下來的2小時內)內訪問特定的資源(例如僅僅是某一相冊中的視頻)。這樣,OAuth容許用戶受權第三方網站訪問他們存儲在另外的服務提供者上的信息,而不須要分享他們的訪問許可或他們數據的全部內容。
二、目標
咱們這裏主要模擬使用OAuth2.0,用戶經過掃描咱們網頁應用的二維碼並進行受權登陸來獲取用戶的基本信息的過程。詳細的接口相關信息能夠在微信開放平臺上查看:
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&lang=zh_CN
三、前期準備(獲取微信開發者權限)
咱們這裏主要講的是網站(Web)應用,網站應用微信登陸是基於OAuth2.0協議標準構建的微信OAuth2.0受權登陸系統(即上面的協議)。在微信客戶端受權登陸(獲取用戶信息)的能夠查看:
http://www.cnblogs.com/0201zcr/p/5131602.html
在進行微信OAuth2.在進行微信OAuth2.0受權登陸接入以前,在微信開放平臺註冊開發者賬號,並擁有一個已審覈經過的網站應用,並得到相應的AppID和AppSecret,申請微信登陸且經過審覈後,可開始接入流程。api
3.一、註冊開發者帳號
能夠在
https://open.weixin.qq.com/ 這裏申請開發的帳號。因爲是騰訊的網頁,這裏能夠直接經過 QQ號進行登陸。
3.二、提交網站應用審覈
在已經登陸的界面中選擇「管理中心」——》網站應用——》建立網站應用
將會彈出下面的界面
填寫事後,還有有一個頁面須要填寫,提交一份紙質版申請書掃描件(會提供模板,咱們下載再來填寫後,需蓋章,簽名),配置回調域名(掃碼登陸後會跳轉的頁面)等。
以後提交審覈便可,等微信審覈經過,咱們便可得到咱們須要的網頁應用的
appid和AppSecret,並配置後回調的域名了(這三樣是咱們開發所必須的)。
3.三、開發者資質認證
因爲咱們這裏要使用微信登陸的接口,因此咱們還須要向微信提出認證,只有認證了才能使用微信那些高級的接口。未認證的以下圖所示
認證以後是這樣子的:
我如今暫時沒有找到能夠向公衆帳號那樣子的測試帳號的申請。若是有知道怎麼能夠申請到測試帳號的高手,但願能賜教一下。
接下來,咱們就能夠開始咱們的網頁微信掃碼登陸開發了。
四、受權流程說明
微信OAuth2.0受權登陸讓微信用戶使用微信身份安全登陸第三方應用或網站,在微信用戶受權登陸已接入微信OAuth2.0的第三方應用後,第三方能夠獲取到用戶的接口調用憑證(access_token),經過access_token能夠進行微信開放平臺受權關係接口調用,從而可實現獲取微信用戶基本開放信息和幫助用戶實現基礎開放功能等。
微信OAuth2.0受權登陸目前支持authorization_code模式,適用於擁有server端的應用受權。該模式總體流程爲:數組
1. 第三方發起微信受權登陸請求,微信用戶容許受權第三方應用後,微信會拉起應用或重定向到第三方網站,而且帶上受權臨時票據code參數; 2. 經過code參數加上AppID和AppSecret等,經過API換取access_token; 3. 經過access_token進行接口調用,獲取用戶基本數據資源或幫助用戶實現基本操做。
獲取access_token時序圖:瀏覽器
五、獲取網頁的二維碼
當咱們經過微信的認證,獲取到了
appid和AppSecret,並配置了回調的域名。咱們就已經能夠獲取屬於咱們網頁的二維碼了,獲取的方式很簡單,只需打開一個微信的連接,加上咱們的appid和回調域名便可在網頁上面打開二維碼,用戶用微信客戶端掃碼並受權登陸以後即會跳轉到咱們配置的回調域名下。
注意:
一、這裏填寫的是域名(是一個字符串),而不是URL,所以請勿加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鑑權
5.一、請求url說明安全
第三方使用網站應用受權登陸前請注意已獲取相應網頁受權做用域(scope=snsapi_login),則能夠經過在PC端打開如下連接:微信
https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
參數說明
參數 | 是否必須 | 說明 |
---|---|---|
appid | 是 | 應用惟一標識(前面認證網頁應用中得到) |
redirect_uri | 是 | 重定向地址,須要進行UrlEncode(前面認證網頁應用中得到) |
response_type | 是 | 填code |
scope | 是 | 應用受權做用域,擁有多個做用域用逗號(,)分隔,網頁應用目前僅填寫snsapi_login便可 |
state | 否 | 用於保持請求和回調的狀態,受權請求後原樣帶回給第三方。該參數可用於防止csrf攻擊(跨站請求僞造攻擊),建議第三方帶上該參數,可設置爲簡單的隨機數加session進行校驗 |
返回說明
用戶容許受權後,將會重定向到redirect_uri的網址上,而且帶上code和state參數
redirect_uri?code=CODE&state=STATE
若用戶禁止受權,則重定向後不會帶上code參數,僅會帶上state參數session
redirect_uri?state=STATE
5.二、事例:微信開發
一號店的微信二維碼連接以下:app
https://open.weixin.qq.com/connect/qrconnect?appid=wxbdc5610cc59c1631&redirect_uri=https%3A%2F%2Fpassport.yhd.com%2Fwechat%2Fcallback.do&response_type=code&scope=snsapi_login&state=3d6be0a4035d839573b04816624a415e#wechat_redirect
將其複製到瀏覽器中打開便可得到一號店的二維碼,二維碼頁面以下:
經過使用微信客戶端的掃一掃功能,掃描該二維碼,即會跳轉到上面填寫redirect_uri所在的地址上。假如用戶贊成受權,這裏就得到了微信返回的code參數了。
六、獲取用戶信息
假如前面已經得到code。咱們能夠經過code參數去獲取用戶openid和access_token,進而得到用戶的信息。
6.一、經過code參數獲取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 |
返回說明
正確的返回:
{ "access_token":"ACCESS_TOKEN", "expires_in":7200, "refresh_token":"REFRESH_TOKEN", "openid":"OPENID", "scope":"SCOPE", "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL" }
參數 | 說明 |
---|---|
access_token | 接口調用憑證 |
expires_in | access_token接口調用憑證超時時間,單位(秒) |
refresh_token | 用戶刷新access_token |
openid | 受權用戶惟一標識 |
scope | 用戶受權的做用域,使用逗號(,)分隔 |
unionid | 當且僅當該網站應用已得到該用戶的userinfo受權時,纔會出現該字段。 |
錯誤返回樣例:
{"errcode":40029,"errmsg":"invalid code"}
注意:
- code參數的超時時間是5分鐘,且每次請求的code參數的值都不同。
- access_token的超時時間是32分鐘。
6.二、經過access_token獲取用戶的基本信息
獲取的前提條件
- access_token有效且爲超時;
- 微信用戶已受權給第三方應用帳號相應接口做用域(scope)【在二維碼生成鏈接那裏填寫】
對於接口做用域(scope),能調用的接口有如下:
受權做用域(scope) | 接口 | 接口說明 |
---|---|---|
snsapi_base | /sns/oauth2/access_token | 經過code換取access_token、refresh_token和已受權scope |
/sns/oauth2/refresh_token | 刷新或續期access_token使用 | |
/sns/auth | 檢查access_token有效性 | |
snsapi_userinfo | /sns/userinfo | 獲取用戶我的信息 |
使用snsapi_base做用域的受權是掃碼以後無需用戶點擊受權,掃碼後直接跳轉,用戶感受不到受權了,但這種受權方式能獲取的數據量有限,這裏咱們要獲取用戶的基本信息,咱們須要使用snsapi_userinfo受權。使用snsapi_userinfo受權,掃碼後出現相似於下面的受權界面
此接口用於獲取用戶我的信息。開發者可經過OpenID來獲取用戶基本信息。特別須要注意的是,
若是開發者擁有多個移動應用、網站應用和公衆賬號,可經過獲取用戶基本信息中的unionid來區分用戶的惟一性,由於只要是同一個微信開放平臺賬號下的移動應用、網站應用和公衆賬號,用戶的unionid是惟一的。換句話說,同一用戶,對同一個微信開放平臺下的不一樣應用,unionid是相同的。請注意,在用戶修改微信頭像後,舊的微信頭像URL將會失效,所以開發者應該本身在獲取用戶信息後,將頭像圖片保存下來,避免微信頭像URL失效後的異常狀況。
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
參數說明
參數 | 是否必須 | 說明 |
---|---|---|
access_token | 是 | 調用憑證(上一個請求中得到) |
openid | 是 | 普通用戶的標識,對當前開發者賬號惟一(上一個請求中得到) |
lang | 否 | 國家地區語言版本,zh_CN 簡體,zh_TW 繁體,en 英語,默認爲zh-CN |
返回說明
正確的Json返回結果:
{ "openid":"OPENID", "nickname":"NICKNAME", "sex":1, "province":"PROVINCE", "city":"CITY", "country":"COUNTRY", "headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0", "privilege":[ "PRIVILEGE1", "PRIVILEGE2" ], "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL" }
參數 | 說明 |
---|---|
openid | 普通用戶的標識,對當前開發者賬號惟一 |
nickname | 普通用戶暱稱 |
sex | 普通用戶性別,1爲男性,2爲女性 |
province | 普通用戶我的資料填寫的省份 |
city | 普通用戶我的資料填寫的城市 |
country | 國家,如中國爲CN |
headimgurl | 用戶頭像,最後一個數值表明正方形頭像大小(有0、4六、6四、9六、132數值可選,0表明640*640正方形頭像),用戶沒有頭像時該項爲空 |
privilege | 用戶特權信息,json數組,如微信沃卡用戶爲(chinaunicom) |
unionid | 用戶統一標識。針對一個微信開放平臺賬號下的應用,同一用戶的unionid是惟一的。 |
錯誤的Json返回示例:
{ "errcode":40003,"errmsg":"invalid openid" }
七、總結
最近着手開發了微信網頁掃碼登陸和公衆號受權登陸收穫頗豐,二者的開發很相似。如下是我我的摸索過程當中發現的二者的異同:
- 二者均可以經過微信客戶端掃碼受權的方式,讓第三方頁面得到微信用戶的一些基本信息(暱稱、性別、所在地、在微信惟一標示等……)。他們都是經過提供一個連接讓用戶受權的方式。但網頁版須要在頁面打開二維碼以後受權,而公衆號則須要用戶先關注了咱們的公衆號,而後點開公衆號裏面的連接,確認受權便可。
- 網頁掃碼登陸須要將受權的連接(二維碼連接)在網頁中打開、而公衆號受權登陸的連接必需要微信客戶端中打開。
- 不管網頁掃碼登陸仍是在公衆號中受權登陸,都是經過受權的方式得到一個code參數,以後經過code參數獲取access_token和openid和經過access_token和openid去獲取用戶的基本信息的請求連接是同樣的。
- 在開發公衆號受權登陸的過程當中,我發現了有測試帳號的提供,足以知足咱們的測試和開發,但在開發網頁掃碼時,暫時未發現哪裏能獲取測試帳號,我是經過申請獲取的。(但願知道哪裏有測試帳號的請求高手賜教)。
致謝:感謝您的閱讀!
本文轉載自
原文做者:
WhyWin