Wechat login authorization(OAuth2.0)

一、前言

昨天小組開了個會,讓我今天實現一個微信網頁授權的功能,可以讓用戶在授權之後無需再次登錄既可進入用戶授權界面。在這之前我也從沒接觸過微信公衆號開發之類的,也不知道公衆號後臺是啥樣子的,自己所在的小組也沒有自己的認證公衆號,就在這種情況下用一天的實現微信網頁授權的功能。

二、準備工作

1.一個怎樣的項目

上面也說了我所在的小組沒有自己的認證公衆號(普通申請的公衆號是不會開放高級接口的)也就說自己申請的公衆號是無法實現這類功能的。還有一點是我們所要實現的這個微信網頁授權並不是針對某個公衆號的,而是可以讓任意公衆號可以綁定我們的程序,自己的公衆號並不需要實現微信網頁授權這個功能,就可以使用授權功能。

2.技術調研

瞭解了上面的需求,自然是針對所要用到的技術進行調研了,主要用到就是微信的一些接口,所以我們先到微信公衆平臺技術文檔查找我們需要的資料。主要如下

 
UserAppAuthSerHello, I want authorization。Are you sure?Yes, give me authority!Callback, return code.Request, access_token.return access_token.UserAppAuthSer

1.回調域名

看來上面的示意圖我們知道,這個回調域名是在給我們請求網頁授權返回code的時候用的。所以開發者需要先到公衆平臺官網中的“開發 - 接口權限 - 網頁服務 - 網頁帳號 - 網頁授權獲取用戶基本信息”的配置選項中,修改授權回調域名。

請注意,這裏填寫的是域名(是一個字符串),而不是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.comhttp://qq.com無法進行OAuth2.0鑑權

2.獲取授權

在這裏官方提供了兩種授權方式"snsapi_base"和"snsapi_userinfo",他們都可以獲取用戶基本信息,但是既然提供兩種方式肯定有不一樣的地方。下面就介紹一下

  • 相同點:都可以獲取用戶的基本信息
  • 不同點:"snsapi_userinfo"發起的網頁授權,需要用戶手動同意纔可以繼續(如果用戶已關注公衆號則爲靜默模式,像snsapi_base一樣不會彈出提示),而"snsapi_base"授權不需要,比前者少了①②兩步;"snsapi_userinfo"授權獲取用戶基本信息不需要關注,而"snsapi_base"授權需要關注纔可獲取到

注意:上面有一個加粗標識的地方,因爲我在這裏在了一個跟頭。下面爲"snsapi_base"未關注公衆號時返回的錯誤提示信息。

{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: Ftu8IA0999s106 ]"}

第一步:獲取code

https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 

參數說明

參數是否必須說明
appid 公衆號的唯一標識
redirect_url 授權後重定向的回調鏈接地址,請使用urlEncode對鏈接進行處理
response_type 返回類型,請填寫code
scope 應用授權作用域,snsapi_base (不彈出授權頁面,直接跳轉,只能獲取用戶openid),snsapi_userinfo (彈出授權頁面,可通過openid拿到暱稱、性別、所在地。並且,即使在未關注的情況下,只要用戶授權,也能獲取其信息)
state 重定向後會帶上state參數,開發者可以填寫a-zA-Z0-9的參數值,最多128字節
#wechat_redirect 無論直接打開還是做頁面302重定向時候,必須帶此參數

下圖爲scope等於snsapi_userinfo時的授權頁面:

image

如果用戶同意授權,頁面將跳轉至 redirect_uri/?code=CODE&state=STATE。

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

第二步:通過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參數
scope 填寫爲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"} 

第三步:拉取用戶信息

如果網頁授權作用域爲snsapi_userinfo,則此時開發者可以通過access_token和openid拉取用戶信息了。如果網頁授權作用域爲snsapi_base需要關注後才能拉取用戶信息

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/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 只有在用戶將公衆號綁定到微信開放平臺帳號後,纔會出現該字段。

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

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

附錄

另外還有"刷新access_token"、"檢驗授權憑證(access_token)"接口這裏就不作說明了,需要了解的可以去查閱官方文檔

3.開發

上面我們已經了大概的流程了,自己有認證公衆號的人自己就可以嘗試開發了,我這邊沒有公衆號所以是從隔壁組借來的一個“appid”然後從他們那兒代理再跳到我這邊。什麼意思呢?就是回調域名調用的是他們那邊的接口,同時我也把自己這邊寫的一個接口(用來接收OpenId和access_token)帶過去,等他那邊獲取到OpenId和access_token在通過剛纔傳的那個接口返回給我。這樣我這邊就得到OpenId和access_token了,我也在這邊獲取用戶基本信息了。

三、常見問題

1.獲取不到用戶信息 答:你看你是用的是"snsapi_base"方式授權還是"snsapi_userinfo"方式授權,前者需要關注才能獲取到用戶信息,而後者無需關注也可以獲取;也有可能是access_token過期導致獲取失敗,具體根據返回提示信息判斷。

2.關於代理的問題 答:所謂的代理就是回調域名調用的是他們那邊的接口,同時我也把自己這邊寫的一個接口(用來接收OpenId和access_token)帶過去,等他那邊獲取到OpenId和access_token在通過剛纔傳的那個接口返回給我。這樣我這邊就得到OpenId和access_token了,我也在這邊獲取用戶基本信息了。

3.微信有緩存怎麼辦 答:瀏覽器都有緩存,但是微信清理起來挺麻煩的,我們該怎麼解決這類問題?這個和PC中處理的方式一樣可以使用時間戳,或者加版本號,通過版本號判斷文件是重新拉取還是從緩存中獲取

4.兩種授權方式有什麼不同 答:"snsapi_userinfo"發起的網頁授權,需要用戶手動同意纔可以繼續(如果用戶已關注公衆號則爲靜默模式,像snsapi_base一樣不會彈出提示),而"snsapi_base"授權不需要;"snsapi_userinfo"授權獲取用戶基本信息不需要關注,而"snsapi_base"授權需要關注纔可獲取到

上面大概就是我實現"微信網頁授權"功能的大致流程,歡迎大家探討指點。

參考:微信公衆平臺技術文檔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章