package com.ydtech.modules.admin.service.impl; import cn.dev33.satoken.session.SaSession; import cn.dev33.satoken.stp.StpUtil; import com.ydtech.core.page.HttpResult; import com.ydtech.exception.SystemException; import com.ydtech.modules.admin.dao.SysUserRoleMapper; import com.ydtech.modules.admin.model.SysUser; import com.ydtech.modules.admin.model.vo.WechatBindVo; import com.ydtech.modules.admin.model.vo.WechatLoginVo; import com.ydtech.modules.admin.model.vo.WechatVo; import com.ydtech.modules.admin.service.SysUserService; import com.ydtech.modules.admin.service.WechatService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.mp.api.WxMpService; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; @Slf4j @Service @RequiredArgsConstructor public class WechatServiceImpl implements WechatService { @Value("${pyramid.dept.id}") private String pyramid; private final SysUserService sysUserService; private final WxMpService wxMpService; @Override public HttpResult login(WechatLoginVo wechatLoginVo) throws WxErrorException { WxOAuth2AccessToken accessToken = wxMpService.getOAuth2Service().getAccessToken(wechatLoginVo.getCode()); String openId = accessToken.getOpenId(); SysUser sysUser = sysUserService.lambdaQuery() .eq(SysUser::getOpenid, openId) .one(); // 没有绑定微信 if (sysUser == null) { throw new SystemException("您还未绑定工号。"); } SysUser.verifyUser(sysUser); String token = StpUtil.createLoginSession(sysUser.getId()); StpUtil.getSessionByLoginId(sysUser.getId()).set(SaSession.USER, sysUser); WechatVo wechatVo = new WechatVo(token, sysUser.getId()); return HttpResult.ok("", wechatVo); } @Override public HttpResult bind(WechatBindVo wechatBindVo, String userId) throws WxErrorException { WxOAuth2AccessToken accessToken = wxMpService.getOAuth2Service().getAccessToken(wechatBindVo.getCode()); String openId = accessToken.getOpenId(); SysUser sysUser = sysUserService.lambdaQuery().eq(SysUser::getOpenid, openId).one(); if (sysUser != null) { throw new SystemException("同一微信不能重复绑定"); } SysUser user = sysUserService.lambdaQuery().eq(SysUser::getId, userId).one(); if (ObjectUtils.isEmpty(user)) { throw new SystemException("你输入的工号不存在"); } user.setOpenid(openId); boolean update = sysUserService.updateById(user); if (update) { return HttpResult.ok("绑定成功"); } throw new SystemException("绑定失败"); } }