|
@@ -4,6 +4,8 @@ import com.alibaba.fastjson.JSONObject;
|
|
|
import com.caimei365.user.components.WeChatService;
|
|
|
import com.caimei365.user.mapper.LoginMapper;
|
|
|
import com.caimei365.user.model.ResponseJson;
|
|
|
+import com.caimei365.user.model.po.OperationPo;
|
|
|
+import com.caimei365.user.model.po.UserPo;
|
|
|
import com.caimei365.user.model.vo.UserLoginVo;
|
|
|
import com.caimei365.user.service.LoginService;
|
|
|
import com.caimei365.user.components.RedisService;
|
|
@@ -15,6 +17,7 @@ import org.springframework.stereotype.Service;
|
|
|
import org.springframework.web.server.ServerWebExchange;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
+import java.util.HashMap;
|
|
|
import java.util.Map;
|
|
|
import java.util.UUID;
|
|
|
|
|
@@ -244,4 +247,81 @@ public class LoginServiceImpl implements LoginService {
|
|
|
return ResponseJson.success("登录成功", baseUser);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 微信扫码登录
|
|
|
+ *
|
|
|
+ * @param code 微信code
|
|
|
+ * @param state 安全认证
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public void qrCodeAuthorization(String code, String state, ServerWebExchange serverWebExchange) {
|
|
|
+ Map<String, Object> map = new HashMap<>();
|
|
|
+ // 简单验证,防止csrf攻击(跨站请求伪造攻击)
|
|
|
+ String stateCache = (String) redisService.get("state:" + state);
|
|
|
+ if (stateCache == null) {
|
|
|
+ map.put("-1", "请从正确的途径打开链接");
|
|
|
+ }
|
|
|
+ if (StringUtils.isEmpty(code)) {
|
|
|
+ map.put("-1", "请重新进行授权登录");
|
|
|
+ }
|
|
|
+ Map<String, Object> tokenMap;
|
|
|
+ Map<String, Object> wxInfoMap = null;
|
|
|
+ try {
|
|
|
+ tokenMap = weChatService.getInfoMapByWeb(code, "pc");
|
|
|
+ String access_token = (String) tokenMap.get("access_token");
|
|
|
+ String openid = (String) tokenMap.get("openid");
|
|
|
+ log.info("wx回调openid>>>>>" + openid);
|
|
|
+ log.info("wx回调access_token>>>>>" + access_token);
|
|
|
+ wxInfoMap = weChatService.getUserInfo(access_token, openid);
|
|
|
+ log.info("wx回调openid>>>>>" + wxInfoMap.get("openid"));
|
|
|
+ log.info("wx回调unionid>>>>>" + wxInfoMap.get("unionid"));
|
|
|
+ } catch (Exception e) {
|
|
|
+ map.put("-1", "获取微信用户信息失败");
|
|
|
+ }
|
|
|
+ redisService.setMap("error:" + state, map);
|
|
|
+ redisService.setMap(state, wxInfoMap);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * netty长连接验证登录
|
|
|
+ * @param state 安全认证
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public ResponseJson nettyAuthorization(String state) {
|
|
|
+ if (state == null) {
|
|
|
+ return ResponseJson.error("参数异常");
|
|
|
+ }
|
|
|
+ Map<Object, Object> error = redisService.getEntries("error:" + state);
|
|
|
+ if (null != error && error.size() > 0) {
|
|
|
+ return ResponseJson.error(-1, "错误信息", error);
|
|
|
+ }
|
|
|
+ Map<Object, Object> wxInfoMap = redisService.getEntries(state);
|
|
|
+ if (null == wxInfoMap || wxInfoMap.size() == 0) {
|
|
|
+ return ResponseJson.error(-90, "redis缓存没有拿到");
|
|
|
+ }
|
|
|
+ redisService.remove("state");
|
|
|
+ /*HttpSession session = request.getSession();
|
|
|
+ session.setAttribute("wxInfoMap", wxInfoMap);*/
|
|
|
+ String unionId = (String) wxInfoMap.get("unionid");
|
|
|
+ log.info("pc商城unionId>>>>>>" + unionId);
|
|
|
+ String openid = (String) wxInfoMap.get("openid");
|
|
|
+ log.info("pc商城openid>>>>>>" + openid);
|
|
|
+ UserLoginVo operation = loginMapper.getOperationUserByUnionId(unionId, "www");
|
|
|
+ if (operation == null) {
|
|
|
+ operation = loginMapper.getOperationUserByOpenId(openid, "www");
|
|
|
+ if (operation == null) {
|
|
|
+ return ResponseJson.error(-4, "您的微信尚未绑定任何机构", wxInfoMap);
|
|
|
+ } else if (StringUtils.isBlank(operation.getUnionId())) {
|
|
|
+ // 如果openId存在, unionId不存在
|
|
|
+ loginMapper.updateOperationUnionId(operation.getUserId(), unionId);
|
|
|
+ }
|
|
|
+ // 如果unionId存在, openId不存在
|
|
|
+ } else if (operation.getOpenId() == null) {
|
|
|
+ loginMapper.updateOperationOpenId(operation.getUserId(), openid);
|
|
|
+ }
|
|
|
+ // 获取用户信息
|
|
|
+ UserLoginVo user = loginMapper.getLoginUserByUserId(operation.getUserId());
|
|
|
+ return logonVerify(user);
|
|
|
+ }
|
|
|
}
|