微信公衆號開發中,獲取用戶資料的兩種方式

微信公衆號的開發主要是在服務號環境下進行,訂閱號是拿不到用戶的資料的,所以,下文的討論都基於微信服務號。html

微信公衆號的兩個access_token

在微信的開發文檔中,存在兩個access_token,須要對它們加以區別。爲了區分這兩個token,我把它們從新命名爲core_token和user_token。數據庫

core_token就是微信公衆號本身的access token,是你擁有的微信公衆號做爲衆多公衆號中的一個,向微信服務器申請的惟一憑證。這個token只須要你使用公衆號的appid和appsceret就能夠拿到了,文檔在這裏。可是注意,這個token的有效期只有7200秒,也就是說,微信會認爲你不多用到這個token,並且它的安全級別也比較高,因此有效期比較短,天天可以申請該token的次數也被限制了。固然,微信也作了建議,若是你確實須要常用,那麼在你的服務器上面保存它,這樣避免反覆的調用上面那篇文檔裏面的接口,消耗掉你的接口請求次數。可是有效期怎麼辦呢?在你的服務器上面跑一個定時任務,每隔一段時間就去檢查一下這個token產生的時間與當前時間的差值,若是小於7200秒,說明還在有效期範圍內,還能夠繼續使用,不然,就去申請一個新的替換掉老的。api

core_token具體都有哪些用呢?好比建立自定義菜單接口、客服消息接口、素材管理等等。這裏面還包括用戶管理接口,這裏先不表,它和咱們下面所提到的用戶接口有區別。總之,core_token是做爲一個獨立的公衆號(把它當作一個用戶)向微信進行操做,上傳、修改、刪除屬於公衆號本身的內容的憑證。瀏覽器

user_token就是用戶本身的access token。公衆號和用戶是兩種不一樣的對象,若是在沒有core_token的狀況下,開發過微博、QQ等開放平臺的開發者應該都能理解這個access token的做用。也就是說,你拿到了這個token,那麼你就能夠操做用戶,好比在微博開放平臺,能夠用這個token在微博幫助用戶發微博、關注好友、刪除好友等等。而在微信裏面,這個access token僅能實現獲取用戶相關信息,並且其實它不屬於公衆號的範疇,而是屬於網頁受權Oauth2.0的範疇。也就是說,這個token不須要用戶關注公衆號,也能夠經過Oauth2.0受權後獲取(須要點擊一個受權按鈕)。它其實跟微信公衆號一點關係都扯不上。安全

知道了這個關係,咱們就能夠知道,在微信裏面要獲取用戶的暱稱等信息,有兩種途徑,一種是依靠core_token,一種是依靠user_token,到底應該用哪種呢?服務器

使用公衆號的access_token獲取用戶信息

若是你要求你的用戶必須關注公衆號(服務號)才能使用你提供的功能,那請選擇這種方式。並且這種方式能夠實現用戶無需點擊受權按鈕,只須要通過幾個跳轉,就能夠安靜的進入你的系統。固然,缺點就是access token的每日獲取次數有上限,沒有安排好的小白開發者會致使這個access token獲取次數用光。微信

好了,接下來咱們進入開發階段。如今你並不知道你的用戶是否已經關注了你的公衆號,你在你的網頁上放置了一個按鈕,用於登陸網站,你但願實現以下邏輯:app

if(用戶關注了你的公衆號,並且以前用公衆號登陸過你的系統) 直接登陸;else if(用戶關注了你的公衆號,可是並無在你的系統中註冊成爲用戶) 用戶登陸,同時自動爲他建立用戶信息;else if(用戶沒有關注你的公衆號) 要求用戶必須關注;網站

1. 獲取access token(core token)

首先,你須要獲取core token,而且保存在服務器上面,注意,其實不少信息都須要保存在服務器上面,並且不能被任何用戶本身擁有。可以公開的信息僅包括:APPID, openid。經過下面這個接口就能夠拿到core token:url

https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

只須要替換藍色字爲你本身的公衆號的私有信息。在結果中就能夠看到你須要的token信息了,注意只有7200秒的有效期。

2. 拿到openid

把你的頁面中的登陸按鈕連接直接設置爲:

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

固然,你須要把上面藍色的字改成你本身的信息。注意,URL必須是在網頁受權的地方填寫的域名下的地址。這在我前面的一篇文章講過了。這個連接的做用是什麼呢?是進入網頁受權的環節。等一下,我前面不是說了只有user token纔跟受權有關係啊,如今咱們討論的是core token,怎麼又跟受權扯上關係了?騷年,你不要急。在微信全部的接口中,只有這個接口能夠實如今你的網頁中點擊一個連接而得到openid,只有拿到了openid才能拿到用戶的信息。另外一種拿到openid的方法,是用戶在微信公衆號裏面,向你發消息,可是這個時候你無法在網頁裏面用啊。

不過可憐的是,上面這個連接並不能直接拿到openid,而拿到的是一個code,並且是在網頁跳轉過程當中,經過url參數的形式返回。

拿到這個code以後,再請求下面這個接口,才能拿到openid:

https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code

把上面這個URL中的藍色字替換,其中CODE就是上面那個接口拿到的code。這個時候,才能成功拿到openid。

3. 判斷用戶是否關注公衆號

接下來就是利用上面拿到的access token和openid作事情的時候了。首先來判斷用戶是否關注公衆號,經過下面這個接口:

https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

藍色字就是咱們前兩步拿到的信息,經過這個接口的結果中的subscribe字段,就能夠判斷用戶是否已經關注了公衆號。若是用沒有關注,那麼該字段掉值爲0,關注過了則爲1.

4. 獲取用戶的信息

咱們不須要再去請求另外的接口,在第3步的結果中,若是subscribe字段的值爲1,那麼用戶的其它信息會同時顯示出來。拿到用戶信息了怎麼辦呢?去你的數據庫去查詢咯,用openid做爲該用戶對應的微信信息的字段去查,若是數據庫裏面有這個用戶,說明以前登陸過了,若是沒有,那註冊一個新用戶吧。

如今,讓這個登陸,而且用用戶的暱稱做爲系統內的暱稱吧。

使用Oauth2.0受權的access_token獲取用戶信息

另一種狀況是,你不須要用戶關注你的微信公衆號,甚至,你根本沒有公衆號,而只須要用戶使用微信登陸你的系統。若是你沒有公衆號,你必須去微信開放平臺註冊一個應用。從這個角度講,一個微信公衆號其實就是一個應用。一旦你有了一個應用以後,就能夠像在開發微博登陸網站同樣,實現一個微信登陸網站的功能。固然,由於微信只有手機端才能受權,所以受權形式上比以往的PC網頁受權又稍微複雜一點。不過本文講述的,都是假設用戶在微信瀏覽器中進行登陸的操做,而不是PC網頁端。

1. 拿到openid和access_token

和上一節的方法如出一轍。並且,其實上一節原本就是用了受權方法拿到的code。可是有一點不同,上一節的方法中,你發現整個頁面沒有任何中止,頁面跳轉了幾下就完成了。如今,你必需要求用戶點擊一個微信官方的受權按鈕,就像微博、QQ登陸網站同樣,要求用戶去一個官方受權頁面進行受權。

因此,在獲取openid的第一步的scope參數和上一節不同:

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

其它的就真的是如出一轍的。受權完,經過code得到的結果中,同時包含了openid和access_token(user token),還有一個refresh_token,這個咱們不講,請閱讀前面一篇《微信服務號用戶受權接口》。

2.獲取用戶信息

咱們立刻就能夠進入獲取用戶信息的步驟,上一步咱們已經拿到了openid和access token,訪問下面這個接口:

https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

這樣就拿到了用戶的暱稱和頭像信息。後面的操做也都和上面的同樣咯。

總結

這是目前微信提供的兩種能夠獲取微信用戶信息的方式,只有這兩種,其實咱們的主要考慮的問題在於:到底應該用哪一種方式?其實在前面的闡述中已經提到過了。

若是你要求你的用戶必須關注你的微信公衆號,那麼只能使用第一種方法。這裏面有一個地方能夠節省時間。在微信中開啓開發者模式後,當用戶關注、向公衆號發消息、取消關注時,微信服務器都會發一條消息到你指定的服務器上面。而在用戶關注你的那一刻,你能夠得到該用戶的openid,同時,你能夠本身去拿到core token,因此,在用戶關注你的那一刻,你就能夠先在系統中註冊好這個用戶。當他登陸的時候,就無需再去判斷是否已經註冊過。

Oauth2.0受權這一塊,微信和微博、QQ有很大的區別。用戶受權後,第三方只能獲取用戶的信息,而不能對用戶進行任何操做(好比在用戶的朋友圈兒發消息),所以實際上這個受權沒多大用處,因此微信裏面也沒有任何一個地方可讓用戶去取消受權。

不過微信公衆號的第三方卻比較危險。什麼是微信公衆號第三方平臺呢?就是你把core token交給第三方平臺,讓第三方平臺能夠操做你的公衆號,甚至給關注公衆號的用戶發推送消息(須要管理員刷二維碼)。可是core token只有7200秒的有效期怎麼辦?因此,你必須把APPID和APPSECRET都託管在第三方平臺上,這樣第三方平臺能夠保持一直鏈接你的微信公衆號。固然,第三方平臺有些功能比較好,好比可視化的統計等功能。

相關文章
相關標籤/搜索