/** # __----~~~~~~~~~~~------___ # . . ~~//====...... __--~ ~~ # -. \_|// |||\\ ~~~~~~::::... /~ # ___-==_ _-~o~ \/ ||| \\ _/~~- # __---~~~.==~||\=_ -_--~/_-~|- |\\ \\ _/~ # _-~~ .=~ | \\-_ '-~7 /- / || \ / # .~ .~ | \\ -_ / /- / || \ / # / ____ / | \\ ~-_/ /|- _/ .|| \ / # |~~ ~~|--~~~~--_ \ ~==-/ | \~--===~~ .\ # ' ~-| /| |-~\~~ __--~~ # |-~~-_/ | | ~\_ _-~ /\ # / \ \__ \/~ \__ # _--~ _/ | .-~~____--~-/ ~~==. # ((->/~ '.|||' -_| ~~-/ , . _|| # -_ ~\ ~~---l__i__i__i--~~_/ # _-~-__ ~) \--______________--~~ # //.-~~~-~_--~- |-------~~~~~~~~ # //.-~~~--\ # 神兽保佑 # 永无BUG! */ package com.lunhan.water.host.controller.user; import com.google.gson.JsonObject; import com.google.gson.JsonParser; import com.lunhan.water.common.ConstantFactory; import com.lunhan.water.common.ExecutedResult; import com.lunhan.water.common.PagerResult; import com.lunhan.water.common.config.SysConfig; import com.lunhan.water.common.enums.EResultCode; import com.lunhan.water.common.exceptions.BusinessException; import com.lunhan.water.common.jwt.JWTUtil; import com.lunhan.water.common.jwt.LoginUserDTO; import com.lunhan.water.common.util.HttpUtil; import com.lunhan.water.common.util.LocalDateTimeUtil; import com.lunhan.water.common.util.ParameterUtil; import com.lunhan.water.common.util.SerializeUtil; import com.lunhan.water.common.validator.ParameterValidateResult; import com.lunhan.water.common.validator.ParameterValidator; import com.lunhan.water.entity.enums.EState; import com.lunhan.water.entity.enums.EUserType; import com.lunhan.water.entity.request.ReqChangePassword; import com.lunhan.water.entity.request.ReqListId; import com.lunhan.water.entity.request.ReqNeedCode; import com.lunhan.water.entity.request.ReqUserLogin; import com.lunhan.water.entity.weixin.WeiXinUserDto; import com.lunhan.water.host.BasicController; import com.lunhan.water.host.api.NonLogin; import com.lunhan.water.repository.po.UserLoginPO; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Objects; import com.lunhan.water.service.UserLoginService; import com.lunhan.water.entity.request.userlogin.ReqCreateUserLogin; import com.lunhan.water.entity.request.userlogin.ReqModifyUserLogin; import com.lunhan.water.entity.search.SearchUserLogin; import com.lunhan.water.repository.vo.UserLoginVO; /** * 9000.UserLogin * @author lin.liu * @order 9000 */ @RestController @RequestMapping(value = "user") public class UserLoginController extends BasicController { @Autowired private UserLoginService userLoginService; /** * 微信小程序授权 * @param request 请求参数 */ @NonLogin @PostMapping(value = "wxAuthorize") public ExecutedResult wxAuthorization(@RequestBody ReqNeedCode request) { return success(this.wxMiniAppAuth(request.getCode())); } /** * 微信登录 * @param request 请求参数 */ @NonLogin @PostMapping(value = "wxLogin") public ExecutedResult wxLogin(@RequestBody ReqNeedCode request) { //微信授权 WeiXinUserDto userInfo = this.wxMiniAppAuth(request.getCode()); Long now = LocalDateTimeUtil.nowTimeStamp(); String openId = userInfo.getOpenId(); UserLoginPO user = userLoginService.get4Openid(openId); if (Objects.isNull(user)) { // 微信未绑定账号,新增用户 ReqCreateUserLogin reqCreateUser = new ReqCreateUserLogin(); reqCreateUser.setUserName(openId); reqCreateUser.setPassword(""); reqCreateUser.setWxOpenId(openId); reqCreateUser.setNickName(userInfo.getNickName()); reqCreateUser.setHeadImg(userInfo.getHeadImgUrl()); reqCreateUser.setPhone(""); reqCreateUser.setComment(""); ExecutedResult createAdmin = userLoginService.create(reqCreateUser); if (createAdmin.isFailed()) { return ExecutedResult.failed(createAdmin.getMsg()); } user = userLoginService.get4Openid(openId); } if (!Objects.equals(user.getStatus(), EState.NORMAL.getValue())) { return ExecutedResult.failed("账号异常, 请联系管理员!"); } LoginUserDTO loginUser = new LoginUserDTO(); loginUser.setUserType(EUserType.ADMIN_USER.getValue()); loginUser.setUserId(openId); loginUser.setNickName(user.getNickName()); loginUser.setHeadImg(user.getHeadImg()); loginUser.setPhone(""); loginUser.setToken(JWTUtil.getToken(loginUser)); return ExecutedResult.success(loginUser); } /** * 微信小程序授权 */ private WeiXinUserDto wxMiniAppAuth(String code) { //微信接口服务,通过调用微信接口服务中jscode2session接口获取到openid和session_key String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + SysConfig.wx.getAppId() + "&secret=" + SysConfig.wx.getSecret() + "&js_code=" + code + "&grant_type=authorization_code"; String response = HttpUtil.doGet(url); JsonObject jsonObject = new JsonParser().parse(response).getAsJsonObject(); if (!jsonObject.has("errcode")) { String sessionKey = jsonObject.get("session_key").toString(); String openId = jsonObject.get("openid").toString(); } if (jsonObject.has("errcode")) { String errCode = jsonObject.get("errcode").getAsString(); switch (errCode) { case "1": throw new BusinessException(EResultCode.FAILED, "微信授权失败,请稍后再试."); case "40029": throw new BusinessException(EResultCode.FAILED, "微信授权code无效"); case "40163": throw new BusinessException(EResultCode.FAILED, "微信授权code已被使用"); case "45011": throw new BusinessException(EResultCode.FAILED, "访问次数过于频繁,请稍后再试"); default: throw new BusinessException(EResultCode.FAILED, "微信返回错误:" + errCode); } } return SerializeUtil.toObject(response, WeiXinUserDto.class); } /** * 修改密码 * @param request 请求参数 * @author lin.liu */ @PostMapping("/changePassword") public ExecutedResult changePassword(@RequestBody ReqChangePassword request) { //#region 参数验证 ParameterValidator validator = new ParameterValidator() .addNotNullOrEmpty(ParameterUtil.named("旧密码"), request.getOldPassword()) .addNotNullOrEmpty(ParameterUtil.named("新密码"), request.getNewPassword()) .addLengthMax(ParameterUtil.named("新密码"), request.getNewPassword(), ConstantFactory.LENGTH_MAX50); ParameterValidateResult result = validator.validate(); if (result.getIsFiled()) { return ExecutedResult.failed(result.getErrorMsg()); } //#endregion LoginUserDTO user = super.getTokenUser(); return userLoginService.changePassword(user, request); } /** * 帐号密码登录 * @param request 请求参数 * @author lin.liu */ @PostMapping("login") @NonLogin public ExecutedResult login(@RequestBody ReqUserLogin request) { //#region 参数验证 ParameterValidator validator = new ParameterValidator() .addNotNullOrEmpty(ParameterUtil.named("用户名"), request.getUserName()) .addNotNullOrEmpty(ParameterUtil.named("密码"), request.getPassword()); ParameterValidateResult result = validator.validate(); if (result.getIsFiled()) { return ExecutedResult.failed(result.getErrorMsg()); } //#endregion return userLoginService.login(request); } }