package com.ruoyi.member.service.impl.member;
|
|
import cn.binarywang.wx.miniapp.api.WxMaService;
|
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
|
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.ruoyi.common.core.exception.ServiceException;
|
import com.ruoyi.common.core.utils.uuid.IdUtils;
|
import com.ruoyi.common.security.utils.SecurityUtils;
|
import com.ruoyi.member.domain.dto.AppUserAuthorizeDto;
|
import com.ruoyi.member.domain.vo.AppUserAuthorizeVo;
|
import com.ruoyi.member.domain.vo.AppUserInfoVo;
|
import com.ruoyi.member.mapper.member.MemberMapper;
|
import com.ruoyi.member.service.member.MemberService;
|
import com.ruoyi.system.api.RemoteOrderService;
|
import com.ruoyi.system.api.RemoteShopService;
|
import com.ruoyi.system.api.RemoteUserService;
|
import com.ruoyi.system.api.constant.AppErrorConstant;
|
import com.ruoyi.system.api.constant.SecurityConstant;
|
import com.ruoyi.system.api.domain.dto.AppEditUserDto;
|
import com.ruoyi.system.api.domain.poji.member.Member;
|
import com.ruoyi.system.api.domain.poji.shop.Shop;
|
import com.ruoyi.system.api.domain.poji.sys.SysUser;
|
import com.ruoyi.system.api.domain.vo.AppOrderTotalVo;
|
import com.ruoyi.system.api.model.AppMiniLoginDto;
|
import com.ruoyi.system.api.model.AppMiniLoginVo;
|
import org.apache.commons.lang3.StringUtils;
|
import org.springframework.data.redis.core.StringRedisTemplate;
|
import org.springframework.stereotype.Service;
|
|
import javax.annotation.Resource;
|
import java.util.Date;
|
import java.util.UUID;
|
|
/**
|
* <p>
|
* 小程序用户 服务实现类
|
* </p>
|
*
|
* @author jqs
|
* @since 2023-04-25
|
*/
|
@Service
|
public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> implements MemberService {
|
|
@Resource
|
private RemoteUserService sysUserService;
|
|
@Resource
|
private WxMaService wxMaService;
|
|
@Resource
|
private MemberMapper memberMapper;
|
|
@Resource
|
private StringRedisTemplate stringRedisTemplate;
|
|
@Resource
|
private RemoteShopService shopService;
|
|
@Resource
|
private RemoteOrderService orderService;
|
|
/**
|
* @description: TODO
|
* @author jqs34
|
* @date 2023/4/30 12:40
|
* @version 1.0
|
*/
|
@Override
|
public Member getByUserId(Long userId){
|
Member member = memberMapper.selectMemberByUserId(userId);
|
return member;
|
}
|
|
/**
|
*
|
* @param appMiniLoginDto
|
* @return
|
*/
|
@Override
|
public AppMiniLoginVo getMemberByCode(AppMiniLoginDto appMiniLoginDto){
|
|
AppMiniLoginVo appMiniLoginVo = new AppMiniLoginVo();
|
WxMaJscode2SessionResult session = null;
|
String unionid;
|
String openid;
|
String sessionKey = null;
|
//获取session
|
try {
|
session = wxMaService.getUserService().getSessionInfo(appMiniLoginDto.getCode());
|
} catch (Exception e) {
|
e.printStackTrace();
|
return null;
|
}
|
if(session!=null&& StringUtils.isNotBlank(session.getOpenid())){
|
unionid = session.getUnionid();
|
openid = session.getOpenid();
|
sessionKey = session.getSessionKey();
|
//获取用户
|
Member member = memberMapper.getOneByMiniOpenid(openid);
|
SysUser sysUser;
|
if(member==null){
|
//创建新用户
|
String memberId = IdUtils.simpleUUID();
|
sysUser = new SysUser();
|
sysUser.setUserName(memberId);
|
sysUser.setUserType("03");
|
sysUser.setNickName("微信用户");
|
String password = "hongruitang";
|
sysUser.setPassword(SecurityUtils.encryptPassword(password));
|
sysUserService.registerUser(sysUser);
|
member = new Member();
|
member.setUserId(sysUser.getUserId());
|
member.setDelFlag(0);
|
member.setMemberId(memberId);
|
member.setWxUnionid(unionid);
|
member.setMiniOpenid(openid);
|
member.setCreateTime(new Date());
|
this.save(member);
|
}else{
|
sysUser = sysUserService.getSysUser(member.getUserId()).getData();
|
}
|
appMiniLoginVo.setMiniOpenid(openid);
|
appMiniLoginVo.setWxUnionid(unionid);
|
appMiniLoginVo.setSysUser(sysUser);
|
appMiniLoginVo.setSessionKey(sessionKey);
|
//sessionKey
|
stringRedisTemplate.opsForValue().set(SecurityConstant.SESSION_KEY+openid,sessionKey);
|
}else{
|
return null;
|
}
|
return appMiniLoginVo;
|
}
|
|
/**
|
* 获取授权信息
|
* @param appUserAuthorizeDto
|
* @return
|
*/
|
@Override
|
public AppUserAuthorizeVo getAppUserAuthorize(AppUserAuthorizeDto appUserAuthorizeDto){
|
Member member = this.getById(appUserAuthorizeDto.getUserId());
|
AppUserAuthorizeVo appUserAuthorizeVo = new AppUserAuthorizeVo();
|
//获取code接口在redis里存放的sessionkey用于解密
|
String sessionkey = stringRedisTemplate.opsForValue().get(SecurityConstant.SESSION_KEY+ member.getMiniOpenid());
|
if(StringUtils.isBlank(sessionkey)){
|
throw new ServiceException(AppErrorConstant.USER_NOT_LOGIN);
|
}
|
String mobile = null;
|
try {
|
//解密微信加密用户信息和手机号
|
WxMaPhoneNumberInfo wxPhoneInfo;
|
if(StringUtils.isNotBlank(appUserAuthorizeDto.getPhoneEncryptedData())&&StringUtils.isNotBlank(appUserAuthorizeDto.getPhoneIv())){
|
wxPhoneInfo = wxMaService.getUserService().getPhoneNoInfo(sessionkey, appUserAuthorizeDto.getPhoneEncryptedData(), appUserAuthorizeDto.getPhoneIv());
|
}else{
|
throw new ServiceException(AppErrorConstant.AUTHORIZE_MISS);
|
}
|
if(StringUtils.isBlank(wxPhoneInfo.getPhoneNumber())){
|
throw new ServiceException(AppErrorConstant.AUTHORIZE_FAILED);
|
}
|
mobile = wxPhoneInfo.getPhoneNumber();
|
} catch (Exception e) {
|
e.printStackTrace();
|
}
|
//更新用户手机信息
|
SysUser sysUser = new SysUser();
|
sysUser.setUserId(appUserAuthorizeDto.getUserId());
|
sysUser.setPhonenumber(mobile);
|
sysUserService.updateUserMobile(sysUser);
|
member.setMobile(mobile);
|
this.saveOrUpdate(member);
|
appUserAuthorizeVo.setMobile(mobile);
|
appUserAuthorizeVo.setNickName(sysUser.getNickName());
|
appUserAuthorizeVo.setOpenid(member.getMiniOpenid());
|
appUserAuthorizeVo.setUnionid(member.getWxUnionid());
|
return appUserAuthorizeVo;
|
}
|
|
/**
|
* 获取用户信息
|
* @param userId
|
* @return
|
*/
|
@Override
|
public AppUserInfoVo getAppUserInfo(Long userId){
|
AppUserInfoVo appUserInfoVo = new AppUserInfoVo();
|
SysUser sysUser = sysUserService.getSysUser(userId).getData();
|
Member member = this.getByUserId(userId);
|
appUserInfoVo.setUserId(userId);
|
appUserInfoVo.setMemberNo(member.getMemberNo());
|
appUserInfoVo.setNickName(sysUser.getNickName());
|
appUserInfoVo.setPhonenumber(sysUser.getPhonenumber());
|
if(member.getRelationShopId()!=null){
|
Shop shop = shopService.getShop(member.getRelationShopId()).getData();
|
appUserInfoVo.setShopName(shop.getShopName());
|
}
|
appUserInfoVo.setBirthday(member.getBirthday());
|
appUserInfoVo.setGender(member.getGender());
|
appUserInfoVo.setAvatar(sysUser.getAvatar());
|
AppOrderTotalVo appOrderTotalVo = orderService.getAppOrderTotal(userId).getData();
|
appUserInfoVo.setNoPayCount(appOrderTotalVo.getNoPayCount());
|
appUserInfoVo.setNoUseCount(appOrderTotalVo.getNoUseCount());
|
return appUserInfoVo;
|
}
|
|
/**
|
* 修改用户信息
|
* @param appEditUserDto
|
*/
|
@Override
|
public void editAppUserInfo(AppEditUserDto appEditUserDto){
|
//修改类型1.昵称2.头像3.性别4.生日
|
Integer editType = appEditUserDto.getEditType();
|
String editValue = appEditUserDto.getEditValue();
|
Member member = this.getByUserId(appEditUserDto.getUserId());
|
switch (editType){
|
case 1:
|
break;
|
case 2:
|
break;
|
case 3:
|
member.setGender(Integer.valueOf(editValue));
|
member.setUpdateTime(new Date());
|
member.setUpdateUserId(appEditUserDto.getUserId());
|
this.saveOrUpdate(member);
|
break;
|
case 4:
|
member.setBirthday(editValue);
|
member.setUpdateTime(new Date());
|
member.setUpdateUserId(appEditUserDto.getUserId());
|
this.saveOrUpdate(member);
|
break;
|
default:
|
break;
|
}
|
}
|
}
|