背景
用戶在微信客戶端中訪問第三方網頁,公眾號可以通過微信網頁授權機制,來獲取用戶基本信息,進而實現業務邏輯。
配置
-
在微信公眾號請求用戶網頁授權之前,開發者需要先到公眾平台官網中的“開發 - 接口權限 - 網頁服務 - 網頁帳號 - 網頁授權獲取用戶基本信息”的配置選項中,修改授權回調域名。請注意,這里填寫的是域名(是一個字符串),而不是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鑒權
兩種授權方式
微信提供了兩種授權方式來應對不同的使用場景。通過網頁授權作用域 scope 參數控制。
靜默授權
- 靜默授權:用戶進入頁面后自動授權並跳轉回頁面,這種授權對用戶無感知。通過這種授權我們只能獲取到用戶的
openid,無法獲得用戶的其他信息。 - 使用場景:只需要標識該用戶,而不需要收集其他信息的場景都可以使用。比如投票、點贊等場景。
scope: snsapi_base
主動授權
- 主動授權:用戶進入頁面后會有授權彈窗,需要手動同意。該方試用來獲取用戶的基本信息
- 注意:對於已關注公眾號的用戶,用戶從公眾號的會話或者自定義菜單進入本公眾號的網頁授權頁,即使是
scope: snsapi_userinfo,也是靜默授權,用戶無感知。 scope: snsapi_userinfo
具體流程
- 用戶進入頁面,獲取
code - 通過
code換取網頁授權access_token和openid,靜默授權到這步結束 - 通過
access_token獲取用戶信息
獲取CODE
引導用戶跳傳至該鏈接
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE
用戶同意授權或靜默授權后將跳轉至 redirect_url?code=CODE&state=STATE 這個地址並帶上生成的 code。
code 作為換取access_token的票據,只能使用一次,5分鍾未使用自動過期。
參數說明

通過 code 換取網頁授權 access_token
注意,這里的 access_token 和 調用公眾平台API所需的基礎 access_token不是一個東東,只是名字一樣而已。
這一步是在服務端完成的,需要公眾號的 secret,access_token 也不可以傳給客戶端。
請求接口
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

返回
{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE"
}

拉取用戶信息(需scope為snsapi_userinfo)
當網頁授權作用域為 snsapi_userinfo時,開發者通過 access_token 和 openid 獲取用戶信息。
請求接口
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

返回
{
"openid": "OPENID",
"nickname": "NICKNAME",
"sex": "1",
"province": "PROVINCE"
"city": "CITY",
"country": "COUNTRY",
"headimgurl": "http://thirdwx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/46",
"privilege": [ "PRIVILEGE1" "PRIVILEGE2" ],
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}

