获取手机号码bug修复

master
382696293@qq.com 2 years ago
parent eff7cef440
commit 9c8e4c9f22

@ -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:";
}

@ -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;
}
}

@ -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 + '\'' +
'}';
}
}

@ -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 + '\'' +
'}';
}
}

@ -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_keyredis
*/
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_tokenredis
*/
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());

@ -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 appIdappKey
*
* @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<String, String> 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<String, String> 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);
}
}

Loading…
Cancel
Save