前言
概念什么的可以去各个第三方官网查看API, 这里我简单概括下.
第三方账号登录流程"首先, 每个第三方账号(qq/微博/微信等)对于我们的app应用登录后都有产生一个唯一性的openID, 首次登录是这个openID, 第二次登录也是这个openID, 每次登录都是这个不会变的, 所以, 基于这种特性我们可以让这些第三方账号首次登录时, 进行的是(注册--自动登录)这两个过程, 把它openID当成一个字段存入数据库中, 之后的每次登录都先进行判断下, 若存在该openID, 那就直接进行(自动登录流程); 若不存在该openID, 那就进行上面的(注册--自动登录)即可"
下面贴出, 我在做了多个项目后, 整理集合出来的工具类, 可以只要你们前端将token或一些必要的字段传给你们了, 就可以实现第三方账号登录.
/**
* 第三方登录,该方法会生成用户表中自增id 与 密码,前端需拿到这两个参数,在调用登录接口即可(也可以自己主动调用登录方法)
* 微信-1 QQ-2 新浪微博-3
* 微博是需要申请者的微博号才能登录(可以增加其他账户)
* 数据入库,不同的项目,不同的操作(例子可查看电鼓项目中LoginService.java文件)
* */
public Map<String, Object> requestPassword(String openid, String access_token, int type) {
log.info("获取随机密码:开始");
Map<String, Object> 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<String, String> map = JSON.parseObject(result, new TypeReference<Map<String, String>>() {
});
String errcode = map.get("errcode");
String errmsg = map.get("errmsg");
if (errcode.equals("0")) {
log.info("获取随机密码:凭证有效!");
mapRes.put("errcode", errcode);
// 利用openid和token生成一个加密密码
String password = CodeUtil.enCodeWithBCrypt(openid + access_token);
// 获取用户微信信息 只会把openid给存进去?
ElecPlayer player = getPlayerInfoWX(openid, access_token);
if (player.getWxOpenid() == null || player.getWxOpenid().length() == 0) {
mapRes.put("success", 0);
log.info("获取随机密码:玩家openID为空!");
return mapRes;
}
log.info("player" + player);
log.info("password-------------------------------" + password);
log.info("获取随机密码:开始查找是否已经存在用户!");
ElecPlayer playertemp = playerMapper.selectByWX(player.getWxOpenid());// 从本地库查询用户
if (playertemp == null || playertemp.getWxOpenid() == null || playertemp.getWxOpenid().length() == 0) {
// 设置新加用户信息 --微信
player.setNickname(removeNonBmpUnicode(player.getNickname()));
player.setPassword(password);
player.setCre