<p>
1.瀏覽器js 請求java的islogin 接口
2.java 從session 中獲取當(dāng)前用戶
3.能獲取到說明已經(jīng)登錄
4.不能獲取到說明沒有登陸
5.返回一個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請求
14.這里請求的是微信的服務(wù)器 response_type告訴微信我現(xiàn)在是想要code
15.微信知道了之后,進(jìn)行一系列判斷,就能在 12 那個頁面上進(jìn)行再次跳轉(zhuǎn),你可以理解成這樣:
16.你get請求 12 的地址后,微信的控制層 拿到你傳進(jìn)來的幾個參數(shù),appid 是認(rèn)證過的,好了 那就沒問題了,微信服務(wù)器生成一個隨機的code,然后把這個code 和請求傳過來的redirect_url,state 原封不動的一并傳到了返回的頁面上,頁面上的js無論通過什么樣的形式都能獲取到剛剛傳過來的生成的code和redirect_url以及state,這樣一來js 就能在這個頁面上直接進(jìn)行window.location.href = 傳過來的redirect_url?code=[傳過來的code]&state=[傳過來的state]
17.到這里就簡單了,因為redirect_url 和state 是原封不動的傳過來的,所以到現(xiàn)在的請求連接就是我們自己網(wǎng)站了。并且?guī)е鴧?shù) code state
18.我們自己的服務(wù)器要針對redirect_url 寫響應(yīng)的controller
19.比如我們這里的連接是 jiezhao.xtake.cn/weixin/login?code=xxxx&state=xxxxx
20.這個時候就進(jìn)入到我們的業(yè)務(wù)層的了
21我們在controller 中能根據(jù)code 獲取access_token,是在controller中通過httpClient 請求如下連接完成的:(注意是在controller層請求的)
22.https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
23.上面的這個請求中填上自己的appid,sectrt 以及controller傳過來的CODE,就能獲取到access_token
24.這是正確時返回的數(shù)據(jù)json
25.{ "access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE" }
26.里面有access_token ,有效時長,refresh_token(用來刷新token),還有一個很重要的openid ,這個openid 就是當(dāng)前微信用戶的唯一標(biāo)識啊,這也從一定程度上說明access_token 是面向單一用戶的。這個基礎(chǔ)的access_token有這本質(zhì)的區(qū)別,真實坑爹啊。scope 是snsapi_base 或者 snspai_userinfo
27.有了access_token 和用戶的openid 就能真正的進(jìn)入業(yè)務(wù)層。
==========================華麗分割線===========================
28.我們簡稱25 中的json包是access_token對象
29.先是檢驗了access_token 是否還有效,無效的話能通過對象中的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ì)的信息。
//這時候snspai_base 的scope 已經(jīng)不夠用了,需要能提供更詳細(xì)信息的 . //nsapi_userinfo scope
//然后。構(gòu)建像12 中一樣的url 不過scope 改成了 snsapi_userinfo
snsapi_userinfo_url = 構(gòu)建url();
// 然后使用WebUtils.issueRedirect()這個工具能在后臺進(jìn)行請求
//這個時候思考
//請求了這個構(gòu)建好的類似于12 的這個連接之后就又進(jìn)入了12之后的步驟。
//也就是說如果用戶沒有登錄,為了拿到更詳細(xì)的用戶信息,
//重新獲取snsapi_userinfo 的 scope 的access_token
}
} else {
}//后來的寫到程序上面的注釋上了
</p>