Browse Source

微信登录整合

黄远 5 years ago
parent
commit
e72d3bed57

+ 55 - 0
lift-system-service/src/main/java/cn/com/ty/lift/system/user/controller/LoginController.java

@@ -9,6 +9,7 @@ import cn.com.ty.lift.system.user.dao.entity.model.UserRequest;
 import cn.com.ty.lift.system.user.service.ILoginService;
 import cn.com.ty.lift.system.user.service.IUserAccountService;
 import cn.com.ty.lift.system.utils.RandomValidateCodeUtil;
+import cn.com.ty.lift.system.wechat.utils.WxUtil;
 import cn.com.xwy.boot.web.dto.RestResponse;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -53,6 +54,23 @@ public class LoginController {
         return loginService.register(request, userRequest);
     }
 
+    /**
+     * @param
+     * @return
+     * @description 微信登录注册
+     * @date 2019-12-30 14:18
+     */
+    @PostMapping("/wxRegister")
+    @ResponseBody
+    public RestResponse wxRegister(HttpServletRequest request, @RequestBody UserRequest userRequest) {
+        RestResponse restResponse = judgeAuthCode(userRequest);
+        if (restResponse == null) {
+            //校验通过走正常注册流程
+            return loginService.register(request, userRequest);
+        }
+        return restResponse;
+    }
+
     @RequestMapping("/changeTeam")
     @ResponseBody
     public RestResponse changeTeam(UserRequest userRequest) {
@@ -72,6 +90,23 @@ public class LoginController {
         return loginService.login(request, userRequest);
     }
 
+    /**
+     * @param
+     * @return
+     * @description 微信登录
+     * @date 2019-12-30 10:50
+     */
+    @RequestMapping("/wxLogin")
+    @ResponseBody
+    public RestResponse wxLogin(HttpServletRequest request, @RequestBody UserRequest userRequest) {
+        RestResponse restResponse = judgeAuthCode(userRequest);
+        if (restResponse == null) {
+            //校验通过 用户微信登录
+            return loginService.wxLogin(request, userRequest);
+        }
+        return restResponse;
+    }
+
     /**
      * @param response http相应类
      * @param request  http请求类
@@ -199,4 +234,24 @@ public class LoginController {
         return loginService.resetPassword(userRequest);
     }
 
+    /**
+     * @param
+     * @return
+     * @description 微信授权码校验
+     * @date 2019-12-30 15:40
+     */
+    private RestResponse judgeAuthCode(UserRequest userRequest) {
+        //判断授权码
+        if (StringUtils.isBlank(userRequest.getAuthCode())) {
+            return RestResponse.fail(ApiConstants.RESULT_ERROR, "授权码为空无法进行注册");
+        }
+        //通过授权码获取用户openId
+        String openId = WxUtil.getOpenIdByAuthCode(userRequest.getAuthCode());
+        if (StringUtils.isBlank(openId)) {
+            return RestResponse.fail(ApiConstants.RESULT_ERROR, "授权码无效无法进行注册");
+        }
+        userRequest.setWeChatOpenId(openId);
+        return null;
+    }
+
 }

+ 2 - 0
lift-system-service/src/main/java/cn/com/ty/lift/system/user/dao/entity/model/UserRequest.java

@@ -19,6 +19,8 @@ public class UserRequest {
     private String name;//用户真实姓名
     private String queryCondition;//查询条件
     private String inputSmsCode;//用户输入的短信验证码
+    private String authCode;//微信授权码
+    private String weChatOpenId;//用户微信标识码
     private Long pageSize;//每页条数
     private Long pageNum;//页数
 }

+ 15 - 7
lift-system-service/src/main/java/cn/com/ty/lift/system/user/service/ILoginService.java

@@ -8,35 +8,43 @@ import javax.servlet.http.HttpServletRequest;
 public interface ILoginService {
 
     /**
+     * @param userRequest 用户请求参数
+     * @return
      * @description 用户注册
      * @date 2019/11/27 10:03 AM
-     * @param userRequest  用户请求参数
-     * @return
      */
     RestResponse register(HttpServletRequest request, UserRequest userRequest);
 
     /**
-     * @description
-     * @date 2019/11/27 10:03 AM
      * @param request
      * @param userRequest 用户请求参数,包括用户手机号,用户密码。
      * @return
+     * @description
+     * @date 2019/11/27 10:03 AM
      */
     RestResponse login(HttpServletRequest request, UserRequest userRequest);
 
     /**
-     * @description 重置密码
-     * @date 2019-12-10
      * @param userRequest 请求对象
      * @return
+     * @description 重置密码
+     * @date 2019-12-10
      */
     RestResponse resetPassword(UserRequest userRequest);
 
     /**
+     * @param
+     * @return
      * @description 切换团队
      * @date 2019-12-18 16:15
+     */
+    RestResponse changeTeam(UserRequest userRequest);
+
+    /**
      * @param
      * @return
+     * @description 微信登录
+     * @date 2019-12-30 10:52
      */
-    RestResponse changeTeam(UserRequest userRequest);
+    RestResponse wxLogin(HttpServletRequest request, UserRequest userRequest);
 }

+ 10 - 0
lift-system-service/src/main/java/cn/com/ty/lift/system/user/service/IUserLoginService.java

@@ -3,6 +3,8 @@ package cn.com.ty.lift.system.user.service;
 import cn.com.ty.lift.system.user.dao.entity.UserLogin;
 import com.baomidou.mybatisplus.extension.service.IService;
 
+import javax.servlet.http.HttpServletRequest;
+
 /**
  * <p>
  * 用户登录记录表 服务类
@@ -13,4 +15,12 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface IUserLoginService extends IService<UserLogin> {
 
+    /**
+     * @description 保存登录信息
+     * @date 2019-12-30 11:15
+     * @param
+     * @return
+     */
+    void saveLoginInfo(HttpServletRequest request, Long userId);
+
 }

+ 88 - 38
lift-system-service/src/main/java/cn/com/ty/lift/system/user/service/impl/LoginService.java

@@ -2,11 +2,13 @@ package cn.com.ty.lift.system.user.service.impl;
 
 import cn.com.ty.lift.common.aliservice.constants.AliConstants;
 import cn.com.ty.lift.common.constants.ApiConstants;
-import cn.com.ty.lift.system.user.dao.entity.*;
+import cn.com.ty.lift.system.user.dao.entity.Menu;
+import cn.com.ty.lift.system.user.dao.entity.Role;
+import cn.com.ty.lift.system.user.dao.entity.UserAccount;
+import cn.com.ty.lift.system.user.dao.entity.UserRole;
 import cn.com.ty.lift.system.user.dao.entity.model.UserRequest;
 import cn.com.ty.lift.system.user.dao.entity.model.UserResponse;
 import cn.com.ty.lift.system.user.service.*;
-import cn.com.ty.lift.system.utils.CommonUtil;
 import cn.com.ty.lift.system.utils.PasswordUtils;
 import cn.com.xwy.boot.web.dto.RestResponse;
 import cn.hutool.json.JSONUtil;
@@ -52,31 +54,28 @@ public class LoginService implements ILoginService {
     @Override
     public RestResponse register(HttpServletRequest request, UserRequest userRequest) {
         //判断手机号是否为空
-        if(StringUtils.isBlank(userRequest.getMobile())){
+        if (StringUtils.isBlank(userRequest.getMobile())) {
             return RestResponse.fail(ApiConstants.RESULT_ERROR, "手机号为空");
         }
         //判断密码是否为空
-        if(StringUtils.isBlank(userRequest.getPassword())){
+        if (StringUtils.isBlank(userRequest.getPassword())) {
             return RestResponse.fail(ApiConstants.RESULT_ERROR, "密码为空");
         }
-        //获取session中的短信验证码
-        Object smsCode = redisTemplate.opsForValue().get(userRequest.getMobile() + AliConstants.SmsConstants.SMS_CODE_NAME);
-        if(smsCode != null){
-            if(!(smsCode.equals(userRequest.getInputSmsCode()))){
-                return RestResponse.fail(ApiConstants.RESULT_ERROR, "短信验证码输入有误");
-            }
-        } else {
-            return RestResponse.fail(ApiConstants.RESULT_ERROR, "验证码过期,无法注册,请重新获取验证码");
+        //校验短信验证码
+        RestResponse verifyResult = verifySmsCode(userRequest.getMobile(), userRequest.getInputSmsCode());
+        //如果结果不为空说明校验未通过
+        if(verifyResult != null){
+            return verifyResult;
         }
         //判断手机号是否注册过
         UserAccount userAccount = userAccountService.getByMobile(userRequest.getMobile());
-        if(userAccount !=  null){
+        if (userAccount != null) {
             return RestResponse.fail(ApiConstants.RESULT_ERROR, "用户手机号已经注册过了");
         }
 
         //保存用户信息,并返回用户账户信息
         userAccount = userService.saveUserInfo(userRequest);
-        if(userAccount != null){
+        if (userAccount != null) {
             return RestResponse.success(null, ApiConstants.RESULT_SUCCESS, "注册成功");
         }
         return RestResponse.fail(ApiConstants.RESULT_ERROR, "注册失败");
@@ -85,45 +84,40 @@ public class LoginService implements ILoginService {
     @Override
     public RestResponse login(HttpServletRequest request, UserRequest userRequest) {
         String password = userRequest.getPassword();
-        if(StringUtils.isBlank(userRequest.getMobile())){
+        if (StringUtils.isBlank(userRequest.getMobile())) {
             return RestResponse.fail(ApiConstants.RESULT_ERROR, "手机号为空无法注册");
         }
-        if(StringUtils.isBlank(password)){
+        if (StringUtils.isBlank(password)) {
             return RestResponse.fail(ApiConstants.RESULT_ERROR, "用户密码为空无法注册");
         }
         //通过手机号获取用户账户信息
         UserAccount userAccount = userAccountService.getByMobile(userRequest.getMobile());
         //验证手机号是否存在
-        if(userAccount == null){
+        if (userAccount == null) {
             return RestResponse.fail(ApiConstants.RESULT_ERROR, "手机号尚未注册");
         }
         //校验密码是否正确
         String inputPassword = PasswordUtils.generatePassword(password, userAccount.getSalt());
-        if(!inputPassword.equals(userAccount.getPassword())){
+        if (!inputPassword.equals(userAccount.getPassword())) {
             return RestResponse.fail(ApiConstants.RESULT_ERROR, "密码输入有误");
         }
-        UserResponse userResponse = userService.getLoginUserInfo(userAccount.getUserId());
-
-        //将当前公司id放入session中
-        if(userResponse.getMaintenanceCompany() != null){
-            request.getSession().setAttribute(ApiConstants.CURRENT_COMPANY_ID, userResponse.getMaintenanceCompany().getId());
-        }
-        //将用户信息放入session中
-        request.getSession().setAttribute(ApiConstants.CURRENT_USER_ID, userResponse.getUserId());
-        //将用户登录的信息放入redis中,作为缓存处理
-        redisTemplate.opsForValue().set(userResponse.getToken(), JSONUtil.toJsonPrettyStr(userResponse));
-        UserLogin userLogin = new UserLogin();
-        userLogin.setUserId(userAccount.getUserId());
-        userLogin.setIp(CommonUtil.getIpAddress(request));
+        //登录成功后初始化登录信息
+        UserResponse userResponse = initLoginInfo(request, userAccount.getUserId());
         //添加登录记录
-        userLoginService.save(userLogin);
-        return RestResponse.success(userResponse,ApiConstants.RESULT_SUCCESS, "登录成功");
+        userLoginService.saveLoginInfo(request, userAccount.getUserId());
+        return RestResponse.success(userResponse, ApiConstants.RESULT_SUCCESS, "登录成功");
     }
 
     @Override
     public RestResponse resetPassword(UserRequest userRequest) {
+        RestResponse verifyResult = verifySmsCode(userRequest.getMobile(), userRequest.getInputSmsCode());
+        //如果结果不为空说明校验未通过
+        if(verifyResult != null){
+            return verifyResult;
+        }
+        //获取用户信息
         UserAccount userAccount = userAccountService.getByMobile(userRequest.getMobile());
-        if(userAccount == null) {
+        if (userAccount == null) {
             return RestResponse.fail(ApiConstants.RESULT_ERROR, "手机号尚未注册");
         }
         String salt = userAccount.getSalt();
@@ -139,14 +133,14 @@ public class LoginService implements ILoginService {
         Long companyId = userRequest.getCompanyId();
         UserResponse userResponse = new UserResponse();
         UserRole userRole = userRoleService.getOne(new QueryWrapper<UserRole>()
-            .eq("company_id", companyId)
-            .eq("user_id", userRequest.getUserId())
+                .eq("company_id", companyId)
+                .eq("user_id", userRequest.getUserId())
         );
-        if(userRole != null){
+        if (userRole != null) {
             Role role = roleService.getById(userRole.getRoleId());
             userResponse.setRole(role);
             //获取菜单信息
-            if(role != null){
+            if (role != null) {
                 //设置菜单树
                 List<Menu> menuTree = roleMenuService.getMenuTree(role.getId());
                 userResponse.setMenus(menuTree);
@@ -154,4 +148,60 @@ public class LoginService implements ILoginService {
         }
         return RestResponse.success(userResponse, ApiConstants.RESULT_SUCCESS, "切换团队成功");
     }
+
+    @Override
+    public RestResponse wxLogin(HttpServletRequest request, UserRequest userRequest) {
+        //通过授权码获取用户openId
+        String openId = userRequest.getAuthCode();
+        UserAccount userAccount = userAccountService.getOne(new QueryWrapper<UserAccount>()
+                .eq("wechat_open_id", openId)
+        );
+        if (userAccount == null) {
+            return RestResponse.fail(ApiConstants.RESULT_ERROR, "微信号尚未绑定用户信息");
+        }
+        //用户存在,关联登录成功
+        //登录成功初始化登录信息
+        UserResponse userResponse = initLoginInfo(request, userAccount.getUserId());
+        //保存登录记录
+        userLoginService.saveLoginInfo(request, userAccount.getUserId());
+        return RestResponse.success(userResponse, ApiConstants.RESULT_SUCCESS, "用户登录成功");
+    }
+
+    /**
+     * @param
+     * @return
+     * @description 初始化登录信息
+     * @date 2019-12-30 11:22
+     */
+    private UserResponse initLoginInfo(HttpServletRequest request, Long userId) {
+        //获取用户信息
+        UserResponse userResponse = userService.getLoginUserInfo(userId);
+        //将当前公司id放入session中
+        if (userResponse.getMaintenanceCompany() != null) {
+            request.getSession().setAttribute(ApiConstants.CURRENT_COMPANY_ID, userResponse.getMaintenanceCompany().getId());
+        }
+        //将用户信息放入session中
+        request.getSession().setAttribute(ApiConstants.CURRENT_USER_ID, userResponse.getUserId());
+        //将用户登录的信息放入redis中,作为缓存处理
+        redisTemplate.opsForValue().set(userResponse.getToken(), JSONUtil.toJsonPrettyStr(userResponse));
+        return userResponse;
+    }
+
+    /**
+     * @param
+     * @return
+     * @description 校验短信验证码
+     * @date 2019-12-30 17:46
+     */
+    private RestResponse verifySmsCode(String mobile, String inputSmsCode) {
+        Object smsCode = redisTemplate.opsForValue().get(mobile + AliConstants.SmsConstants.SMS_CODE_NAME);
+        if (smsCode != null) {
+            if (!(smsCode.equals(inputSmsCode))) {
+                return RestResponse.fail(ApiConstants.RESULT_ERROR, "短信验证码输入有误");
+            }
+        } else {
+            return RestResponse.fail(ApiConstants.RESULT_ERROR, "验证码过期,请重新获取验证码");
+        }
+        return null;
+    }
 }

+ 0 - 1
lift-system-service/src/main/java/cn/com/ty/lift/system/user/service/impl/RoleService.java

@@ -143,7 +143,6 @@ public class RoleService extends ServiceImpl<RoleMapper, Role> implements IRoleS
         UserRole userRole = userRoleService.getOne(new QueryWrapper<UserRole>()
                 .eq("user_id", userId)
                 .eq("company_id", companyId)
-                .eq("delete_flag", ApiConstants.DELETE_NO)
         );
         if (userRole != null) {
             return getById(userRole.getRoleId());

+ 12 - 0
lift-system-service/src/main/java/cn/com/ty/lift/system/user/service/impl/UserLoginService.java

@@ -3,9 +3,12 @@ package cn.com.ty.lift.system.user.service.impl;
 import cn.com.ty.lift.system.user.dao.entity.UserLogin;
 import cn.com.ty.lift.system.user.dao.mapper.UserLoginMapper;
 import cn.com.ty.lift.system.user.service.IUserLoginService;
+import cn.com.ty.lift.system.utils.CommonUtil;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.stereotype.Service;
 
+import javax.servlet.http.HttpServletRequest;
+
 /**
  * <p>
  * 用户登录记录表 服务实现类
@@ -17,4 +20,13 @@ import org.springframework.stereotype.Service;
 @Service
 public class UserLoginService extends ServiceImpl<UserLoginMapper, UserLogin> implements IUserLoginService {
 
+    @Override
+    public void saveLoginInfo(HttpServletRequest request, Long userId){
+        UserLogin userLogin = new UserLogin();
+        userLogin.setUserId(userId);
+        userLogin.setIp(CommonUtil.getIpAddress(request));
+        //添加登录记录
+        this.save(userLogin);
+    }
+
 }

+ 2 - 0
lift-system-service/src/main/java/cn/com/ty/lift/system/user/service/impl/UserService.java

@@ -65,6 +65,8 @@ public class UserService implements IUserService {
         userAccount.setCreateDate(new Date());
         //设置用户类型
         userAccount.setType(ApiConstants.UserConstants.TYPE_USER);
+        //设置用户微信openId
+        userAccount.setWechatOpenId(userRequest.getWeChatOpenId());
         UserInfo userInfo = new UserInfo();
         userInfo.setMobile(userRequest.getMobile());
         userInfo.setName(userRequest.getName());

+ 25 - 0
lift-system-service/src/main/java/cn/com/ty/lift/system/wechat/constants/WxConstants.java

@@ -0,0 +1,25 @@
+package cn.com.ty.lift.system.wechat.constants;
+
+/**
+ * @author huangyuan
+ * @date 2019-12-30
+ * @description 微信常量
+ */
+public class WxConstants {
+
+    /**
+     * app_id
+     */
+    public static final String APP_ID = "wx0f10e6386fb9969e";
+
+    /**
+     * app密钥
+     */
+    public static final String APP_SECRET = "d4624c36b6795d1d99dcf0547af5443d";
+
+    /**
+     * 获取用户信息access_token路径
+     */
+    public static final String USER_INFO_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?"
+            + "appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
+}

+ 32 - 0
lift-system-service/src/main/java/cn/com/ty/lift/system/wechat/utils/WxUtil.java

@@ -0,0 +1,32 @@
+package cn.com.ty.lift.system.wechat.utils;
+
+import cn.com.ty.lift.system.wechat.constants.WxConstants;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONObject;
+import cn.hutool.json.JSONUtil;
+
+/**
+ * @author huangyuan
+ * @date 2019-12-30
+ * @description
+ */
+public class WxUtil {
+
+    /**
+     * @description 通过用户授权码获取用户openId
+     * @param authCode 用户授权码
+     * @return
+     */
+    public static String getOpenIdByAuthCode(String authCode){
+        String url = WxConstants.USER_INFO_ACCESS_TOKEN_URL
+                .replace("APPID", WxConstants.APP_ID)
+                .replace("SECRET", WxConstants.APP_SECRET)
+                .replace("CODE", authCode);
+        JSONObject result = JSONUtil.parseObj(HttpUtil.get(url));
+        if(result.containsKey("openid")){
+            return result.getStr("openid");
+        }
+        return null;
+    }
+
+}