From fd1cd8d9b02581f86944446c8c8790d27cb33e95 Mon Sep 17 00:00:00 2001 From: zhangli <123879394@qq.com> Date: Sat, 16 Aug 2025 01:54:50 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=BE=AE=E4=BF=A1=E5=B0=8F?= =?UTF-8?q?=E7=A8=8B=E5=BA=8F=E7=99=BB=E5=BD=95=E6=88=96=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sczx/user/controller/AuthController.java | 10 +++- .../com/sczx/user/service/IUserService.java | 7 +++ .../user/service/impl/UserServiceImpl.java | 58 +++++++++++++++++++ 3 files changed, 74 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/sczx/user/controller/AuthController.java b/src/main/java/com/sczx/user/controller/AuthController.java index eac17a6..0348f56 100644 --- a/src/main/java/com/sczx/user/controller/AuthController.java +++ b/src/main/java/com/sczx/user/controller/AuthController.java @@ -49,8 +49,16 @@ public class AuthController { return Result.ok(userService.miniProgramLogin(code)); } + @ApiOperation(value = "微信小程序登录或注册", notes = "微信小程序登录") + @PostMapping("/mini-program/wechatLogin") + public Result wechatLogin( + @RequestBody WxMiniProgramRegRequest wxMiniProgramRegRequest) { + LoginResponse result = userService.wxMiniProgramLoginOrReg(wxMiniProgramRegRequest); + return Result.ok(result); + } - @ApiOperation(value = "支付宝小程序登录", notes = "支付宝小程序登录") + + @ApiOperation(value = "支付宝小程序登录或注册", notes = "支付宝小程序登录") @PostMapping("/mini-program/alipayLogin") public Result alipayLogin( @RequestBody AlipayMiniProgramRegRequest alipayMiniProgramRegRequest) { diff --git a/src/main/java/com/sczx/user/service/IUserService.java b/src/main/java/com/sczx/user/service/IUserService.java index c81face..68f1fdf 100644 --- a/src/main/java/com/sczx/user/service/IUserService.java +++ b/src/main/java/com/sczx/user/service/IUserService.java @@ -39,6 +39,13 @@ public interface IUserService { */ LoginResponse miniProgramLogin(String code); + /** + * + * @param wxMiniProgramRegRequest + * @return + */ + LoginResponse wxMiniProgramLoginOrReg(WxMiniProgramRegRequest wxMiniProgramRegRequest); + /** diff --git a/src/main/java/com/sczx/user/service/impl/UserServiceImpl.java b/src/main/java/com/sczx/user/service/impl/UserServiceImpl.java index a570f04..3de4b55 100644 --- a/src/main/java/com/sczx/user/service/impl/UserServiceImpl.java +++ b/src/main/java/com/sczx/user/service/impl/UserServiceImpl.java @@ -132,6 +132,64 @@ public class UserServiceImpl implements IUserService { return getLoginResponse(openid,MiniProgramTypeEnum.WECHAT.getType()); } + @Override + public LoginResponse wxMiniProgramLoginOrReg(WxMiniProgramRegRequest wxMiniProgramRegRequest) { + try{ + // 1. 通过code获取session_key和openid + WechatMiniProgramResponse sessionInfo = weichatInteg.getSessionInfoByCode(wxMiniProgramRegRequest.getCode()); + if (sessionInfo == null || sessionInfo.getOpenid() == null) { + throw new BizException("获取微信用户信息失败"); + } + + String openid = sessionInfo.getOpenid(); + String sessionKey = sessionInfo.getSession_key(); + + //先根据openid查询用户,如果有则直接返回登录信息 + LambdaQueryWrapper queryByOpenIdWrapper = new LambdaQueryWrapper<>(); + queryByOpenIdWrapper.eq(BaseUserPO::getWechatOpenid, openid).last(" limit 1"); + BaseUserPO baseUserPO = baseUserRepo.getOne(queryByOpenIdWrapper); + if(Objects.nonNull(baseUserPO)){ + return getLoginResponse(baseUserPO,MiniProgramTypeEnum.WECHAT); + } + //没有则获取手机号,根据手机号查 + // 2. 解密手机号数据 + WechatDecryptedPhoneInfo phoneInfo = null; + if (StringUtils.isNotBlank(wxMiniProgramRegRequest.getPhoneEncryptedData()) && StringUtils.isNotBlank(wxMiniProgramRegRequest.getPhoneIv()) + && StringUtils.isNotBlank(sessionKey)) { + phoneInfo = weichatInteg.decryptPhoneNumber(sessionKey, wxMiniProgramRegRequest.getPhoneEncryptedData(), wxMiniProgramRegRequest.getPhoneIv()); + log.info("解密手机号信息:{}", phoneInfo); + } + String phoneNumber = Optional.ofNullable(phoneInfo).map(WechatDecryptedPhoneInfo::getPurePhoneNumber).orElse(null); + if(StringUtils.isBlank(phoneNumber)){ + throw new BizException("微信小程序注册失败,无法获取用户真实手机号"); + } + + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(BaseUserPO::getPhoneNumber, phoneNumber); + baseUserPO = baseUserRepo.getOne(queryWrapper); + if(Objects.isNull(baseUserPO)){ + baseUserPO = new BaseUserPO(); + baseUserPO.setWechatOpenid(openid); + baseUserPO.setUserName(phoneNumber); + baseUserPO.setPhoneNumber(phoneNumber); + baseUserPO.setPassword(MD5Utils.md5Hex(phoneNumber, StandardCharsets.UTF_8.name())); + + baseUserPO.setNickName(phoneNumber); + baseUserPO.setRoleId(1); + baseUserRepo.saveOrUpdate(baseUserPO); + }else { + if(StringUtils.isBlank(baseUserPO.getWechatOpenid())){ + baseUserPO.setWechatOpenid(openid); + baseUserRepo.saveOrUpdate(baseUserPO); + } + } + return getLoginResponse(baseUserPO,MiniProgramTypeEnum.WECHAT); + }catch (Exception e){ + log.error("微信小程序注册失败", e); + throw new BizException("微信小程序注册失败"); + } + } + @Override public LoginResponse alipayMiniProgramLoginOrReg(AlipayMiniProgramRegRequest alipayMiniProgramRegRequest) { try {