功能:用於紀錄微信網頁授權步驟(前提條件:公眾號為服務號,且通過認證)
微信網頁授權api說明網址:https://mp.weixin.qq.com/wiki/4/9ac2e7b1f1d22e9e57260f6553822520.html
相關說明:目前微信api有兩種方式獲取用戶信息。第一種是用戶管理獲取用戶基本信息(包括UnionID機制),這個前提是用戶必須事先已經關注公眾號,通過獲取基礎access_token和openID來獲取用戶信息。第二種是以snsapi_userinfo為scope發起的網頁授權,來獲取用戶的基本信息的。但這種授權需要用戶手動同意,並且由於用戶同意過,所以無須關注,就可在授權后獲取該用戶的基本信息。
一、什么是OAuth2.0
OAuth是一個開放協議,允許用戶讓第三方應用以安全且標准的方式獲取該用戶在某一網站、移動或桌面應用上存儲的私密的資源(如用戶個人信息、照片、視頻、聯系人列表),而無需將用戶名和密碼提供給第三方應用。
OAuth 2.0是OAuth協議的下一版本,但不向后兼容OAuth 1.0。 OAuth 2.0關注客戶端開發者的簡易性,同時為Web應用,桌面應用和手機,和起居室設備提供專門的認證流程。
OAuth允許用戶提供一個令牌,而不是用戶名和密碼來訪問他們存放在特定服務提供者的數據。每一個令牌授權一個特定的網站(例如,視頻編輯網站)在特定的時段(例如,接下來的2小時內)內訪問特定的資源(例如僅僅是某一相冊中的視頻)。這樣,OAuth允許用戶授權第三方網站訪問他們存儲在另外的服務提供者上的信息,而不需要分享他們的訪問許可或他們數據的所有內容。
二、微信公眾平台OAuth2.0授權
微信公眾平台OAuth2.0授權詳細步驟如下:
1. 引導用戶進入授權頁面
2. 用戶點擊授權頁面URL,將向服務器發起請求
3. 服務器詢問用戶是否同意授權給微信公眾賬號(scope為snsapi_base時無此步驟)
4. 用戶同意(scope為snsapi_base時無此步驟)
5. 服務器將CODE通過回調傳給微信公眾賬號
6. 微信公眾賬號獲得CODE
7. 微信公眾賬號通過CODE向服務器請求Access Token
8. 服務器返回Access Token和OpenID給微信公眾賬號
9. 微信公眾賬號通過Access Token向服務器請求用戶信息(scope為snsapi_base時無此步驟)
10. 服務器將用戶信息回送給微信公眾賬號(scope為snsapi_base時無此步驟)
使用的AppId和AppSecret在公眾平台基本配置中,可以找到。
如果用戶在微信中(Web微信除外)訪問公眾號的第三方網頁,公眾號開發者可以通過此接口獲取當前用戶基本信息(包括昵稱、性別、城市、國家)。利用用戶信息,可以實現體驗優化、用戶來源統計、帳號綁定、用戶身份鑒權等功能。請注意,“獲取用戶基本信息接口是在用戶和公眾號產生消息交互時,才能根據用戶OpenID獲取用戶基本信息,而網頁授權的方式獲取用戶基本信息,則無需消息交互,只是用戶進入到公眾號的網頁,就可彈出請求用戶授權的界面,用戶授權后,就可獲得其基本信息(此過程甚至不需要用戶已經關注公眾號。)”
在微信公眾號請求用戶網頁授權之前,開發者需要先到公眾平台網站的我的服務頁中配置授權回調域名。請注意,這里填寫的域名不要加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鑒權
具體而言,網頁授權流程分為四步:
1 、引導用戶進入授權頁面同意授權,獲取code
2 、通過code換取網頁授權access_token(與基礎支持中的access_token不同)
3 、如果需要,開發者可以刷新網頁授權access_token,避免過期
4、通過網頁授權access_token和openid獲取用戶基本信息
下面詳細說明這些步驟:
第一步:用戶同意授權,獲取code
在確保微信公眾賬號擁有授權作用域(scope參數)的權限的前提下(服務號獲得高級接口后,默認帶有scope參數中的snsapi_base和snsapi_userinfo),
引導關注者打開如下頁面:
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect (若提示“該鏈接無法訪問”,
請檢查參數是否填寫錯誤,是否擁有scope參數對應的授權作用域權限。)
參數說明:
參數 |
是否必須 |
說明 |
appid |
是 |
公眾號的唯一標識 |
redirect_uri |
是 |
授權后重定向的回調鏈接地址,請使用urlencode對鏈接進行處理 |
response_type |
是 |
返回類型,請填寫code |
scope |
是 |
應用授權作用域,snsapi_base (不彈出授權頁面,直接跳轉,只能獲取用戶openid),snsapi_userinfo (彈出授權頁面,可通過openid拿到昵稱、性別、所在地。並且,即使在未關注的情況下,只要用戶授權,也能獲取其信息) |
state |
否 |
重定向后會帶上state參數,開發者可以填寫a-zA-Z0-9的參數值 |
#wechat_redirect |
是 |
無論直接打開還是做頁面302重定向時候,必須帶此參數 |
用戶同意授權后
如果用戶同意授權,頁面將跳轉至 redirect_uri/?code=CODE&state=STATE。若用戶禁止授權,則重定向后不會帶上code參數,
僅會帶上state參數redirect_uri?state=STATE
code說明 : code作為換取access_token的票據,每次用戶授權帶上的code將不一樣,code只能使用一次,5分鍾未被使用自動過期。
第二步:通過code換取網頁授權access_token
首先請注意,這里通過code換取的網頁授權access_token,與基礎支持中的access_token不同。公眾號可通過下述接口來獲取網頁授權access_token。
如果網頁授權的作用域為snsapi_base,則本步驟中獲取到網頁授權access_token的同時,也獲取到了openid,snsapi_base式的網頁授權流程即到此為止。
獲取code后,請求以下鏈接獲取,請求方法:GET
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 |
返回說明
正確時返回的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 |
用戶唯一標識,請注意,在未關注公眾號時,用戶訪問公眾號的網頁,也會產生一個用戶和公眾號唯一的OpenID |
scope |
用戶授權的作用域,使用逗號(,)分隔 |
錯誤時微信會返回JSON數據包如下(示例為Code無效錯誤):
{"errcode":40029,"errmsg":"invalid code"}
第三步:刷新access_token(如果需要)
由於access_token擁有較短的有效期,當access_token超時后,可以使用refresh_token進行刷新,refresh_token擁有較長的有效期(7天、30天、60天、90天),當refresh_token失效的后,需要用戶重新授權。
請求方法:GET
獲取第二步的refresh_token后,請求以下鏈接獲取access_token: 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參數 |
返回說明:
正確時返回的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 |
用戶唯一標識 |
scope |
用戶授權的作用域,使用逗號(,)分隔 |
錯誤時微信會返回JSON數據包如下(示例為Code無效錯誤):
{"errcode":40029,"errmsg":"invalid code"}
第四步:拉取用戶信息(需scope為snsapi_userinfo)
如果網頁授權作用域為snsapi_userinfo,則此時開發者可以通過access_token和openid拉取用戶信息了。
http:GET(請使用https協議)
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
注意:這里調用的接口千萬不要用下面這個:
http請求方式: GET
https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN(這個接口是用基礎access_token和openID來
獲取用戶信息,前提是用戶必須已經關注該公眾號)
參數說明
參數 |
描述 |
access_token |
網頁授權接口調用憑證,注意:此access_token與基礎支持的 access_token不同 |
openid |
用戶的唯一標識 |
lang |
返回國家地區語言版本,zh_CN 簡體,zh_TW 繁體,en 英語 |
正確時返回的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"
}
參數 |
描述 |
openid |
用戶的唯一標識 |
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 "}