準備工作
配置網(wǎng)頁授權獲取用戶基本信息敌厘,用于告訴微信發(fā)起授權的后端服務器地址
正式公眾號:在微信公眾號請求用戶網(wǎng)頁授權之前萝衩,開發(fā)者需要先到公眾平臺官網(wǎng)中的“開發(fā) - 接口權限 - 網(wǎng)頁服務 - 網(wǎng)頁帳號 - 網(wǎng)頁授權獲取用戶基本信息”進行配置操作剖踊;
測試沙箱環(huán)境:在 測試環(huán)境 中脸秽,進行配置網(wǎng)頁授權(https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index)∧慊可配置端口號用于本地調(diào)試抵碟。?注:勿加 http:// 等協(xié)議頭!
本次業(yè)務我們配置的是前端登錄頁面坏匪,沙箱中內(nèi)配置的網(wǎng)頁授權域名為本地https起的服務器域名(test.c3data.com.cn:3000)
授權說明
微信授權時拟逮,分為snsapi_base和snsapi_userinfo兩種授權方式。本次我們的需求第一種snsapi_base即可滿足适滓。
1敦迄、snsapi_base: 用來獲取進入頁面的用戶的 openid 的,并且是靜默授權并自動跳轉(zhuǎn)到回調(diào)頁的凭迹。用戶感知的就是直接進入了回調(diào)頁(往往是業(yè)務頁面罚屋,不會有對于的認為操作);
2嗅绸、snsapi_userinfo: 是用來獲取用戶的基本信息的脾猛。但這種授權需要用戶手動同意,并且由于用戶同意過鱼鸠,所以無須關注猛拴,就可在授權后獲取該用戶的基本信息。
網(wǎng)頁授權流程:
1蚀狰、引導用戶進入授權頁面同意授權愉昆,獲取code
2、通過 code 換取網(wǎng)頁授權access_token(與基礎支持中的access_token不同)和openid
3麻蹋、通過網(wǎng)頁授權access_token和 openid 獲取用戶基本信息(支持 UnionID 機制)
網(wǎng)頁授權詳細流程:
1.在用戶從公眾號進入系統(tǒng)的時候跛溉,引導關注者打開如下頁面,獲取code:
由于授權操作安全等級較高扮授,所以在發(fā)起授權請求時芳室,微信會對授權鏈接做正則強匹配校驗,如果鏈接的參數(shù)順序不對刹勃,授權頁面將無法正常訪問渤愁;鏈接屬性如下:
用戶同意授權后,頁面將跳轉(zhuǎn)至 redirect_uri/?code=CODE&state=STATE
1深夯、code作為換取access_token的票據(jù)抖格,每次用戶授權帶上的code將不一樣,code只能使用一次咕晋,5分鐘未被使用自動過期雹拄。
2、微信重定向回調(diào)地址掌呜,一定要在微信公眾號平臺進行配置滓玖,為后端接口地址。(本次業(yè)務我們配置的是前端登錄頁面质蕉,沙箱中內(nèi)配置的網(wǎng)頁授權域名為本地https起的服務器域名(test.c3data.com.cn:3000))势篡。
2.通過code換取網(wǎng)頁授權access_token(后端進行)
首先請注意翩肌,這里通過code換取的是一個特殊的網(wǎng)頁授權access_token,與基礎支持中的access_token(該access_token用于調(diào)用其他接口)不同。公眾號可通過下述接口來獲取網(wǎng)頁授權access_token禁悠。如果網(wǎng)頁授權的作用域為snsapi_base念祭,則本步驟中獲取到網(wǎng)頁授權access_token的同時,也獲取到了openid碍侦,snsapi_base式的網(wǎng)頁授權流程即到此為止粱坤。
尤其注意:由于公眾號的secret和獲取到的access_token安全級別都非常高,必須只保存在服務器瓷产,不允許傳給客戶端站玄。后續(xù)刷新access_token、通過access_token獲取用戶信息等步驟濒旦,也必須從服務器發(fā)起株旷。
獲取code后,請求以下鏈接(該接口就是第一步中定義的redirect_uri值尔邓,即后端接口地址灾常,微信重定向時會進行調(diào)用)獲取access_token:
獲取code后會攜帶code參數(shù)自動重定向到登錄頁面,此時用code請求后端接口铃拇,后端用code換取用戶的openid钞瀑,并返回至前端。
注意:測試環(huán)境和正式環(huán)境的appId和appSecret是不同的慷荔,前后端的測試及正式環(huán)境需要配置一致雕什,才能拿到微信用戶信息。(前端在測試環(huán)境拿到code傳給后端显晶,后端只能在appId和secret為測試的配置中換取openId贷岸,否則會報錯)