package com.ibeetl.jlw.service; import cn.hutool.core.collection.CollectionUtil; import com.ibeetl.admin.core.conf.WxMpConfig; import com.ibeetl.admin.core.rbac.UserLoginInfo; import com.ibeetl.jlw.entity.CoreUserWx; import com.ibeetl.jlw.web.query.CoreUserWxQuery; import me.chanjar.weixin.common.session.WxSessionManager; import me.chanjar.weixin.mp.api.WxMpService; import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import static cn.jlw.Interceptor.AuthenticationInterceptor.indexTokenMap; import static com.ibeetl.admin.core.util.HttpRequestLocal.jwtTokenSplitTimestamp; import static com.ibeetl.jlw.web.IndexController.createTokenKey; /** * @author Binary Wang */ @Component public class MsgHandler extends AbstractHandler { @Autowired private CoreUserWxService coreUserWxService; @Autowired private WebPlatformService webPlatformService; @Autowired private WxMpConfig wxConfig; /** * 存放微信登录用户的信息 */ public static ConcurrentHashMap> WE_CHAT_MAP = new ConcurrentHashMap<>(); @Override public WxMpXmlOutMessage handle(WxMpXmlMessage wxMessage, Map context, WxMpService wxMpService, WxSessionManager sessionManager) { WeixinService weixinService = (WeixinService) wxMpService; String fromUser = wxMessage.getFromUser(); String userId = wxMessage.getEventKey(); if (StringUtils.isEmpty(userId)) { return WxMpXmlOutMessage.TEXT().content("欢迎关注天择教育").toUser(fromUser) .fromUser(wxMessage.getToUser()) .build(); } userId = userId.replace("qrscene_", ""); Map map = new HashMap<>(); //登录 if (userId.contains("login")) { //登录所包含userId为雪花算法ID userId = userId.replace("login", ""); CoreUserWxQuery coreUserWxQuery = new CoreUserWxQuery(); coreUserWxQuery.setOpenid(fromUser); List info = coreUserWxService.getValuesByQueryNotWithPermission(coreUserWxQuery); if (CollectionUtil.isNotEmpty(info)) { // 查询关联的状态正常的用户,是否存在 CoreUserWx coreUserWx = info.get(0); if (null == coreUserWx) { map.put("type", "login"); map.put("status", "error"); map.put("token", "关联用户不存在,或者状态未启用!"); WE_CHAT_MAP.put(userId, map); return WxMpXmlOutMessage.TEXT().content("关联用户不存在,或者状态未启用!").toUser(fromUser) .fromUser(wxMessage.getToUser()) .build(); } UserLoginInfo userLoginInfo = webPlatformService.buildLoginInfo(coreUserWx.getCoreUser()); if (userLoginInfo == null) { map.put("type", "login"); map.put("status", "error"); String value = "绑定的用户,处于不存在或者未启用状态!"; map.put("token", value); WE_CHAT_MAP.put(userId, map); return WxMpXmlOutMessage.TEXT().content(value).toUser(fromUser) .fromUser(wxMessage.getToUser()) .build(); } // 登录信息存放Session String tokenNullable = webPlatformService.setLoginUser(userLoginInfo); map.put("type", "login"); map.put("status", "success"); map.put("token", tokenNullable); // 前后端通过keyId来换取token map.put("keyId", userId); map.put("loginTime", jwtTokenSplitTimestamp(tokenNullable)[1]); map.put("token_key", createTokenKey(coreUserWx.getCoreUser())); WE_CHAT_MAP.put(userId, map); indexTokenMap.put(userId, tokenNullable); // WebSocketServer.sendToUser("token="+token, userId); return WxMpXmlOutMessage.TEXT().content("登录成功").toUser(fromUser) .fromUser(wxMessage.getToUser()) .build(); } map.put("type", "login"); map.put("status", "error"); map.put("token", "登录失败,未绑定账号"); WE_CHAT_MAP.put(userId, map); return WxMpXmlOutMessage.TEXT().content("登录失败,未绑定账号").toUser(fromUser) .fromUser(wxMessage.getToUser()) .build(); } CoreUserWxQuery coreUserWxQuery1 = new CoreUserWxQuery(); coreUserWxQuery1.setOpenid(fromUser); CoreUserWx info1 = coreUserWxService.getInfo(coreUserWxQuery1); CoreUserWxQuery coreUserWxQuery2 = new CoreUserWxQuery(); coreUserWxQuery2.setUserId(Long.parseLong(userId)); CoreUserWx info2 = coreUserWxService.getInfo(coreUserWxQuery2); //判断是否已经绑定 if (info2 != null && info1 != null) { map.put("type", "bind"); map.put("status", "error"); map.put("token", "绑定失败,已经绑定"); WE_CHAT_MAP.put(userId, map); return WxMpXmlOutMessage.TEXT().content("绑定失败,已经绑定").toUser(fromUser) .fromUser(wxMessage.getToUser()) .build(); } coreUserWxQuery2.setOpenid(fromUser); coreUserWxService.add(coreUserWxQuery2); map.put("type", "bind"); map.put("status", "success"); map.put("token", "绑定成功"); WE_CHAT_MAP.put(userId, map); // String redirectURI = wxConfig.getCodeBackUrl(); // String s = weixinService.oauth2buildAuthorizationUrl(redirectURI, "snsapi_userinfo", "STATE"); return WxMpXmlOutMessage.TEXT().content("绑定成功").toUser(fromUser) .fromUser(wxMessage.getToUser()) .build(); } }