- 通過 wx.login() 獲取到用戶登錄態(tài)之后蒿叠,需要維護(hù)登錄態(tài)。開發(fā)者要注意不應(yīng)該直接把 session_key彤侍、openid 等字段作為用戶的標(biāo)識(shí)或者 session 的標(biāo)識(shí)较雕,而應(yīng)該自己派發(fā)一個(gè)session 登錄態(tài)。
微信官方文檔
1:session_key和openId是什么度陆?session_key
官方說明為:
session_key是微信服務(wù)器生成的針對(duì)用戶數(shù)據(jù)進(jìn)行加密簽名的密鑰
session_key的用途
(1)對(duì)wx.getUserInfo()接口得到“用戶信息中的密文”進(jìn)行解密。
(2)對(duì)它“稍作處理”献幔,用作維護(hù)小程序的登錄態(tài)懂傀。
“稍微處理”大體為:
(1)生成一個(gè)隨機(jī)數(shù)(官方把他叫做3rd_session)
(2)把這個(gè)隨機(jī)數(shù)當(dāng)session的key,session_key + openid為value蜡感。
即:session[3rd_session]=session_key+openid-
openId:用戶唯一標(biāo)識(shí)
即:每個(gè)微信用戶在你的小程序的唯一的標(biāo)識(shí)蹬蚁。
wx.login
2.調(diào)用本地的方法將code傳給后端
// 配置請(qǐng)求參數(shù)
Map<String, String> param = new HashMap<>();
param.put("appid", WX_LOGIN_APPID);
param.put("secret", WX_LOGIN_SECRET);
param.put("js_code", userVO.getCode());
param.put("grant_type", WX_LOGIN_GRANT_TYPE);
// 發(fā)送請(qǐng)求
String wxResult = HttpUtils.doGet(WX_LOGIN_URL, param);
JSONObject jsonObject = JSONObject.parseObject(wxResult);
// 獲取參數(shù)返回的
String sessionKey = jsonObject.get("session_key").toString();
String openId = jsonObject.get("openid").toString();
// 根據(jù)返回的user實(shí)體類,判斷用戶是否是新用戶郑兴,不是的話犀斋,更新最新登錄時(shí)間,是的話情连,將用戶信息存到數(shù)據(jù)庫
User user = butcherUserAgent.selectByOpenId(openId);
if (user != null) {
user.setLoginTime(new Date());
butcherUserAgent.updateUser(user);
} else {
user.setUserName(userVO.getUserName());
user.setPassword(userVO.getPassword());
user.setOpenId(openId);
user.setLoginTime(new Date());
System.out.println("user:" + user.toString());
User insert = butcherUserAgent.insert(user);
if (insert == null) {
//返回錯(cuò)誤提示
}
}
// 封裝返回小程序
Map<String, Object> map = new HashMap<>();
map.put("session_key", sessionKey);
map.put("openId", openId);
return ResultUtil.createResultJson(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getCode(), map);
- 返回值:
session_key
openId
3:如何獲得session_key和openId官方提供了HTTP接口:
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
獲取步驟:
(1)獲得appid叽粹,secret,js_code
(2)用appid却舀,secret虫几,js_code分別替換如上接口地址的APPID、SECRET挽拔、JSCODE辆脸,其他不變,組裝成完整的地址篱昔。
微信小程序獲得session_key和openId(加解密每强、簽名系列)
4.在“瀏覽器打開此地址”或者“在后臺(tái)模擬瀏覽器的GET執(zhí)行此地址”就可返回如下的JSON數(shù)據(jù)(包含openid、sessionkey)
微信小程序獲得session_key和openId(加解密州刽、簽名系列)
總結(jié):從1,2,3步驟可知空执,只要獲得appid,secret穗椅,js_code就可得到session_key和openId
5:appid和secret的獲得方式
appid為小程序ID
secret為小程序密鑰(AppSecret)
獲得方法:小程序后臺(tái)登錄網(wǎng)址:https://mp.weixin.qq.com/
打開小程序后臺(tái)網(wǎng)址辨绊、注冊(cè)、登錄后匹表,按如下圖所示就可找到你的AppID和AppSecret门坷。
微信小程序獲得session_key和openId(加解密、簽名系列)
注意:目前小程序個(gè)人不能注冊(cè)袍镀,開放注冊(cè)范圍:企業(yè)默蚌、政府、媒體苇羡、其他組織绸吸;
當(dāng)然用這個(gè)辦法,個(gè)人也能注冊(cè)了。
傳送門:http://www.moquu.com/v/372.html
6:js_code如何獲得調(diào)用wx.login()接口就可獲取登錄憑證(js_code)
微信小程序獲得session_key和openId(加解密锦茁、簽名系列)
7:總結(jié)整個(gè)session_key獲取的流程(1)注冊(cè)微信小程序攘轩、登錄后臺(tái)在設(shè)置中獲得appId和secret(密鑰)
(2)調(diào)用wx.login()接口獲取登錄憑證js_code
(3)調(diào)用wx.request()接口把js_code發(fā)送到服務(wù)器后臺(tái)
(4)在服務(wù)器后臺(tái),已知appId码俩、secret度帮、js_code
然后調(diào)用如下官方提供的http接口,即可返回獲取openId稿存、session_key