<p>
1.瀏覽器js 請(qǐng)求java的islogin 接口
2.java 從session 中獲取當(dāng)前用戶
3.能獲取到說明已經(jīng)登錄
4.不能獲取到說明沒有登陸
5.返回一個(gè)result
6.resuel.code == 200 是已經(jīng)登錄
7.result.code == 400 是沒有登錄
8.已經(jīng)登錄的就不說了,說下沒有登陸情況
9.瀏覽器js根據(jù)result.code == 400 判斷沒有登錄
10.在瀏覽器端進(jìn)行跳轉(zhuǎn) window.location.href = result.redirect_url
11.result.redirect-url 是微信的接口伟叛,如下
-
https://open.weixin.qq.com/connect/oauth2/authorize?appid=wxb3549eaaee11457a&redirect_uri=http://jiezhao.xtake.cn/weixin/login&response_type=code&scope=snsapi_base&state=snsapi_base|http://localhost:3000/dev/index.html#wechat_redirect
13.瀏覽器js直接進(jìn)行跳轉(zhuǎn)了 get請(qǐng)求
14.這里請(qǐng)求的是微信的服務(wù)器 response_type告訴微信我現(xiàn)在是想要code
15.微信知道了之后私痹,進(jìn)行一系列判斷,就能在 12 那個(gè)頁面上進(jìn)行再次跳轉(zhuǎn)统刮,你可以理解成這樣:
16.你get請(qǐng)求 12 的地址后紊遵,微信的控制層 拿到你傳進(jìn)來的幾個(gè)參數(shù),appid 是認(rèn)證過的侥蒙,好了 那就沒問題了暗膜,微信服務(wù)器生成一個(gè)隨機(jī)的code,然后把這個(gè)code 和請(qǐng)求傳過來的redirect_url,state 原封不動(dòng)的一并傳到了返回的頁面上辉哥,頁面上的js無論通過什么樣的形式都能獲取到剛剛傳過來的生成的code和redirect_url以及state桦山,這樣一來js 就能在這個(gè)頁面上直接進(jìn)行window.location.href = 傳過來的redirect_url?code=[傳過來的code]&state=[傳過來的state]
17.到這里就簡(jiǎn)單了,因?yàn)閞edirect_url 和state 是原封不動(dòng)的傳過來的醋旦,所以到現(xiàn)在的請(qǐng)求連接就是我們自己網(wǎng)站了恒水。并且?guī)е鴧?shù) code state
18.我們自己的服務(wù)器要針對(duì)redirect_url 寫響應(yīng)的controller
19.比如我們這里的連接是 jiezhao.xtake.cn/weixin/login?code=xxxx&state=xxxxx
20.這個(gè)時(shí)候就進(jìn)入到我們的業(yè)務(wù)層的了
21我們?cè)赾ontroller 中能根據(jù)code 獲取access_token,是在controller中通過httpClient 請(qǐng)求如下連接完成的:(注意是在controller層請(qǐng)求的)
22.https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
23.上面的這個(gè)請(qǐng)求中填上自己的appid,sectrt 以及controller傳過來的CODE,就能獲取到access_token
24.這是正確時(shí)返回的數(shù)據(jù)json
25.{ "access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE" }
26.里面有access_token ,有效時(shí)長(zhǎng)饲齐,refresh_token(用來刷新token),還有一個(gè)很重要的openid ,這個(gè)openid 就是當(dāng)前微信用戶的唯一標(biāo)識(shí)啊钉凌,這也從一定程度上說明access_token 是面向單一用戶的。這個(gè)基礎(chǔ)的access_token有這本質(zhì)的區(qū)別捂人,真實(shí)坑爹啊御雕。scope 是snsapi_base 或者 snspai_userinfo
27.有了access_token 和用戶的openid 就能真正的進(jìn)入業(yè)務(wù)層。
==========================華麗分割線===========================
28.我們簡(jiǎn)稱25 中的json包是access_token對(duì)象
29.先是檢驗(yàn)了access_token 是否還有效滥搭,無效的話能通過對(duì)象中的refresh_token 進(jìn)行刷新酸纲,從而獲取最新的 access_token
30.查看scope的類型是 snsapi_base 還是 snsapi_userinfo
31.以下我用偽代碼描述
accessToken = 通過code獲取accessToken(code)
if(accessToken is 失效) {
重新獲取AccessToken
}
if (accessToken 的scope 是 snspai_base) {
openid = accessToken.getopenid()
業(yè)務(wù)user = userservice.getUserBy(openid)
if(業(yè)務(wù)user == null) {
//說明該微信用戶在我們的業(yè)務(wù)系統(tǒng)中并不存在,我們想不他直接存進(jìn)來
//想要存起來 我們不想僅僅知道openid 還想知道用戶頭像以及更詳細(xì)的信息瑟匆。
//這時(shí)候snspai_base 的scope 已經(jīng)不夠用了闽坡,需要能提供更詳細(xì)信息的 . //nsapi_userinfo scope
//然后。構(gòu)建像12 中一樣的url 不過scope 改成了 snsapi_userinfo
snsapi_userinfo_url = 構(gòu)建url();
// 然后使用WebUtils.issueRedirect()這個(gè)工具能在后臺(tái)進(jìn)行請(qǐng)求
//這個(gè)時(shí)候思考
//請(qǐng)求了這個(gè)構(gòu)建好的類似于12 的這個(gè)連接之后就又進(jìn)入了12之后的步驟愁溜。
//也就是說如果用戶沒有登錄疾嗅,為了拿到更詳細(xì)的用戶信息,
//重新獲取snsapi_userinfo 的 scope 的access_token
}
} else {
}//后來的寫到程序上面的注釋上了
</p>