|  |  | 
 |  |  | 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; | 
 |  |  | 
 |  |  | 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.vo.CompanyUserExtListVO; | 
 |  |  | import doumeemes.dao.ext.dto.WxLoginOutDTO; | 
 |  |  | 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; | 
 |  |  | 
 |  |  |  | 
 |  |  |     @Autowired | 
 |  |  |     private SystemDictDataBiz systemDictDataBiz; | 
 |  |  |  | 
 |  |  |  | 
 |  |  |     @Value("${project.version}") | 
 |  |  |     private String systemVersion; | 
 |  |  | 
 |  |  |      */ | 
 |  |  |     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; | 
 |  |  | 
 |  |  |             throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到绑定部门信息"); | 
 |  |  |         } | 
 |  |  |         Company company = companyExtMapper.selectById(department.getCompanyId()); | 
 |  |  |         if(Objects.isNull(company)||company.getStatus().equals(Constants.ONE)){ | 
 |  |  |         if(Objects.isNull(company)||company.getStatus().equals(Constants.ZERO)){ | 
 |  |  |             wxLoginVO.setLoginStatus(Constants.ONE); | 
 |  |  |             return wxLoginVO; | 
 |  |  |         } | 
 |  |  | 
 |  |  |             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); | 
 |  |  | 
 |  |  |             throw  ee; | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  |  | 
 |  |  | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     @Override | 
 |  |  |     public void wxLoginOut(WxLoginOutDTO wxLoginOutDTO) { | 
 |  |  |         if(!Objects.isNull(wxLoginOutDTO)&&!Objects.isNull(wxLoginOutDTO.getCompanyUserId())){ | 
 |  |  |             companyUserExtMapper.update(null,new UpdateWrapper<CompanyUser>() | 
 |  |  |                     .set("UNIONID","").set("OPENID","") | 
 |  |  |                     .eq("id",wxLoginOutDTO.getCompanyUserId()) | 
 |  |  |             ); | 
 |  |  |         } | 
 |  |  |     } | 
 |  |  |  | 
 |  |  | } |