From 67da87e6d31440fb4f7d7fd57e0a62a9ea5665fa Mon Sep 17 00:00:00 2001 From: "382696293@qq.com" <382696293@qq.com> Date: Fri, 12 Jan 2024 09:22:19 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E7=99=BB=E5=BD=95=E6=B5=81?= =?UTF-8?q?=E7=A8=8B=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapper/WxScriptMessageMapper.xml | 2 +- .../controller/UserMemberController.java | 8 ++++++- .../service/IWxUserMemberService.java | 5 +++- .../service/impl/WxUserMemberServiceImpl.java | 24 +++++++++++++++---- 4 files changed, 32 insertions(+), 7 deletions(-) diff --git a/flossom-common/flossom-common-core/src/main/resources/mapper/WxScriptMessageMapper.xml b/flossom-common/flossom-common-core/src/main/resources/mapper/WxScriptMessageMapper.xml index 469dde0..3fb1469 100644 --- a/flossom-common/flossom-common-core/src/main/resources/mapper/WxScriptMessageMapper.xml +++ b/flossom-common/flossom-common-core/src/main/resources/mapper/WxScriptMessageMapper.xml @@ -137,7 +137,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" where message_type = #{messageType} - and status = #{status} + and status = 0 order by create_time desc LIMIT 1 diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/controller/UserMemberController.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/controller/UserMemberController.java index ad54728..d36e2ec 100644 --- a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/controller/UserMemberController.java +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/controller/UserMemberController.java @@ -3,6 +3,7 @@ package com.flossom.miniProgram.controller; import com.flossom.common.core.constant.Constants; import com.flossom.common.core.domain.R; import com.flossom.common.core.domain.SysFile; +import com.flossom.common.core.domain.entity.WxUserMember; import com.flossom.common.core.exception.ServiceException; import com.flossom.common.core.utils.StringUtils; import com.flossom.common.core.web.controller.BaseController; @@ -41,7 +42,12 @@ public class UserMemberController extends BaseController { logger.error("登录code不能为空"); return AjaxResult.error("登录失败"); } - return AjaxResult.success(wxUserMemberService.login(code)); + // 判断注册 + WxUserMember wxUserMember = wxUserMemberService.wxRegister(code); + if (wxUserMember == null) { + return AjaxResult.error("登录失败"); + } + return AjaxResult.success(wxUserMemberService.login(wxUserMember)); } /** diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/IWxUserMemberService.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/IWxUserMemberService.java index aecfad0..bbe5f9b 100644 --- a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/IWxUserMemberService.java +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/IWxUserMemberService.java @@ -1,11 +1,14 @@ package com.flossom.miniProgram.service; +import com.flossom.common.core.domain.entity.WxUserMember; import com.flossom.miniProgram.domain.vo.LoginUserVo; import com.flossom.miniProgram.domain.vo.UserMemberUpdateVo; public interface IWxUserMemberService { - LoginUserVo login(String code) throws Exception; + WxUserMember wxRegister(String code) throws Exception; + + LoginUserVo login(WxUserMember wxUserMember); String upgradeMember(String code) throws Exception; diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/impl/WxUserMemberServiceImpl.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/impl/WxUserMemberServiceImpl.java index d5599f6..fd01298 100644 --- a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/impl/WxUserMemberServiceImpl.java +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/service/impl/WxUserMemberServiceImpl.java @@ -16,6 +16,7 @@ import com.flossom.common.core.mapper.WxScriptMessageMapper; import com.flossom.common.core.mapper.WxUserMemberMapper; import com.flossom.common.core.mapper.WxUserScriptLogMapper; import com.flossom.common.core.utils.DateUtils; +import com.flossom.common.core.utils.StringUtils; import com.flossom.common.redis.service.RedisService; import com.flossom.common.security.utils.SecurityUtils; import com.flossom.miniProgram.domain.vo.*; @@ -60,14 +61,14 @@ public class WxUserMemberServiceImpl implements IWxUserMemberService { @Override @Transactional - public LoginUserVo login(String code) throws Exception { + public WxUserMember wxRegister(String code) throws Exception { // 1、使用临时凭证 code 获取 appi + appsecret + unionid String result = MiniProgramUtils.getSessionKeyAndOpenId(code); logger.info("请求微信服务器获取openid和unionid,返回结果:{}", result); WxCode2SessionRet wxCode2SessionRet = JSON.parseObject(result, WxCode2SessionRet.class); if (wxCode2SessionRet.getErrcode() != null) { logger.error(wxCode2SessionRet.getErrmsg()); - throw new ServiceException("校验失败"); + throw new ServiceException("登录失败"); } logger.info("openid = {}", wxCode2SessionRet.getOpenid()); logger.info("unionid = {}", wxCode2SessionRet.getUnionid()); @@ -108,11 +109,21 @@ public class WxUserMemberServiceImpl implements IWxUserMemberService { } } + /** + * 临时将 sessionKey 放到 wxUserMember,调用登录时方便获取 + */ + wxUserMember.getParams().put(CacheConstants.WX_SESSION_KEY_CACHE + wxUserMember.getOpenid(), + wxCode2SessionRet.getSession_key()); + return wxUserMember; + } + + @Override + public LoginUserVo login(WxUserMember wxUserMember) { // 3、登录请求,获取 token R> loginResult = remoteAuthService.wxLogin(wxUserMember); if (loginResult.getCode() == R.FAIL) { logger.error("获取token失败:{}", loginResult.getMsg()); - throw new ServiceException(loginResult.getMsg()); + throw new ServiceException("登录失败"); } /** * TODO: 将 session_key 缓存在 redis,并且由于官方没有规定 session_key 的有效期,所以使用时候要注意如下: @@ -120,8 +131,13 @@ public class WxUserMemberServiceImpl implements IWxUserMemberService { * 1、如果过期,重新调用登录接口获取新的 session_key * 2、如果没过期,但由于security的拦截器会判断过期时间不足120分钟时会,会对session_key进行续期:{@link com.flossom.common.security.service.TokenService#refreshSessionKey} */ + String sessionKey = (String) wxUserMember.getParams().get(CacheConstants.WX_SESSION_KEY_CACHE + wxUserMember.getOpenid()); + if (StringUtils.isBlank(sessionKey)) { + logger.error("sessionKey 为空"); + throw new ServiceException("登录失败"); + } redisService.setCacheObject(CacheConstants.WX_SESSION_KEY_CACHE + wxUserMember.getOpenid(), - wxCode2SessionRet.getSession_key(), CacheConstants.EXPIRATION, TimeUnit.MINUTES); + sessionKey, CacheConstants.EXPIRATION, TimeUnit.MINUTES); // 4、返回登录信息 LoginUserVo loginUserVo = new LoginUserVo();