声明:这边所谓的第三方登录,不是通过网页授权的方式,而是利用生成带参数的二维码,将微信号和平台账号绑定实现。如果你要做的是授权登录,请查看
https://blog.youkuaiyun.com/wrongyao/article/details/80229986
紧接着0051扫码绑定之后,这边获取扫码登录操作
1、思路概括

注:用sessionid生成二维码,因为要区分不同终端的不同用户,所以需要带上他们的唯一标识sessionid
扫码以后,微信服务器会推送带有sessionid和openid的报文到我服务器,根据openid在关联关系表中找出userid,取出用户信息,放入缓存中,即为登录成功。
1、用同样的方式,获取带有sessionid的二维码
/**
* 获取二维码
*
* @param sceneStr
* @return
*/
private String getQcode(String sceneStr) {
String getTicketUrl = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" + AccessToken.ACCESS_TOKEN + "";
// 临时整形参数值
String ticketParam = "{\"expire_seconds\": 120, \"action_name\": \"QR_STR_SCENE\", \"action_info\": {\"scene\": {\"scene_str\": \"" + sceneStr + "\"}}}";
String ticketStr = HttpRequest.post(getTicketUrl, ticketParam, null, Constant.RequestType.APPLICATION_JSON);
System.out.println(ticketStr);
Map<String, String> ticketMap = GsonUtil.fromJson(ticketStr, Map.class);
String ticket = ticketMap.get("ticket");
return "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" + ticket;
}
@Override
public String getLoginQCode() {
String sessionId = request.getSession().getId();
return getQcode("login&" + sessionId);
}
2、扫码登录
@Override
public String userLogin(HashMap<String, String> requestMap, String sessionId) {
String res;
String openId = requestMap.get("FromUserName");
SysUser sysUser = sysWechatMapper.selectSysUserByOpenId(openId);
// 未绑定用户
if (null == sysUser) {
res = WechatUtil.replyTextMessage(openId, requestMap.get("ToUserName"), wechatMessage.getUserUnbindReplyMessage());
} else { //登录操作
// 登录操作
LoginJson loginJson = new LoginJson();
loginJson.setCode(Code.success.getIndex());
loginJson.setSysUser(sysUser);
redisService.set("loginJson&" + sessionId, GsonUtil.toJson(loginJson));
res = WechatUtil.replyTextMessage(openId, requestMap.get("ToUserName"), wechatMessage.getLoginSusccessReplyMessage());
}
return res;
}
注:根据openid找到用户,将用户信息放入缓存中,就是登录成功,这边解释为什么不用session做登入,我们在前台请求登录二维码(session1),扫码后首先会到微信服务器,微信服务器向我服务器推送报文(session2),如果用session做登录理论上是要session1的但是此时已经取不到这个session了。所以用nosql数据库,用带过来的sessionid做为可以即可。
3、登录成功跳转。
上述代码只是把用户取出来放到了缓存中,这个方法就返回了,那我们的服务器怎么知道登录成功了呢?
思路:1、登录成功后,我们服务器向客户端推送这个状态,不易实现
2、前端定时访问服务器,看是否登录成功,容易实现。
前端js
var time;
// 获取登录二维码
function getQcode() {
var url = "/wechat/offical/account/getLoginQcode";
$.ajax({
url: url,
type: "get",
async: true,
success: function (res) {
$("#qrCode").attr("src", res);
time = window.setInterval(isLogin, 1000);
}
});
}
//轮询判断是否登录
function isLogin() {
var url = "/sysuser/islogin";
$.ajax({
url: url,
type: "get",
async: true,
success: function (res) {
var resObj = JSON.parse(res);
if (resObj.code == 0) {
window.clearInterval(time);
window.location.href = "/crafts/adminindex";
} else if (resObj.code == 1) {
window.clearInterval(time);
}
}
});
}
后端获取登录状态
/**
* 判断是否登录,用于微信扫码后
*
* @return
*/
@RequestMapping("/islogin")
@ResponseBody
public String isLogin() {
Map<String, Object> resMap = new HashMap<>();
String sessionId = request.getSession().getId();
String loginJsonStr = redisService.get("loginJson&" + sessionId);
LoginJson loginJson = GsonUtil.fromJson(loginJsonStr, LoginJson.class);
// 未扫码
if (null == loginJson) {
resMap.put("code", -1);
resMap.put("msg", "未扫码!");
} else if (loginJson.getCode() == Code.success.getIndex()) {
resMap.put("code", 0);
resMap.put("msg", "成功");
} else if (loginJson.getCode() == Code.fail.getIndex()) {
resMap.put("code", 1);
resMap.put("msg", "失败");
}
return GsonUtil.toJson(resMap);
}
上述就是扫码登录的大致思路,如有不妥的地方,欢迎大家斧正,谢谢!
本文介绍了一种微信扫码登录的实现方法,不同于常见的网页授权登录,该方法通过生成带参数的二维码,将用户的微信号与平台账号绑定,实现快速登录。文章详细讲解了二维码生成、扫码登录流程及登录状态检测的技术细节。
2032





