簡介:redis
一、code。經過請求微信的一個接口獲取的,用於獲取微信access_token及openId的必要參數。每一個code只能使用一次,若是用戶5分鐘內未使用這個code,這個code會被清除。數據庫
二、openId。微信公衆號中,每個微信用戶對應一個微信公衆號,都有一個惟一的openId。作微信登陸的時候,能夠將這個openId做爲識別用戶的惟一標識。json
三、UnionId。若是用戶有公衆號及開放平臺帳號,而且這倆帳號是相互關聯的,每個用戶針對這些具備關聯關係的帳號又一個惟一的UnionId。也能夠做爲識別用戶的惟一標識。api
四、access_token。經過code獲取的,用於請求微信其餘接口的權限標識。如請求userInfo等。瀏覽器
五、SCOPE參數。scope參數能夠有多種類型。若是scope參數爲snsapi_base時,不會彈出受權頁面,開發者能夠直接獲取到code並作處理,可是開發者經過此code只能獲取到用戶的openId;若是scope參數爲snsapi_userInfo時,須要用戶點擊受權按鈕,開發者能夠獲取到用戶的頭像,暱稱,性別,所在地等信息(即使用戶未關注此公衆號)。這倆參數是微信公衆平臺(http://mp.weixin.qq.com)上的,要調用網頁受權,須要微信公衆號經過認證(微信認證,相信各位作微信平臺開發都有所瞭解,就不作介紹了)。若是用戶是在微信開放平臺中調用,還有一種參數類型snsapi_login。這個是用做微信掃碼登陸的。暫時還沒用到,以後用到的時候再作詳細說明。緩存
六、redirect_uri。請求code成功以後的回調地址(須要將這個地址作Unicode編碼以後拼接到參數中)。開發者須要在這個請求內部處理請求到的code。code請求成功以後,微信會將code做爲這個請求的參數拼接到連接中。若是回調地址中沒有參數,則請求code成功以後,微信請求的地址爲redirect_uri?code=*********&state=STATE;若是回調地址中有連接型的參數,則回調地址須要作處理,須要將回調地址中的連接參數的值作一次Unicode編碼。以後微信請求的地址爲redirect_uri?param=****&code=****&state=STATE。以下圖所示:微信
<img class="alignnone size-full wp-image-87" src="http://blog.yangjian.shop/wp-content/uploads/2017/08/15032843951.png" alt="" width="1093" height="23" />session
實戰:app
我的理解,因爲作微信登陸,是要用戶在全局都須要登陸狀態,若是開發中使用的是session登陸的話,若用戶長時間未進行操做,可能形成session斷開的狀況,因此在個人項目中,將微信登陸作到了全局。在全局去判斷session中有沒有用戶信息,若沒有則去請求,而後登陸。微信公衆平臺
一、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_uri,scope三個參數換成對應的本身公衆號的參數。
二、經過以上地址請求以後,能夠獲取到code,而後使用獲取到的code作其餘請求。如請求access_token。
access_token請求地址https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
這一步是要在後臺進行的,由於這個請求中包含一些私密信息,如secret。這裏須要將appId,secret,code換成對應的參數。並且,這些參數都爲必填參數,其中grant_type不須要作修改。
請求的返回值爲json格式的數據。
{ "access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE" }
access_token具備較短的有效期,爲2個小時。可是refresh_token有效期較長,爲30天。當access_token失效時,能夠經過refresh_token去從新獲取,當access_token未失效,能夠經過refresh_token刷新access_token。因此,這一步請求可使用如redis之類的緩存。將這一步請求到的數據放到緩存中,再次使用的時候,能夠直接獲取,而不須要再次從微信請求。此外,微信這個接口以前是有比較嚴格的限制的,可是如今這個接口限制比之前來講更人性化了,access_token每分鐘能夠請求1萬次。若是沒有特別大的訪問量的話(1分鐘1萬次,這個請求量,能夠說是特別大的公司纔會有的了吧,大公司的人也不會看我這文檔了估計),能夠不用放緩存,這個對於新手開發者來講,能夠省去一步。
若是錯誤時,返回值將會不一樣,如{"errcode":40029,"errmsg":"invalid code"} ,這個是code參數有誤時的返回。
三、刷新access_token(若是須要)
請求地址:https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=APPID&grant_type=refresh_token&refresh_token=REFRESH_TOKEN
{ "access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE" }
這個是刷新access_token的請求及返回結果。若是訪問量達不到以前說的量級,能夠先不作。
若是錯誤時,返回值將會不一樣,如{"errcode":40029,"errmsg":"invalid code"} ,這個是code參數有誤時的返回。
四、獲取用戶信息
請求地址
http:GET(請使用https協議) https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN
當第一步請求code時,SCOPE參數爲snsapi_userInfo,這裏才能調用這個接口去獲取用戶信息。
access_token及openid替換爲第二步中獲取的值,能夠請求到微信的一些基本信息。返回值以下:
{ "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"
}
其中,只有當前公衆平臺綁定到開發平臺是,纔會出現最後一個unionid字段,不然不會。
<img class="alignnone wp-image-89" src="http://blog.yangjian.shop/wp-content/uploads/2017/08/微信我的信息參數說明.png" alt="" width="755" height="368" />
當請求失敗時會有對應的提示,如當openid參數有問題時,會有以下提示:
{"errcode":40003,"errmsg":" invalid openid "}
五、獲取到這些信息以後還須要作什麼
當獲取到用戶我的信息的時候,還差登陸沒作呢,只是單純的獲取到了信息。接下來還須要作的事情是:
5.一、第一次獲取用戶信息時,將獲取到的微信信息做爲一條用戶數據插入到你的數據庫中,以後再調用這個請求時,能夠去查詢數據庫,有沒有此微信用戶對應的信息。
5.二、將查詢到的用戶信息,或者新插入的用戶信息,經過session或者token等其餘登陸方式,在瀏覽器和服務端之間創建鏈接。
5.三、有的開發者在作完微信登陸後還須要作手機綁定,若是沒有老用戶數據的話,直接在微信登陸以後作一個攔截就行了,去判斷這個用戶有沒有綁定手機號,若是沒有,在登陸以後直接跳轉到綁定頁面,若是綁定了則不做處理。
5.四、若是在微信登陸功能發佈以前,有一部分其餘方式註冊的老用戶,就須要作用戶合併了,若是沒有,那麼恭喜你,用戶合併是一個讓人頭大的東西,你成功的避開了一個坑,你的微信登陸已經搞完了。
這篇文檔,核心內容仍是微信官方的文檔,本身寫的內容不多,都是本身理解的內容,可是,若是你沒時間本身研究,徹底能夠參考,由於我就是這麼作的,並且也沒發現問題,至於老用戶合併的事,我也作了,暫時還沒發現有什麼比較嚴重的問題,由於我在網上沒有見過老用戶合併的文檔,說明那麼作的人並無不少,最好在用戶登陸的時候直接攔截去作綁定,別像咱們同樣,若是不綁定,就是微信用戶一套信息,手機用戶另外一套信息,完了用戶須要的時候又作綁定,很噁心的。等在運行一段時間,若是沒問題了,有時間我會再整理一篇文檔的。