前言
概念什么的可以去各个第三方官网查看API, 这里我简单概括下.
第三方账号登录流程"首先, 每个第三方账号(qq/微博/微信等)对于我们的app应用登录后都有产生一个唯一性的openID, 首次登录是这个openID, 第二次登录也是这个openID, 每次登录都是这个不会变的, 所以, 基于这种特性我们可以让这些第三方账号首次登录时, 进行的是(注册--自动登录)这两个过程, 把它openID当成一个字段存入数据库中, 之后的每次登录都先进行判断下, 若存在该openID, 那就直接进行(自动登录流程); 若不存在该openID, 那就进行上面的(注册--自动登录)即可"
下面贴出, 我在做了多个项目后, 整理集合出来的工具类, 可以只要你们前端将token或一些必要的字段传给你们了, 就可以实现第三方账号登录.
/**
* 第三方登录,该方法会生成用户表中自增id 与 密码,前端需拿到这两个参数,在调用登录接口即可(也可以自己主动调用登录方法)
* 微信-1 QQ-2 新浪微博-3
* 微博是需要申请者的微博号才能登录(可以增加其他账户)
* 数据入库,不同的项目,不同的操作(例子可查看电鼓项目中LoginService.java文件)
* */
public Map requestPassword(String openid, String access_token, int type) {
log.info("获取随机密码:开始");
Map mapRes = new HashMap<>();
//微信登录
if(type == 1){
String path = "https://api.weixin.qq.com/sns/auth?access_token=" + access_token + "&openid=" + openid + "";
log.info("获取随机密码-微信:openid:" + openid + " access_token:" + access_token);
try {
String result = HttpUtil.sendPost(path, "");
Map map = JSON.parseObject(result, new TypeReference
上面的方法分别用到了三个方法,如下所示
//1.1 获取微信用户信息
public ElecPlayer getPlayerInfoWX(String openid, String access_token) {
String path = "https://api.weixin.qq.com/sns/userinfo?access_token="+access_token+"&openid="+openid+"";
log.info("微信用户:openid:"+openid+"access_token"+access_token);
try {
String result=HttpUtil.sendPost(path, "");//通过openid与访问令牌获取用户基本信息
//ElecPlayer player = JSON.parseObject(result,new TypeReference(){} ); //单人,多人需要分开
ElecPlayer player = new ElecPlayer();
Map map = JSON.parseObject(result, new TypeReference>() {});
player.setWxOpenid(map.get("openid"));
player.setWxHead(map.get("headimgurl"));
player.setNickname(map.get("nickname"));
player.setWxUnionid(map.get("unionid"));
player.setSex(Integer.parseInt(map.get("sex")));
player.setCity(map.get("city"));
player.setProvince(map.get("province"));
playerMapper.updateByPrimaryKeySelective(player);
log.info("获取用户资料成功:"+result);
return player;
}catch (Exception e) {
log.info("获取用户资料失败:"+e.toString());
}
return null;
}
//1.2.获取QQ用户openId信息
public String getPlayerInfoQQ(String access_token) {
String openId=null;
String path = "https://graph.qq.com/oauth2.0/me?access_token="+access_token+"";
try {
String result=HttpUtil.sendGet(path, "");//通过openid与访问令牌获取用户基本信息
log.info("获取用户资料成功:"+result);
result = result.replace("callback(", "");
result = result.replace(");", "");
log.info("获取用户资料成功:"+result);
Map map = JSON.parseObject(result, new TypeReference>() {});
ElecPlayer player = new ElecPlayer();
/*player.setQqOpenid((String)map.get("openid"));
playerMapper.updateByPrimaryKeySelective(player);*/
log.info("获取用户资料成功:"+result);
log.info("QQ的openid为:"+map.get("openid"));
openId = map.get("openid");
return openId;
}catch (Exception e) {
log.info("获取用户资料失败:"+e.toString());
}
return null;
}
//1.3.获取新浪用户信息
public ElecPlayer getPlayerInfoXL(String openid, String access_token) {
String path = "https://graph.qq.com/user/get_user_info?access_token=" + access_token + "&oauth_consumer_key="+ QQ_Appid +"&openid=" + openid + "";
log.info("新浪微博用户:openid:"+openid+"access_token"+access_token);
try {
String result=HttpUtil.sendPost(path, "");//通过openid与访问令牌获取用户基本信息
//ElecPlayer player = JSON.parseObject(result,new TypeReference(){} ); //单人,多人需要分开
ElecPlayer player = new ElecPlayer();
Map map = JSON.parseObject(result, new TypeReference>() {});
player.setWxOpenid(map.get("openid"));
player.setWxHead(map.get("headimgurl"));
player.setWxUnionid(map.get("unionid"));
player.setSex(Integer.parseInt(map.get("sex")));
player.setCity(map.get("city"));
player.setProvince(map.get("province"));
playerMapper.updateByPrimaryKeySelective(player);
log.info("获取用户资料成功:"+result);
return player;
}catch (Exception e) {
log.info("获取用户资料失败:"+e.toString());
}
return null;
}
上面的代码流程是在你们的项目在各个第三方官网上开通了登录申请后才可以实现的, QQ\微信还好说, 直接申请就可以测试了, 微博好像是只能申请者的那个账号才能登录, 除此之后还需要软件著作权什么的, 有点麻烦, 和你们的前端说明清楚即可.