From 9c8e4c9f226127be2982575e76b6ab982756fad2 Mon Sep 17 00:00:00 2001 From: "382696293@qq.com" <382696293@qq.com> Date: Sat, 16 Dec 2023 09:36:45 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8E=B7=E5=8F=96=E6=89=8B=E6=9C=BA=E5=8F=B7?= =?UTF-8?q?=E7=A0=81bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/core/constant/CacheConstants.java | 4 +- .../config/properties/WxConfig.java | 11 ++++ .../domain/vo/WxAccessTokenRet.java | 64 +++++++++++++++++++ .../domain/vo/WxCode2PhoneRet.java | 19 ++++-- .../service/impl/WxUserMemberServiceImpl.java | 54 ++++++++++------ .../miniProgram/utils/MiniProgramUtils.java | 17 ++++- 6 files changed, 140 insertions(+), 29 deletions(-) create mode 100644 flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/domain/vo/WxAccessTokenRet.java diff --git a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/constant/CacheConstants.java b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/constant/CacheConstants.java index b92e26e..d3c10c5 100644 --- a/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/constant/CacheConstants.java +++ b/flossom-common/flossom-common-core/src/main/java/com/flossom/common/core/constant/CacheConstants.java @@ -60,5 +60,7 @@ public class CacheConstants /** * 微信小程序的 session_key */ - public static final String wx_session_key_cache = "wx_session_key:"; + public static final String WX_SESSION_KEY_CACHE = "wx_session_key:"; + + public static final String WX_ACCESS_TOKEN_CACHE = "wx_access_token_cache:"; } diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/config/properties/WxConfig.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/config/properties/WxConfig.java index c705df8..119a7d0 100644 --- a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/config/properties/WxConfig.java +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/config/properties/WxConfig.java @@ -25,6 +25,9 @@ public class WxConfig { */ private String obtainPhoneUrl; + private String accessTokenUrl; + + public String getLoginUrl() { return loginUrl; } @@ -40,4 +43,12 @@ public class WxConfig { public void setObtainPhoneUrl(String obtainPhoneUrl) { this.obtainPhoneUrl = obtainPhoneUrl; } + + public String getAccessTokenUrl() { + return accessTokenUrl; + } + + public void setAccessTokenUrl(String accessTokenUrl) { + this.accessTokenUrl = accessTokenUrl; + } } diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/domain/vo/WxAccessTokenRet.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/domain/vo/WxAccessTokenRet.java new file mode 100644 index 0000000..aab11bb --- /dev/null +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/domain/vo/WxAccessTokenRet.java @@ -0,0 +1,64 @@ +package com.flossom.miniProgram.domain.vo; + +/** + * 登录响应结果 + */ +public class WxAccessTokenRet { + + private String access_token; + private String expires_in; + private Integer errcode; + private String errmsg; + + public WxAccessTokenRet() { + } + + public WxAccessTokenRet(String access_token, String expires_in, Integer errcode, String errmsg) { + this.access_token = access_token; + this.expires_in = expires_in; + this.errcode = errcode; + this.errmsg = errmsg; + } + + public String getAccess_token() { + return access_token; + } + + public void setAccess_token(String access_token) { + this.access_token = access_token; + } + + public String getExpires_in() { + return expires_in; + } + + public void setExpires_in(String expires_in) { + this.expires_in = expires_in; + } + + public Integer getErrcode() { + return errcode; + } + + public void setErrcode(Integer errcode) { + this.errcode = errcode; + } + + public String getErrmsg() { + return errmsg; + } + + public void setErrmsg(String errmsg) { + this.errmsg = errmsg; + } + + @Override + public String toString() { + return "WxAccessTokenRet{" + + "access_token='" + access_token + '\'' + + ", expires_in='" + expires_in + '\'' + + ", errcode=" + errcode + + ", errmsg='" + errmsg + '\'' + + '}'; + } +} diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/domain/vo/WxCode2PhoneRet.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/domain/vo/WxCode2PhoneRet.java index 1262412..5b4b0cb 100644 --- a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/domain/vo/WxCode2PhoneRet.java +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/domain/vo/WxCode2PhoneRet.java @@ -5,25 +5,25 @@ package com.flossom.miniProgram.domain.vo; */ public class WxCode2PhoneRet { - private PhoneInfo phoneInfo; + private PhoneInfo phone_info; private Integer errcode; private String errmsg; public WxCode2PhoneRet() { } - public WxCode2PhoneRet(PhoneInfo phoneInfo, Integer errcode, String errmsg) { - this.phoneInfo = phoneInfo; + public WxCode2PhoneRet(PhoneInfo phone_info, Integer errcode, String errmsg) { + this.phone_info = phone_info; this.errcode = errcode; this.errmsg = errmsg; } public PhoneInfo getPhoneInfo() { - return phoneInfo; + return phone_info; } public void setPhoneInfo(PhoneInfo phoneInfo) { - this.phoneInfo = phoneInfo; + this.phone_info = phoneInfo; } public Integer getErrcode() { @@ -41,4 +41,13 @@ public class WxCode2PhoneRet { public void setErrmsg(String errmsg) { this.errmsg = errmsg; } + + @Override + public String toString() { + return "WxCode2PhoneRet{" + + "phoneInfo=" + phone_info + + ", errcode=" + errcode + + ", errmsg='" + errmsg + '\'' + + '}'; + } } 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 df75702..138cfd2 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 @@ -1,29 +1,21 @@ package com.flossom.miniProgram.service.impl; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.flossom.common.core.constant.CacheConstants; import com.flossom.common.core.constant.UserConstants; -import com.flossom.common.core.domain.LoginBody; import com.flossom.common.core.domain.R; import com.flossom.common.core.domain.RegisterBody; import com.flossom.common.core.domain.entity.WxUserMember; import com.flossom.common.core.exception.ServiceException; import com.flossom.common.core.mapper.WxUserMemberMapper; import com.flossom.common.core.utils.DateUtils; -import com.flossom.common.core.web.domain.AjaxResult; +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.LoginUserVo; -import com.flossom.miniProgram.domain.vo.UserMemberUpdateVo; -import com.flossom.miniProgram.domain.vo.WxCode2PhoneRet; -import com.flossom.miniProgram.domain.vo.WxCode2SessionRet; +import com.flossom.miniProgram.domain.vo.*; import com.flossom.miniProgram.service.IWxUserMemberService; import com.flossom.miniProgram.utils.MiniProgramUtils; import com.flossom.system.api.RemoteAuthService; -import com.flossom.system.api.RemoteUserService; -import org.apache.commons.codec.digest.DigestUtils; -import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; @@ -50,13 +42,15 @@ public class WxUserMemberServiceImpl implements IWxUserMemberService { @Override public LoginUserVo login(String code) throws Exception { // 1、使用临时凭证 code 获取 appi + appsecret + unionid - WxCode2SessionRet wxCode2SessionRet = JSON.parseObject(MiniProgramUtils.getSessionKeyAndOpenId(code), WxCode2SessionRet.class); + 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("校验失败"); } - logger.info("openid", wxCode2SessionRet.getOpenid()); - logger.info("unionid", wxCode2SessionRet.getUnionid()); + logger.info("openid = {}", wxCode2SessionRet.getOpenid()); + logger.info("unionid = {}", wxCode2SessionRet.getUnionid()); // 2、根据 openid 查询用户信息 WxUserMember wxUserMember = wxUserMemberMapper.selectWxUserMemberByOpenId(wxCode2SessionRet.getOpenid()); @@ -68,9 +62,9 @@ public class WxUserMemberServiceImpl implements IWxUserMemberService { wxUserMember.setUnionid(wxCode2SessionRet.getUnionid()); wxUserMember.setLoginTime(DateUtils.getNowDate()); wxUserMember.setCreateTime(DateUtils.getNowDate()); - // 3.2、微信用户表注册 + // 2.2、微信用户表注册 wxUserMemberMapper.insertWxUserMember(wxUserMember); - // 3.3、系统表注册 + // 2.3、系统表注册 RegisterBody registerBody = new RegisterBody(); registerBody.setUsername(wxUserMember.getOpenid()); registerBody.setPassword(UserConstants.WX_SYSTEM_USER_PASSWORD); @@ -87,26 +81,46 @@ public class WxUserMemberServiceImpl implements IWxUserMemberService { logger.error("获取token失败:{}", loginResult.getMsg()); throw new ServiceException(loginResult.getMsg()); } - /** * TODO: 暂时将session_key保存在redis,后期根据业务修改 */ - redisService.setCacheObject(CacheConstants.wx_session_key_cache + wxUserMember.getOpenid(), + redisService.setCacheObject(CacheConstants.WX_SESSION_KEY_CACHE + wxUserMember.getOpenid(), wxCode2SessionRet.getSession_key(), CacheConstants.EXPIRATION, TimeUnit.MINUTES); // 4、返回登录信息 LoginUserVo loginUserVo = new LoginUserVo(); BeanUtils.copyProperties(wxUserMember, loginUserVo); loginUserVo.setToken(loginResult.getData().get("access_token")); - logger.info("登录用户信息:id = {}, username = {}", loginUserVo.getId(), loginUserVo.getUsername()); + logger.info("登录用户信息:id = {}, username = {}, token={}", loginUserVo.getId(), loginUserVo.getUsername(), loginUserVo.getToken()); return loginUserVo; } @Override public void upgradeMember(String code) throws Exception { - WxCode2PhoneRet wxCode2PhoneRet = JSON.parseObject(MiniProgramUtils.getPhone(code), WxCode2PhoneRet.class); + /** + * TODO: 暂时将access_token保存在redis,后期根据业务修改 + */ + String accessToken = redisService.getCacheObject(CacheConstants.WX_ACCESS_TOKEN_CACHE + SecurityUtils.getLoginUser().getWxUserMember().getOpenid()); + if (StringUtils.isBlank(accessToken)) { + // 获取 access_token + String result = MiniProgramUtils.getAccessToken(); + logger.info("请求微信服务器获取access_token返回结果:{}", result); + WxAccessTokenRet wxAccessTokenRet = JSON.parseObject(result, WxAccessTokenRet.class); + if (wxAccessTokenRet.getErrcode() != null) { + logger.error("获取access_token 失败: {}", wxAccessTokenRet.getErrmsg()); + throw new ServiceException("获取用户手机号码失败"); + } + // 保存缓存 + redisService.setCacheObject(CacheConstants.WX_ACCESS_TOKEN_CACHE + SecurityUtils.getLoginUser().getWxUserMember().getOpenid(), + wxAccessTokenRet.getAccess_token(), CacheConstants.EXPIRATION, TimeUnit.MINUTES); + } + + // 获取手机号 + String result = MiniProgramUtils.getPhone(code, accessToken); + logger.info("请求微信服务器获取手机号码返回结果:{}", result); + WxCode2PhoneRet wxCode2PhoneRet = JSON.parseObject(result, WxCode2PhoneRet.class); if (wxCode2PhoneRet.getErrcode() != null) { - logger.error("获取用户手机号码失败: ", wxCode2PhoneRet.getErrmsg()); + logger.error("获取用户手机号码失败: {}", wxCode2PhoneRet.getErrmsg()); throw new ServiceException("获取用户手机号码失败"); } wxUserMemberMapper.upgradeMember(wxCode2PhoneRet.getPhoneInfo().getPhoneNumber(), SecurityUtils.getWxUserId().intValue()); diff --git a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/utils/MiniProgramUtils.java b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/utils/MiniProgramUtils.java index 78c2b19..239644e 100644 --- a/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/utils/MiniProgramUtils.java +++ b/flossom-modules/flossom-mini-program/src/main/java/com/flossom/miniProgram/utils/MiniProgramUtils.java @@ -3,6 +3,8 @@ package com.flossom.miniProgram.utils; import com.flossom.common.core.domain.entity.WxParameterSetting; import com.flossom.common.core.mapper.WxParameterSettingMapper; import com.flossom.miniProgram.config.properties.WxConfig; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -21,6 +23,7 @@ public class MiniProgramUtils { /** * 注入 微信配置mapper,获取 appId,appKey(该配置在数据库) + * * @param wxParameterSettingMapper */ @Autowired @@ -30,6 +33,7 @@ public class MiniProgramUtils { /** * 注入 微信配置类,读取请求路径(该配置在 nacos) + * * @param wxConfig */ @Autowired @@ -85,11 +89,18 @@ public class MiniProgramUtils { * purePhoneNumber string 没有区号的手机号 * countryCode string 区号 */ - public static String getPhone(String code) throws Exception { + public static String getPhone(String code, String accessToken) throws Exception { Map params = new HashMap(); params.put("code", code); - return HttpClientUtils.postParameters(wxConfig.getObtainPhoneUrl(), params); + return HttpClientUtils.postParameters(wxConfig.getObtainPhoneUrl() + "?access_token=" + accessToken, params); } - + public static String getAccessToken() throws Exception { + Map params = new HashMap(); + WxParameterSetting wxParameterSetting = wxParameterSettingMapper.selectWxParameterSettingById(1L); + params.put("appid", wxParameterSetting.getAppid()); + params.put("secret", wxParameterSetting.getAppkey()); + params.put("grant_type", "client_credential"); + return HttpClientUtils.getParameters(wxConfig.getAccessTokenUrl(), params); + } }