AppAuthServiceImpl.java 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. package beilv.system.service.impl;
  2. import beilv.common.enums.LoginTypeEnum;
  3. import beilv.common.utils.rsa.RsaUtil;
  4. import beilv.system.domain.SysMember;
  5. import beilv.system.domain.vo.AppAuthLoginRespVO;
  6. import beilv.system.domain.vo.AppAuthWeixinMiniAppLoginReqVO;
  7. import beilv.system.mapper.SysMemberMapper;
  8. import beilv.system.service.IAppAuthService;
  9. import cn.binarywang.wx.miniapp.api.WxMaService;
  10. import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
  11. import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
  12. import lombok.extern.slf4j.Slf4j;
  13. import me.chanjar.weixin.common.error.WxErrorException;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.beans.factory.annotation.Value;
  16. import org.springframework.stereotype.Service;
  17. import javax.annotation.Resource;
  18. import static beilv.common.enums.ErrorCodeConstants.AUTH_WEIXIN_MINI_APP_PHONE_CODE_ERROR;
  19. import static beilv.common.enums.ErrorCodeConstants.MINI_AUTH_LOGIN_BAD;
  20. import static beilv.common.servlet.ServletUtils.getClientIP;
  21. import static beilv.common.utils.ExceptionUtil.exception;
  22. /**
  23. * 会员的认证 Service 接口
  24. *
  25. * @author yshop
  26. */
  27. @Service
  28. @Slf4j
  29. public class AppAuthServiceImpl implements IAppAuthService {
  30. @Resource
  31. private WxMaService wxMaService;
  32. @Autowired
  33. private SysMemberMapper sysMemberMapper;
  34. @Value("${rsa.publicKey}")
  35. private String publicKey;
  36. @Override
  37. public AppAuthLoginRespVO weixinMiniAppLogin(AppAuthWeixinMiniAppLoginReqVO reqVO) throws Exception {
  38. // 获得对应的手机号信息
  39. WxMaPhoneNumberInfo phoneNumberInfo;
  40. try {
  41. phoneNumberInfo = wxMaService.getUserService().getNewPhoneNoInfo(reqVO.getPhoneCode());
  42. } catch (Exception exception) {
  43. log.error(exception.getMessage());
  44. throw exception(AUTH_WEIXIN_MINI_APP_PHONE_CODE_ERROR);
  45. }
  46. WxMaJscode2SessionResult session;
  47. try {
  48. session = wxMaService.getUserService().getSessionInfo(reqVO.getLoginCode());
  49. } catch (WxErrorException e) {
  50. log.error(e.getMessage());
  51. throw exception(MINI_AUTH_LOGIN_BAD);
  52. }
  53. // 用户已经存在
  54. SysMember memberUserDO = sysMemberMapper.selectByMobile(phoneNumberInfo.getPhoneNumber());
  55. if (memberUserDO == null) {
  56. // 获得获得注册用户
  57. memberUserDO = sysMemberMapper.createUserIfAbsent(phoneNumberInfo.getPhoneNumber(), getClientIP(),
  58. LoginTypeEnum.WXAPP.getValue());
  59. memberUserDO.setRealName("用户_" + memberUserDO.getId());
  60. }
  61. // 使用 sessionKey 和 openid 进行用户登录
  62. String openId = session.getOpenid();
  63. String sessionKey = session.getSessionKey();
  64. memberUserDO.setOpenId(session.getOpenid());
  65. sysMemberMapper.updateSysMember(memberUserDO);
  66. //加密
  67. String accessToken = RsaUtil.encrypt(memberUserDO.getId().toString(), publicKey);
  68. AppAuthLoginRespVO userInfo = new AppAuthLoginRespVO();
  69. userInfo.setAccessToken(accessToken);
  70. userInfo.setOpenId(openId);
  71. return userInfo;
  72. }
  73. }