123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106 |
- package vip.xiaonuo.weixin.gongzhong.controller;
- import cn.hutool.core.collection.CollUtil;
- import cn.hutool.core.util.StrUtil;
- import cn.hutool.json.JSONUtil;
- import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
- import jakarta.servlet.http.HttpServletResponse;
- import lombok.AllArgsConstructor;
- import lombok.SneakyThrows;
- import lombok.extern.slf4j.Slf4j;
- import me.chanjar.weixin.mp.api.WxMpMessageRouter;
- 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.springframework.web.bind.annotation.*;
- import vip.xiaonuo.coldchain.modular.alarmuser.entity.AlarmUser;
- import vip.xiaonuo.coldchain.modular.alarmuser.service.AlarmUserService;
- import vip.xiaonuo.coldchain.modular.push.entity.WeChatUser;
- import vip.xiaonuo.coldchain.modular.push.utils.PushUtil;
- import vip.xiaonuo.common.enums.CommonDeleteFlagEnum;
- import vip.xiaonuo.dev.modular.config.service.DevConfigService;
- import java.util.List;
- @CrossOrigin
- @RestController
- @AllArgsConstructor
- @Slf4j
- @RequestMapping("/wx/mp")
- public class WxMpController {
- private final WxMpService wxMpService;
- private final WxMpMessageRouter wxMpMessageRouter;
- private final AlarmUserService alarmUserService;
- private final DevConfigService devConfigService;
- private static final String FRONT_USER_INFO_PAGE = "https://coldchain.nzkcloud.com/check";
- @GetMapping("/auth")
- public String check(@RequestParam String signature, @RequestParam String timestamp, @RequestParam String nonce, @RequestParam String echostr) {
- log.info("\n接收到来自微信服务器的认证消息:[{}, {}, {}, {}]", signature,timestamp, nonce, echostr);
- if (wxMpService.checkSignature(timestamp, nonce, signature)) {
- return echostr;
- }
- return "非法请求";
- }
- @SneakyThrows
- @GetMapping("/auth/page")
- public void check(@RequestParam(required = false) String code, @RequestParam(required = false) String state, HttpServletResponse response) {
- log.info("\n接收到来自微信服务器的授权消息:code={},state={}", code, state);
- if (StrUtil.isBlank(code)) {
- response.getWriter().println("授权失败,请重新授权");
- return;
- }
- WeChatUser weChatUser = PushUtil.getUserInfo(code);
- log.info("获取用户信息:{}", JSONUtil.toJsonStr(weChatUser));
- List<AlarmUser> userList = alarmUserService.list(new LambdaQueryWrapper<>(AlarmUser.class)
- .eq(AlarmUser::getOpenId, weChatUser.getOpenid())
- .eq(AlarmUser::getDeleteFlag, CommonDeleteFlagEnum.NOT_DELETE)
- .orderByDesc(AlarmUser::getCreateTime));
- AlarmUser alarmUser;
- if (CollUtil.isNotEmpty(userList)) {
- //检查用户的组织机构
- long count = userList.stream().filter(x -> StrUtil.isNotBlank(x.getCreateOrg())).count();
- if (count > 0) {
- response.getWriter().println("您已授权!\\^o^/");
- return;
- }
- alarmUser = userList.get(0);
- } else {
- //没有用户信息则创建用户
- alarmUserService.getUserInfo(code, null, null);
- alarmUser = alarmUserService.getOne(new LambdaQueryWrapper<>(AlarmUser.class)
- .eq(AlarmUser::getOpenId, weChatUser.getOpenid())
- .isNull(AlarmUser::getCreateOrg)
- .eq(AlarmUser::getDeleteFlag, CommonDeleteFlagEnum.NOT_DELETE)
- .orderByDesc(AlarmUser::getCreateTime)
- .last("limit 1"));
- }
- String redirect = devConfigService.getValueByKey("wx_front_auth_page") + "?id=" + alarmUser.getId();
- log.info("进入用户授权页面 {}", redirect);
- response.sendRedirect(redirect);
- }
- @SneakyThrows
- @PostMapping("/event")
- public String wxEventListener(@RequestBody String param,
- @RequestParam(required = false) String signature,
- @RequestParam(required = false) String timestamp,
- @RequestParam(required = false) String nonce) {
- log.info("\n接收微信事件:[signature=[{}], timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ",
- signature, timestamp, nonce, param);
- // 微信时间在wxMpMessageRouter中处理
- WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(param);
- WxMpXmlOutMessage outMessage = wxMpMessageRouter.route(inMessage);
- // 将响应消息转换为xml格式返回
- return outMessage == null ? "" : outMessage.toXml();
- }
- }
|