如果使用者在微信用戶端存取第三方網頁,則公眾號碼可以透過微信網頁授權機制,來獲取使用者基本訊息,進而實現業務邏輯。
關於網頁授權回呼網域的說明
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鑑權
3、如果公眾號登入授權給了第三方開發者來進行管理,不必做任何設置,由第三方代替公眾號實現網頁授權即可
#
關於網頁授權的兩種scope的區別說明
1、以snsapi_base為scope發起的網頁授權,是用來獲取進入頁面的用戶的openid的,並且是靜默授權並自動跳到回調頁的。使用者感知的就是直接進入了回調頁(往往是商業頁面)
2、以snsapi_userinfo為scope發起的網頁授權,是用來獲取使用者的基本資訊的。但這種授權需要使用者手動同意,而且由於使用者同意過,所以無須關注,就可在授權後取得該使用者的基本資訊。
3、用戶管理類別介面中的“獲取用戶基本資訊介面”,是在用戶和公眾號產生訊息互動或關注後事件推送後,才能根據用戶OpenID來獲取用戶基本資訊。這個接口,包括其他微信接口,都是需要該用戶(即openid)關注了公眾號後,才能調用成功的。
關於網頁授權access_token和普通access_token的區別
1、微信網頁授權是透過OAuth2.0機制實現的,在使用者授權給公眾號後,公眾號碼可取得網頁授權特有的介面呼叫憑證(網頁授權access_token),透過網頁授權access_token可以進行授權後介面調用,如取得使用者基本資訊;
2、其他微信接口,需要透過基礎支援中的「取得access_token」接口來取得到的普通access_token呼叫。
關於UnionID機制
1、請注意,網頁授權取得使用者基本資訊也遵循UnionID機制。也就是如果開發者有在多個公眾號,或在公眾號、行動應用程式之間統一用戶帳號的需求,需要前往微信開放平台(open.weixin.qq.com)綁定公眾號後,才可利用UnionID機制來滿足上述需求。
2、UnionID機制的作用說明:如果開發者擁有多個行動應用程式、網站應用程式和公眾帳號,可透過取得使用者基本資訊中的unionid來區分使用者的唯一性,因為同一用戶,對同一個微信開放平台下的不同應用(行動應用程式、網站應用程式和公眾帳號),unionid是相同的。
關於特殊場景下的靜默授權
1、上面已經提到,對於以snsapi_base為scope的網頁授權,就靜默授權的,用戶無感知;
2、對於已關注公眾號的用戶,如果用戶從公眾號的會話或自訂選單進入本公眾號的網頁授權頁,即使是scope為snsapi_userinfo,也是靜默授權,用戶無感知。
#
具體而言,網頁授權流程分為四個步驟:
1、引導使用者進入授權頁面同意授權,取得code
2、透過code換取網頁授權access_token(與基礎支援中的access_token不同)
3、如果需要,開發者可以刷新網頁授權access_token,避免過期
4、透過網頁授權access_token和openid取得使用者基本資訊(支援UnionID機制)
#第一步:使用者同意授權,取得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參數對應的授權作用域權限。
尤其註意:由於授權操作安全等級較高,所以在發起授權請求時,微信會對授權連結做正規則強匹配校驗,如果連結的參數順序不對,授權頁面將無法正常存取
參考連結(請在微信客戶端中開啟此連結體驗) scope為snsapi_base https://open.weixin.qq.com/connect /oauth2/authorize?appid=wx520c15f417810387&redirect_uri=https://chong.qq.com/php/index.php?d=&c=wxAdap
ter&m=mobile/index.php?d=&c=wxAdap
ter&m=mobile_Deal&showwxxx&c=wxAdap
ter&m=mob api_bas
e&state=123#wechat_redirect Scope為snsapi_userinfo https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60&redirect_uri=http://nba.bluewebgame.com/oa;
code&scope=snsapi_userinfo&state=STATE#wechat_redirect #########
尤其註意:跳轉回調redirect_uri,應使用https連結來確保授權code的安全性。
參數說明
參數 | 是否必須 | 說明 |
---|
appid | 是 | 公眾號的唯一識別 |
redirect_uri | #是 | 授權後重定向的回呼連結位址,請使用urlencode對連結進行處理 |
response_type | 是 | #回傳類型,請填入code |
scope | 是 | 應用授權作用域,snsapi_base (不彈出授權頁面,直接跳轉,只能取得使用者openid),snsapi_userinfo (彈出授權頁面,可透過openid拿到暱稱、性別、所在地。並且,即使在未關注的情況下,只要使用者授權,也能取得其資訊) |
state | ##否 | 重定向後會帶上state參數,開發者可以填入a-zA-Z0-9的參數值,最多128位元組 |
#wechat_redirect | | |
##################################是######無論直接開啟或做頁面302重定向時候,必須帶此參數############
下圖為scope等於snsapi_userinfo時的授權頁面:
#使用者同意授權後
如果用戶同意授權,頁面將跳到redirect_uri/?code=CODE&state=STATE。
code說明 : code作為換取access_token的票據,每次使用者授權帶上的code將不一樣,code只能使用一次,5分鐘未被使用自動過期。
第二步:透過code換取網頁授權access_token
#首先請注意,這裡透過code換取的是一個特殊的網頁授權access_token,與基礎支援中的access_token(該access_token用於呼叫其他介面)不同。公眾號可透過下述介面來取得網頁授權access_token。如果網頁授權的作用域為snsapi_base,則本步驟中取得到網頁授權access_token的同時,也取得到了openid,snsapi_base式的網頁授權流程即到此為止。
尤其註意:由於公眾號碼的secret和取得到的access_token安全等級都非常高,必須只保存在伺服器,不允許傳給客戶端。後續刷新access_token、透過access_token取得使用者資訊等步驟,也必須從伺服器發起。
請求方法
取得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 |
#回傳說明
正確時回傳的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有效期限為30天,當refresh_token失效之後,需要使用者重新授權。
請求方法
取得第二步驟的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
參數說明
參數 | 描述 |
---|
#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/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WtNHkSYY0 eavHiaiceqxibJxCfHe/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 | 只有在使用者將公眾號綁定到微信開放平台帳號後,才會出現該欄位。 |
錯誤時微信會回傳JSON封包如下(範例為openid無效):
{"errcode":40003,"errmsg":" invalid openid "}
#附:檢驗授權憑證(access_token)是否有效
#請求方法
##http:GET(請使用https協議) https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID
參數說明
參數 | 描述 |
---|
#access_token | 網頁授權接口呼叫憑證,注意:此access_token與基礎支援的access_token不同 |
#openid | 使用者的唯一識別 |
# #回傳說明
正確的JSON回傳結果:
{ "errcode":0,"errmsg":"ok"}
錯誤時的JSON回傳範例:######{ "errcode":40003,"errmsg":"invalid openid"}###################### ######################