bug
jiangping
2023-11-07 64b432916af9c9218ab3f3eca614e26c542142ae
server/src/main/java/doumeemes/service/system/impl/WxLoginServiceImpl.java
@@ -1,5 +1,6 @@
package doumeemes.service.system.impl;
import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -11,34 +12,30 @@
import doumeemes.core.utils.Constants;
import doumeemes.core.utils.HttpsUtil;
import doumeemes.core.utils.Utils;
import doumeemes.core.utils.WxMiniConfig;
import doumeemes.dao.business.model.Company;
import doumeemes.dao.business.model.CompanyUser;
import doumeemes.dao.business.model.Department;
import doumeemes.dao.ext.CompanyExtMapper;
import doumeemes.dao.ext.CompanyUserExtMapper;
import doumeemes.dao.ext.DepartmentExtMapper;
import doumeemes.dao.ext.dto.QueryCompanyUserExtDTO;
import doumeemes.dao.ext.dto.WxLoginDTO;
import doumeemes.dao.ext.dto.WxLoginOutDTO;
import doumeemes.dao.ext.vo.CompanyUserExtListVO;
import doumeemes.dao.ext.vo.WxLoginVO;
import doumeemes.dao.system.SystemUserMapper;
import doumeemes.dao.system.dto.LoginDTO;
import doumeemes.dao.system.model.SystemLoginLog;
import doumeemes.dao.system.model.SystemUser;
import doumeemes.service.common.CaptchaService;
import doumeemes.service.ext.CompanyExtService;
import doumeemes.service.ext.CompanyUserExtService;
import doumeemes.service.system.SystemLoginLogService;
import doumeemes.service.system.WxLoginService;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
@@ -57,7 +54,6 @@
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Value("${project.version}")
    private String systemVersion;
@@ -85,24 +81,51 @@
     */
    public static final String GET_USER_INFO_URL = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
    public static final String  url = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
    /**
     * 注:公众号-设置与开发-基本设置,必须【已绑定的微信开放平台账号】
     * @param code
     * @param request
     * @return
     */
    @Override
    public WxLoginVO wxLogin(String code, HttpServletRequest request) {
        WxLoginVO wxLoginVO = new WxLoginVO();
        String appId = systemDictDataBiz.queryByCode(Constants.WX_CONFIG,Constants.APPID).getCode();
        String appSecret = systemDictDataBiz.queryByCode(Constants.WX_CONFIG,Constants.APPSECRET).getCode();
        String getTokenUrl = GET_ACCESS_TOKEN_URL.replace("CODE", code).replace("APPID", appId).replace("SECRET", appSecret);
        JSONObject tokenJson = JSONObject.parseObject(HttpsUtil.get(getTokenUrl,true));
        if(Objects.isNull(tokenJson.get("access_token"))){
            throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),tokenJson.getString("errmsg"));
        }
        String accessToken = tokenJson.getString("access_token");
        String openId = tokenJson.getString("openid");
        String getUserInfoUrl = GET_USER_INFO_URL.replace("ACCESS_TOKEN", accessToken).replace("OPENID", openId);
        JSONObject userInfoJson = JSONObject.parseObject(HttpsUtil.get(getUserInfoUrl,true));
        //注:公众号-设置与开发-基本设置,必须【已绑定的微信开放平台账号】
        String unionId = tokenJson.getString("unionid");
        return  loginByUnionIdAndReturn(unionId,Constants.OPENID_WX+openId,request);
    }
    @Override
    public WxLoginVO wxProgramLogin(String code, HttpServletRequest request) {
        try {
            WxMaJscode2SessionResult session =   WxMiniConfig.wxMaService.getUserService().getSessionInfo(code);
            String unionid = session.getUnionid();
            String openId = session.getOpenid();
            return  loginByUnionIdAndReturn(unionid,Constants.OPENID_MINI+openId,request);
        } catch (WxErrorException e) {
            e.printStackTrace();
        }
        throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"微信授权失败,请联系管理员");
    }
    private WxLoginVO loginByUnionIdAndReturn(String unionid,String openId,HttpServletRequest request) {
        WxLoginVO wxLoginVO = new WxLoginVO();
        wxLoginVO.setOpenid(openId);
        wxLoginVO.setUnionid(userInfoJson.getString("unionid"));
        CompanyUser companyUser = companyUserExtMapper.selectOne(new QueryWrapper<CompanyUser>().eq("openid",openId).last(" limit 1 "));
        wxLoginVO.setUnionid(unionid);
        CompanyUser companyUser = companyUserExtMapper.selectOne(new QueryWrapper<CompanyUser>().lambda()
                .eq(CompanyUser::getUnionid,wxLoginVO.getUnionid())
                .eq(CompanyUser::getDeleted,Constants.ZERO)
                .last(" limit 1 "));
//        CompanyUser companyUser = companyUserExtMapper.selectOne(new QueryWrapper<CompanyUser>().eq("openid",openId).last(" limit 1 "));
        if(Objects.isNull(companyUser)){
            wxLoginVO.setLoginStatus(Constants.ONE);
            return wxLoginVO;
@@ -141,6 +164,7 @@
            loginLog.setCompanyId(loginUser.getCompany()!=null?loginUser.getCompany().getId():null);
            loginLog.setCompanyUserId(loginUser.getCompanyUser()!=null?loginUser.getCompanyUser().getId():null);
            loginLog.setSuccess(Boolean.TRUE);
            loginLog.setOrgin(Constants.USER_LOGIN_ORIGIN.wx);
            systemLoginLogService.create(loginLog);
            String session = (String)subject.getSession().getId();
            wxLoginVO.setLoginStatus(Constants.ZERO);
@@ -165,6 +189,7 @@
            throw  ee;
        }
    }
@@ -226,7 +251,7 @@
    @Override
    public void wxLoginOut(WxLoginOutDTO wxLoginOutDTO) {
        if(Objects.isNull(wxLoginOutDTO)&&!Objects.isNull(wxLoginOutDTO.getCompanyUserId())){
        if(!Objects.isNull(wxLoginOutDTO)&&!Objects.isNull(wxLoginOutDTO.getCompanyUserId())){
            companyUserExtMapper.update(null,new UpdateWrapper<CompanyUser>()
                    .set("UNIONID","").set("OPENID","")
                    .eq("id",wxLoginOutDTO.getCompanyUserId())