微信網(wǎng)頁授權(quán)

2018-10-09 10:59 更新

微信網(wǎng)頁授權(quán)

微信網(wǎng)頁授權(quán)

如果用戶在微信客戶端中訪問第三方網(wǎng)頁,公眾號可以通過微信網(wǎng)頁授權(quán)機制,來獲取用戶基本信息,進而實現(xiàn)業(yè)務(wù)邏輯。

關(guān)于網(wǎng)頁授權(quán)回調(diào)域名的說明

1、在微信公眾號請求用戶網(wǎng)頁授權(quán)之前,開發(fā)者需要先到公眾平臺官網(wǎng)中的“開發(fā) - 接口權(quán)限 - 網(wǎng)頁服務(wù) - 網(wǎng)頁帳號 - 網(wǎng)頁授權(quán)獲取用戶基本信息”的配置選項中,修改授權(quán)回調(diào)域名。請注意,這里填寫的是域名(是一個字符串),而不是URL,因此請勿加 http:// 等協(xié)議頭; 

2、授權(quán)回調(diào)域名配置規(guī)范為全域名,比如需要網(wǎng)頁授權(quán)的域名為:www.qq.com,配置以后此域名下面的頁面http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以進行OAuth2.0鑒權(quán)。但http://pay.qq.com 、 http://music.qq.com 、 http://qq.com無法進行OAuth2.0鑒權(quán) 

3、如果公眾號登錄授權(quán)給了第三方開發(fā)者來進行管理,則不必做任何設(shè)置,由第三方代替公眾號實現(xiàn)網(wǎng)頁授權(quán)即可 

關(guān)于網(wǎng)頁授權(quán)的兩種scope的區(qū)別說明

1、以snsapi_base為scope發(fā)起的網(wǎng)頁授權(quán),是用來獲取進入頁面的用戶的openid的,并且是靜默授權(quán)并自動跳轉(zhuǎn)到回調(diào)頁的。用戶感知的就是直接進入了回調(diào)頁(往往是業(yè)務(wù)頁面)

2、以snsapi_userinfo為scope發(fā)起的網(wǎng)頁授權(quán),是用來獲取用戶的基本信息的。但這種授權(quán)需要用戶手動同意,并且由于用戶同意過,所以無須關(guān)注,就可在授權(quán)后獲取該用戶的基本信息。 

3、用戶管理類接口中的“獲取用戶基本信息接口”,是在用戶和公眾號產(chǎn)生消息交互或關(guān)注后事件推送后,才能根據(jù)用戶OpenID來獲取用戶基本信息。這個接口,包括其他微信接口,都是需要該用戶(即openid)關(guān)注了公眾號后,才能調(diào)用成功的。 

關(guān)于網(wǎng)頁授權(quán)access_token和普通access_token的區(qū)別

1、微信網(wǎng)頁授權(quán)是通過OAuth2.0機制實現(xiàn)的,在用戶授權(quán)給公眾號后,公眾號可以獲取到一個網(wǎng)頁授權(quán)特有的接口調(diào)用憑證(網(wǎng)頁授權(quán)access_token),通過網(wǎng)頁授權(quán)access_token可以進行授權(quán)后接口調(diào)用,如獲取用戶基本信息; 

2、其他微信接口,需要通過基礎(chǔ)支持中的“獲取access_token”接口來獲取到的普通access_token調(diào)用。 

關(guān)于UnionID機制

1、請注意,網(wǎng)頁授權(quán)獲取用戶基本信息也遵循UnionID機制。即如果開發(fā)者有在多個公眾號,或在公眾號、移動應(yīng)用之間統(tǒng)一用戶帳號的需求,需要前往微信開放平臺(open.weixin.qq.com)綁定公眾號后,才可利用UnionID機制來滿足上述需求。 

2、UnionID機制的作用說明:如果開發(fā)者擁有多個移動應(yīng)用、網(wǎng)站應(yīng)用和公眾帳號,可通過獲取用戶基本信息中的unionid來區(qū)分用戶的唯一性,因為同一用戶,對同一個微信開放平臺下的不同應(yīng)用(移動應(yīng)用、網(wǎng)站應(yīng)用和公眾帳號),unionid是相同的。 

關(guān)于特殊場景下的靜默授權(quán)

1、上面已經(jīng)提到,對于以snsapi_base為scope的網(wǎng)頁授權(quán),就靜默授權(quán)的,用戶無感知; 

2、對于已關(guān)注公眾號的用戶,如果用戶從公眾號的會話或者自定義菜單進入本公眾號的網(wǎng)頁授權(quán)頁,即使是scope為snsapi_userinfo,也是靜默授權(quán),用戶無感知。 

具體而言,網(wǎng)頁授權(quán)流程分為四步:

1、引導(dǎo)用戶進入授權(quán)頁面同意授權(quán),獲取code 

2、通過code換取網(wǎng)頁授權(quán)access_token(與基礎(chǔ)支持中的access_token不同) 

3、如果需要,開發(fā)者可以刷新網(wǎng)頁授權(quán)access_token,避免過期 

4、通過網(wǎng)頁授權(quán)access_token和openid獲取用戶基本信息(支持UnionID機制) 


第一步:用戶同意授權(quán),獲取code

在確保微信公眾賬號擁有授權(quán)作用域(scope參數(shù))的權(quán)限的前提下(服務(wù)號獲得高級接口后,默認擁有scope參數(shù)中的snsapi_base和snsapi_userinfo),引導(dǎo)關(guān)注者打開如下頁面:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 若提示“該鏈接無法訪問”,請檢查參數(shù)是否填寫錯誤,是否擁有scope參數(shù)對應(yīng)的授權(quán)作用域權(quán)限。 

尤其注意:由于授權(quán)操作安全等級較高,所以在發(fā)起授權(quán)請求時,微信會對授權(quán)鏈接做正則強匹配校驗,如果鏈接的參數(shù)順序不對,授權(quán)頁面將無法正常訪問

參考鏈接(請在微信客戶端中打開此鏈接體驗) scope為snsapi_base https://open.weixin.qq.com/connect/oauth2/authorize?appid=wx520c15f417810387&redirect_uri=https%3A%2F%2Fchong.qq.com%2Fphp%2Findex.php%3Fd%3D%26c%3DwxAdap

ter%26m%3DmobileDeal%26showwxpaytitle%3D1%26vb2ctag%3D4_2030_5_1194_60&response_type=code&scope=snsapi_bas

e&state=123#wechat_redirect Scope為snsapi_userinfo https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxf0e81c3bee622d60&redirect_uri=http%3A%2F%2Fnba.bluewebgame.com%2Foauth_response.php&response_type=

code&scope=snsapi_userinfo&state=STATE#wechat_redirect 

尤其注意:跳轉(zhuǎn)回調(diào)redirect_uri,應(yīng)當(dāng)使用https鏈接來確保授權(quán)code的安全性。

參數(shù)說明

參數(shù)是否必須說明
appid公眾號的唯一標(biāo)識
redirect_uri授權(quán)后重定向的回調(diào)鏈接地址,請使用urlencode對鏈接進行處理
response_type返回類型,請?zhí)顚慶ode
scope應(yīng)用授權(quán)作用域,snsapi_base (不彈出授權(quán)頁面,直接跳轉(zhuǎn),只能獲取用戶openid),snsapi_userinfo (彈出授權(quán)頁面,可通過openid拿到昵稱、性別、所在地。并且,即使在未關(guān)注的情況下,只要用戶授權(quán),也能獲取其信息
state重定向后會帶上state參數(shù),開發(fā)者可以填寫a-zA-Z0-9的參數(shù)值,最多128字節(jié)
#wechat_redirect無論直接打開還是做頁面302重定向時候,必須帶此參數(shù)

下圖為scope等于snsapi_userinfo時的授權(quán)頁面:

用戶同意授權(quán)后

如果用戶同意授權(quán),頁面將跳轉(zhuǎn)至 redirect_uri/?code=CODE&state=STATE。

code說明 : code作為換取access_token的票據(jù),每次用戶授權(quán)帶上的code將不一樣,code只能使用一次,5分鐘未被使用自動過期。 

第二步:通過code換取網(wǎng)頁授權(quán)access_token

首先請注意,這里通過code換取的是一個特殊的網(wǎng)頁授權(quán)access_token,與基礎(chǔ)支持中的access_token(該access_token用于調(diào)用其他接口)不同。公眾號可通過下述接口來獲取網(wǎng)頁授權(quán)access_token。如果網(wǎng)頁授權(quán)的作用域為snsapi_base,則本步驟中獲取到網(wǎng)頁授權(quán)access_token的同時,也獲取到了openid,snsapi_base式的網(wǎng)頁授權(quán)流程即到此為止。

尤其注意:由于公眾號的secret和獲取到的access_token安全級別都非常高,必須只保存在服務(wù)器,不允許傳給客戶端。后續(xù)刷新access_token、通過access_token獲取用戶信息等步驟,也必須從服務(wù)器發(fā)起。

請求方法

獲取code后,請求以下鏈接獲取access_token:  https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code 

參數(shù)說明

參數(shù)是否必須說明
appid公眾號的唯一標(biāo)識
secret公眾號的appsecret
code填寫第一步獲取的code參數(shù)
grant_type填寫為authorization_code   

返回說明

正確時返回的JSON數(shù)據(jù)包如下:

{ "access_token":"ACCESS_TOKEN",    

 "expires_in":7200,    

 "refresh_token":"REFRESH_TOKEN",    

 "openid":"OPENID",    

 "scope":"SCOPE" } 

參數(shù)描述
access_token網(wǎng)頁授權(quán)接口調(diào)用憑證,注意:此access_token與基礎(chǔ)支持的access_token不同
expires_inaccess_token接口調(diào)用憑證超時時間,單位(秒)
refresh_token用戶刷新access_token
openid用戶唯一標(biāo)識,請注意,在未關(guān)注公眾號時,用戶訪問公眾號的網(wǎng)頁,也會產(chǎn)生一個用戶和公眾號唯一的OpenID
scope用戶授權(quán)的作用域,使用逗號(,)分隔

錯誤時微信會返回JSON數(shù)據(jù)包如下(示例為Code無效錯誤):

{"errcode":40029,"errmsg":"invalid code"} 

第三步:刷新access_token(如果需要)

由于access_token擁有較短的有效期,當(dāng)access_token超時后,可以使用refresh_token進行刷新,refresh_token有效期為30天,當(dāng)refresh_token失效之后,需要用戶重新授權(quán)。

請求方法

獲取第二步的refresh_token后,請求以下鏈接獲取access_token:  

https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN


參數(shù)是否必須說明
appid公眾號的唯一標(biāo)識
grant_type填寫為refresh_token
refresh_token填寫通過access_token獲取到的refresh_token參數(shù)  

返回說明

正確時返回的JSON數(shù)據(jù)包如下:

{ "access_token":"ACCESS_TOKEN",  

 "expires_in":7200,   

 "refresh_token":"REFRESH_TOKEN",   

 "openid":"OPENID",   

 "scope":"SCOPE" } 

參數(shù)描述
access_token網(wǎng)頁授權(quán)接口調(diào)用憑證,注意:此access_token與基礎(chǔ)支持的access_token不同
expires_inaccess_token接口調(diào)用憑證超時時間,單位(秒)
refresh_token用戶刷新access_token
openid用戶唯一標(biāo)識
scope用戶授權(quán)的作用域,使用逗號(,)分隔

錯誤時微信會返回JSON數(shù)據(jù)包如下(示例為code無效錯誤):

{"errcode":40029,"errmsg":"invalid code"} 

第四步:拉取用戶信息(需scope為 snsapi_userinfo)

如果網(wǎng)頁授權(quán)作用域為snsapi_userinfo,則此時開發(fā)者可以通過access_token和openid拉取用戶信息了。

請求方法

http:GET(請使用https協(xié)議) https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN 

參數(shù)說明

參數(shù)描述
access_token網(wǎng)頁授權(quán)接口調(diào)用憑證,注意:此access_token與基礎(chǔ)支持的access_token不同
openid用戶的唯一標(biāo)識
lang返回國家地區(qū)語言版本,zh_CN 簡體,zh_TW 繁體,en 英語

返回說明

正確時返回的JSON數(shù)據(jù)包如下:

{    "openid":" OPENID",  

 " nickname": NICKNAME,   

 "sex":"1",   

 "province":"PROVINCE"   

 "city":"CITY",   

 "country":"COUNTRY",    

 "headimgurl":    "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ

4eMsv84eavHiaiceqxibJxCfHe/46",  

"privilege":[ "PRIVILEGE1" "PRIVILEGE2"     ],    

 "unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL" 

參數(shù)描述
openid用戶的唯一標(biāo)識
nickname用戶昵稱
sex用戶的性別,值為1時是男性,值為2時是女性,值為0時是未知
province用戶個人資料填寫的省份
city普通用戶個人資料填寫的城市
country國家,如中國為CN
headimgurl用戶頭像,最后一個數(shù)值代表正方形頭像大小(有0、46、64、96、132數(shù)值可選,0代表640*640正方形頭像),用戶沒有頭像時該項為空。若用戶更換頭像,原有頭像URL將失效。
privilege用戶特權(quán)信息,json 數(shù)組,如微信沃卡用戶為(chinaunicom)
unionid只有在用戶將公眾號綁定到微信開放平臺帳號后,才會出現(xiàn)該字段。

錯誤時微信會返回JSON數(shù)據(jù)包如下(示例為openid無效):

{"errcode":40003,"errmsg":" invalid openid "} 

附:檢驗授權(quán)憑證(access_token)是否有效

請求方法

http:GET(請使用https協(xié)議) https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID 

參數(shù)說明

參數(shù)描述
access_token網(wǎng)頁授權(quán)接口調(diào)用憑證,注意:此access_token與基礎(chǔ)支持的access_token不同
openid用戶的唯一標(biāo)識    

返回說明

正確的JSON返回結(jié)果:

{ "errcode":0,"errmsg":"ok"} 

錯誤時的JSON返回示例:

{ "errcode":40003,"errmsg":"invalid openid"}



以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號