|
|
|
@ -1,5 +1,7 @@ |
|
|
|
package com.elink.esua.epdc.service.impl; |
|
|
|
|
|
|
|
import cn.binarywang.wx.miniapp.api.WxMaService; |
|
|
|
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; |
|
|
|
import com.elink.esua.epdc.common.token.dto.TokenDto; |
|
|
|
import com.elink.esua.epdc.common.token.util.CpUserDetailRedis; |
|
|
|
import com.elink.esua.epdc.common.token.util.TokenUtil; |
|
|
|
@ -13,6 +15,7 @@ import com.elink.esua.epdc.dto.epdc.form.EpdcUserRegistFormDTO; |
|
|
|
import com.elink.esua.epdc.dto.epdc.form.EpdcUserUpdateAvatarFromDTO; |
|
|
|
import com.elink.esua.epdc.dto.epdc.form.EpdcUserUpdateMobileFromDTO; |
|
|
|
import com.elink.esua.epdc.dto.epdc.result.EpdcUserInfoResultDTO; |
|
|
|
import com.elink.esua.epdc.dto.form.EpdcAppUserMaTokenFormDTO; |
|
|
|
import com.elink.esua.epdc.dto.form.EpdcAppUserTokenFormDTO; |
|
|
|
import com.elink.esua.epdc.dto.result.EpdcAppAuthorizationDTO; |
|
|
|
import com.elink.esua.epdc.enums.AppUserAuditStateEnum; |
|
|
|
@ -56,6 +59,9 @@ public class AppUserServiceImpl implements AppUserService { |
|
|
|
@Autowired |
|
|
|
private WxMpService wxMpService; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private WxMaService wxMaService; |
|
|
|
|
|
|
|
@Autowired |
|
|
|
private AdminFeignClient adminFeignClient; |
|
|
|
|
|
|
|
@ -73,17 +79,19 @@ public class AppUserServiceImpl implements AppUserService { |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
public Result<EpdcAppAuthorizationDTO> getToken(EpdcAppUserTokenFormDTO formDto) { |
|
|
|
public Result<EpdcAppAuthorizationDTO> getMpToken(EpdcAppUserTokenFormDTO formDto) { |
|
|
|
return this.getTokenByOpenId(this.getMpOpenId(formDto.getWxCode())); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public Result<EpdcAppAuthorizationDTO> getMaToken(EpdcAppUserMaTokenFormDTO formDto) { |
|
|
|
return this.getTokenByOpenId(this.getMaOpenId(formDto.getWxCode())); |
|
|
|
} |
|
|
|
|
|
|
|
private Result<EpdcAppAuthorizationDTO> getTokenByOpenId(String openId) { |
|
|
|
|
|
|
|
WxMpOAuth2AccessToken wxMpOAuth2AccessToken; |
|
|
|
try { |
|
|
|
wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(formDto.getWxCode()); |
|
|
|
} catch (WxErrorException e) { |
|
|
|
log.error("->[getToken]::error[{}]", "解析微信code失败"); |
|
|
|
return new Result().error("解析微信code失败"); |
|
|
|
} |
|
|
|
// 查询当前微信是否已注册用户
|
|
|
|
Result<UserDTO> userInfoResult = userFeignClient.getUserInfoByOpenId(wxMpOAuth2AccessToken.getOpenId()); |
|
|
|
Result<UserDTO> userInfoResult = userFeignClient.getUserInfoByOpenId(openId); |
|
|
|
if (!userInfoResult.success()) { |
|
|
|
return new Result().error("查询用户信息失败"); |
|
|
|
} |
|
|
|
@ -130,96 +138,107 @@ public class AppUserServiceImpl implements AppUserService { |
|
|
|
authorization.setUserState(AppUserStateEnum.AUDIT_FAILURE.value()); |
|
|
|
} |
|
|
|
return new Result().ok(authorization); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public Result<EpdcUserInfoResultDTO> getInfoById(TokenDto userDetail) { |
|
|
|
|
|
|
|
return userFeignClient.getInfoById(userDetail.getUserId()); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public Result updateAvatar(TokenDto userDetail, EpdcUserUpdateAvatarFromDTO fromDTO) { |
|
|
|
UserDTO userDto = new UserDTO(); |
|
|
|
userDto.setId(userDetail.getUserId()); |
|
|
|
userDto.setFaceImg(fromDTO.getAvatar()); |
|
|
|
return userFeignClient.updateMobileOrAvatar(userDto); |
|
|
|
} |
|
|
|
public Result maUserRegist(EpdcUserRegistFormDTO formDto) { |
|
|
|
|
|
|
|
@Override |
|
|
|
public Result updateMobile(TokenDto userDetail, EpdcUserUpdateMobileFromDTO fromDTO) { |
|
|
|
// 校验手机验证码
|
|
|
|
String mobile = fromDTO.getMobile(); |
|
|
|
String smsCode = appUserRedis.getSmsCode(mobile); |
|
|
|
if (StringUtils.isBlank(smsCode) || !smsCode.equals(fromDTO.getSmsCode())) { |
|
|
|
return new Result().error("手机验证码错误"); |
|
|
|
} |
|
|
|
UserDTO userDto = new UserDTO(); |
|
|
|
userDto.setId(userDetail.getUserId()); |
|
|
|
PhoneDto phoneDto = PhoneUtil.getPhoneDto(mobile); |
|
|
|
if (phoneDto != null) { |
|
|
|
userDto.setMobile(mobile); |
|
|
|
userDto.setMobileCarrier(phoneDto.getCarrier()); |
|
|
|
userDto.setMobileCity(phoneDto.getCityName()); |
|
|
|
userDto.setMobileProvince(phoneDto.getProvinceName()); |
|
|
|
} |
|
|
|
return userFeignClient.updateMobileOrAvatar(userDto); |
|
|
|
this.checkSmsCode(formDto.getMobile(), formDto.getSmsCode()); |
|
|
|
|
|
|
|
String openId = this.getMaOpenId(formDto.getWxCode()); |
|
|
|
UserDTO userDto = this.packageUserDto(formDto, null, openId); |
|
|
|
HttpServletRequest request = HttpContextUtils.getHttpServletRequest(); |
|
|
|
userDto.setLastLoginIp(IpUtils.getIpAddr(request)); |
|
|
|
|
|
|
|
return userFeignClient.userRegist(userDto); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public Result userRegist(EpdcUserRegistFormDTO formDto) { |
|
|
|
|
|
|
|
@Override |
|
|
|
public Result mpUserRegist(EpdcUserRegistFormDTO formDto) { |
|
|
|
// 校验手机验证码
|
|
|
|
String mobile = formDto.getMobile(); |
|
|
|
String smsCode = appUserRedis.getSmsCode(mobile); |
|
|
|
if (StringUtils.isBlank(smsCode) || !smsCode.equals(formDto.getSmsCode())) { |
|
|
|
return new Result().error("手机验证码错误"); |
|
|
|
} |
|
|
|
|
|
|
|
this.checkSmsCode(formDto.getMobile(), formDto.getSmsCode()); |
|
|
|
// 解析微信用户信息
|
|
|
|
WxMpUser wxMpUser = this.getWxMpUser(formDto.getWxCode()); |
|
|
|
UserDTO userDto = this.packageUserDto(formDto, wxMpUser, wxMpUser.getOpenId()); |
|
|
|
HttpServletRequest request = HttpContextUtils.getHttpServletRequest(); |
|
|
|
userDto.setLastLoginIp(IpUtils.getIpAddr(request)); |
|
|
|
|
|
|
|
return userFeignClient.userRegist(userDto); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 校验手机验证码 |
|
|
|
* |
|
|
|
* @param mobile 手机号 |
|
|
|
* @param smsCode 用户输入的验证码 |
|
|
|
* @return void |
|
|
|
* @author yujintao |
|
|
|
* @date 2019/9/11 09:20 |
|
|
|
*/ |
|
|
|
private void checkSmsCode(String mobile, String smsCode) { |
|
|
|
String redisSmsCode = appUserRedis.getSmsCode(mobile); |
|
|
|
if (StringUtils.isBlank(redisSmsCode) || !redisSmsCode.equals(smsCode)) { |
|
|
|
throw new RenException("手机验证码错误"); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 组装用户对象 |
|
|
|
* |
|
|
|
* @param formDto 前端提交的注册数据 |
|
|
|
* @param wxMpUser 公众号用户对象(小程序端注册的时候传人null) |
|
|
|
* @param openId 微信openId |
|
|
|
* @return com.elink.esua.epdc.dto.UserDTO |
|
|
|
* @author yujintao |
|
|
|
* @date 2019/9/10 21:09 |
|
|
|
*/ |
|
|
|
private UserDTO packageUserDto(EpdcUserRegistFormDTO formDto, WxMpUser wxMpUser, String openId) { |
|
|
|
// 查询当前微信是否已注册用户
|
|
|
|
Result<UserDTO> userInfoResult = userFeignClient.getUserInfoByOpenId(wxMpUser.getOpenId()); |
|
|
|
Result<UserDTO> userInfoResult = userFeignClient.getUserInfoByOpenId(openId); |
|
|
|
if (!userInfoResult.success()) { |
|
|
|
return new Result().error("查询用户信息失败"); |
|
|
|
throw new RenException("查询用户信息失败"); |
|
|
|
} |
|
|
|
UserDTO userDto = userInfoResult.getData(); |
|
|
|
if (null != userDto) { |
|
|
|
if (AppUserAuditStateEnum.UNDER_AUDIT.value().equals(userDto.getState())) { |
|
|
|
return new Result().error("用户尚在审核中,请耐心等待"); |
|
|
|
throw new RenException("用户尚在审核中,请耐心等待"); |
|
|
|
} |
|
|
|
return new Result().error("此微信号已注册用户,请前往登录"); |
|
|
|
throw new RenException("此微信号已注册用户,请前往登录"); |
|
|
|
} |
|
|
|
|
|
|
|
// 获取网格机构详情
|
|
|
|
String gridId = formDto.getGridId(); |
|
|
|
Result<CompleteDeptDTO> adminDeptResult = adminFeignClient.getCompleteDept(Long.parseLong(gridId)); |
|
|
|
if (!adminDeptResult.success() || null == adminDeptResult.getData()) { |
|
|
|
return new Result().error("查询网格信息失败"); |
|
|
|
throw new RenException("查询网格信息失败"); |
|
|
|
} |
|
|
|
CompleteDeptDTO completeDept = adminDeptResult.getData(); |
|
|
|
|
|
|
|
userDto = this.packUserDto(formDto, wxMpUser, completeDept); |
|
|
|
HttpServletRequest request = HttpContextUtils.getHttpServletRequest(); |
|
|
|
userDto.setLastLoginIp(IpUtils.getIpAddr(request)); |
|
|
|
|
|
|
|
return userFeignClient.userRegist(userDto); |
|
|
|
return this.packageUserDto(formDto, wxMpUser, openId, completeDept); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 组装用户对象 |
|
|
|
* |
|
|
|
* @param formDto 前端表单提交 |
|
|
|
* @param wxMpUser 用户微信信息 |
|
|
|
* @param wxMpUser 微信公众号用户信息 |
|
|
|
* @param openId 微信openId |
|
|
|
* @param completeDept 用户机构信息 |
|
|
|
* @return com.elink.esua.epdc.dto.UserDTO |
|
|
|
* @author yujintao |
|
|
|
* @date 2019/9/7 14:13 |
|
|
|
*/ |
|
|
|
private UserDTO packUserDto(EpdcUserRegistFormDTO formDto, WxMpUser wxMpUser, CompleteDeptDTO completeDept) { |
|
|
|
private UserDTO packageUserDto(EpdcUserRegistFormDTO formDto, WxMpUser wxMpUser, String openId, CompleteDeptDTO completeDept) { |
|
|
|
UserDTO user = ConvertUtils.sourceToTarget(formDto, UserDTO.class); |
|
|
|
|
|
|
|
user.setWxOpenId(openId); |
|
|
|
if (null != wxMpUser) { |
|
|
|
user.setFaceImg(wxMpUser.getHeadImgUrl()); |
|
|
|
} |
|
|
|
|
|
|
|
PhoneDto phoneDto = PhoneUtil.getPhoneDto(formDto.getMobile()); |
|
|
|
if (phoneDto != null) { |
|
|
|
user.setMobileProvince(phoneDto.getProvinceName()); |
|
|
|
@ -249,9 +268,6 @@ public class AppUserServiceImpl implements AppUserService { |
|
|
|
.concat(StringUtils.isNotBlank(formDto.getHouseCode()) ? formDto.getHouseCode() : ""); |
|
|
|
user.setAddress(address); |
|
|
|
|
|
|
|
user.setWxOpenId(wxMpUser.getOpenId()); |
|
|
|
user.setFaceImg(wxMpUser.getHeadImgUrl()); |
|
|
|
|
|
|
|
user.setRegisterTime(new Date()); |
|
|
|
user.setState(AppUserAuditStateEnum.UNDER_AUDIT.value()); |
|
|
|
user.setPartyFlag(YesOrNoEnum.NO.value()); |
|
|
|
@ -260,6 +276,33 @@ public class AppUserServiceImpl implements AppUserService { |
|
|
|
return user; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private String getMaOpenId(String wxCode) { |
|
|
|
WxMaJscode2SessionResult wxMaJscode2SessionResult = null; |
|
|
|
try { |
|
|
|
wxMaJscode2SessionResult = wxMaService.jsCode2SessionInfo(wxCode); |
|
|
|
} catch (WxErrorException e) { |
|
|
|
log.error("->[getMaOpenId]::error[{}]", "解析微信code失败"); |
|
|
|
} |
|
|
|
if (null == wxMaJscode2SessionResult || StringUtils.isBlank(wxMaJscode2SessionResult.getOpenid())) { |
|
|
|
throw new RenException("解析微信code失败"); |
|
|
|
} |
|
|
|
return wxMaJscode2SessionResult.getOpenid(); |
|
|
|
} |
|
|
|
|
|
|
|
private String getMpOpenId(String wxCode) { |
|
|
|
WxMpOAuth2AccessToken wxMpOAuth2AccessToken = null; |
|
|
|
try { |
|
|
|
wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(wxCode); |
|
|
|
} catch (WxErrorException e) { |
|
|
|
log.error("->[getMpOpenId]::error[{}]", "解析微信code失败"); |
|
|
|
} |
|
|
|
if (null == wxMpOAuth2AccessToken || StringUtils.isBlank(wxMpOAuth2AccessToken.getOpenId())) { |
|
|
|
throw new RenException("解析微信code失败"); |
|
|
|
} |
|
|
|
return wxMpOAuth2AccessToken.getOpenId(); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* 解析微信code获取微信用户信息 |
|
|
|
* |
|
|
|
@ -274,11 +317,44 @@ public class AppUserServiceImpl implements AppUserService { |
|
|
|
WxMpOAuth2AccessToken wxMpOAuth2AccessToken = wxMpService.oauth2getAccessToken(wxCode); |
|
|
|
wxMpUser = wxMpService.oauth2getUserInfo(wxMpOAuth2AccessToken, null); |
|
|
|
} catch (WxErrorException e) { |
|
|
|
throw new RenException("解析微信code失败"); |
|
|
|
log.error("->[getWxMpUser]::error[{}]", "解析微信用户信息失败"); |
|
|
|
} |
|
|
|
if (null == wxMpUser || StringUtils.isBlank(wxMpUser.getOpenId())) { |
|
|
|
throw new RenException("解析微信用户信息失败"); |
|
|
|
} |
|
|
|
return wxMpUser; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
public Result<EpdcUserInfoResultDTO> getInfoById(TokenDto userDetail) { |
|
|
|
return userFeignClient.getInfoById(userDetail.getUserId()); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public Result updateAvatar(TokenDto userDetail, EpdcUserUpdateAvatarFromDTO fromDTO) { |
|
|
|
UserDTO userDto = new UserDTO(); |
|
|
|
userDto.setId(userDetail.getUserId()); |
|
|
|
userDto.setFaceImg(fromDTO.getAvatar()); |
|
|
|
return userFeignClient.updateMobileOrAvatar(userDto); |
|
|
|
} |
|
|
|
|
|
|
|
@Override |
|
|
|
public Result updateMobile(TokenDto userDetail, EpdcUserUpdateMobileFromDTO fromDto) { |
|
|
|
// 校验手机验证码
|
|
|
|
String mobile = fromDto.getMobile(); |
|
|
|
this.checkSmsCode(mobile, fromDto.getSmsCode()); |
|
|
|
|
|
|
|
UserDTO userDto = new UserDTO(); |
|
|
|
userDto.setId(userDetail.getUserId()); |
|
|
|
userDto.setMobile(mobile); |
|
|
|
|
|
|
|
PhoneDto phoneDto = PhoneUtil.getPhoneDto(mobile); |
|
|
|
if (phoneDto != null) { |
|
|
|
userDto.setMobileCarrier(phoneDto.getCarrier()); |
|
|
|
userDto.setMobileCity(phoneDto.getCityName()); |
|
|
|
userDto.setMobileProvince(phoneDto.getProvinceName()); |
|
|
|
} |
|
|
|
return userFeignClient.updateMobileOrAvatar(userDto); |
|
|
|
} |
|
|
|
} |
|
|
|
|