WxMpController.java 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package vip.xiaonuo.weixin.gongzhong.controller;
  2. import cn.hutool.core.collection.CollUtil;
  3. import cn.hutool.core.util.StrUtil;
  4. import cn.hutool.json.JSONUtil;
  5. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  6. import jakarta.servlet.http.HttpServletResponse;
  7. import lombok.AllArgsConstructor;
  8. import lombok.SneakyThrows;
  9. import lombok.extern.slf4j.Slf4j;
  10. import me.chanjar.weixin.mp.api.WxMpMessageRouter;
  11. import me.chanjar.weixin.mp.api.WxMpService;
  12. import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage;
  13. import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage;
  14. import org.springframework.web.bind.annotation.*;
  15. import vip.xiaonuo.coldchain.modular.alarmuser.entity.AlarmUser;
  16. import vip.xiaonuo.coldchain.modular.alarmuser.service.AlarmUserService;
  17. import vip.xiaonuo.coldchain.modular.push.entity.WeChatUser;
  18. import vip.xiaonuo.coldchain.modular.push.utils.PushUtil;
  19. import vip.xiaonuo.common.enums.CommonDeleteFlagEnum;
  20. import vip.xiaonuo.dev.modular.config.service.DevConfigService;
  21. import java.util.List;
  22. @CrossOrigin
  23. @RestController
  24. @AllArgsConstructor
  25. @Slf4j
  26. @RequestMapping("/wx/mp")
  27. public class WxMpController {
  28. private final WxMpService wxMpService;
  29. private final WxMpMessageRouter wxMpMessageRouter;
  30. private final AlarmUserService alarmUserService;
  31. private final DevConfigService devConfigService;
  32. private static final String FRONT_USER_INFO_PAGE = "https://coldchain.nzkcloud.com/check";
  33. @GetMapping("/auth")
  34. public String check(@RequestParam String signature, @RequestParam String timestamp, @RequestParam String nonce, @RequestParam String echostr) {
  35. log.info("\n接收到来自微信服务器的认证消息:[{}, {}, {}, {}]", signature,timestamp, nonce, echostr);
  36. if (wxMpService.checkSignature(timestamp, nonce, signature)) {
  37. return echostr;
  38. }
  39. return "非法请求";
  40. }
  41. @SneakyThrows
  42. @GetMapping("/auth/page")
  43. public void check(@RequestParam(required = false) String code, @RequestParam(required = false) String state, HttpServletResponse response) {
  44. log.info("\n接收到来自微信服务器的授权消息:code={},state={}", code, state);
  45. if (StrUtil.isBlank(code)) {
  46. response.getWriter().println("授权失败,请重新授权");
  47. return;
  48. }
  49. WeChatUser weChatUser = PushUtil.getUserInfo(code);
  50. log.info("获取用户信息:{}", JSONUtil.toJsonStr(weChatUser));
  51. List<AlarmUser> userList = alarmUserService.list(new LambdaQueryWrapper<>(AlarmUser.class)
  52. .eq(AlarmUser::getOpenId, weChatUser.getOpenid())
  53. .eq(AlarmUser::getDeleteFlag, CommonDeleteFlagEnum.NOT_DELETE)
  54. .orderByDesc(AlarmUser::getCreateTime));
  55. AlarmUser alarmUser;
  56. if (CollUtil.isNotEmpty(userList)) {
  57. //检查用户的组织机构
  58. long count = userList.stream().filter(x -> StrUtil.isNotBlank(x.getCreateOrg())).count();
  59. if (count > 0) {
  60. response.getWriter().println("您已授权!\\^o^/");
  61. return;
  62. }
  63. alarmUser = userList.get(0);
  64. } else {
  65. //没有用户信息则创建用户
  66. alarmUserService.getUserInfo(code, null, null);
  67. alarmUser = alarmUserService.getOne(new LambdaQueryWrapper<>(AlarmUser.class)
  68. .eq(AlarmUser::getOpenId, weChatUser.getOpenid())
  69. .isNull(AlarmUser::getCreateOrg)
  70. .eq(AlarmUser::getDeleteFlag, CommonDeleteFlagEnum.NOT_DELETE)
  71. .orderByDesc(AlarmUser::getCreateTime)
  72. .last("limit 1"));
  73. }
  74. String redirect = devConfigService.getValueByKey("wx_front_auth_page") + "?id=" + alarmUser.getId();
  75. log.info("进入用户授权页面 {}", redirect);
  76. response.sendRedirect(redirect);
  77. }
  78. @SneakyThrows
  79. @PostMapping("/event")
  80. public String wxEventListener(@RequestBody String param,
  81. @RequestParam(required = false) String signature,
  82. @RequestParam(required = false) String timestamp,
  83. @RequestParam(required = false) String nonce) {
  84. log.info("\n接收微信事件:[signature=[{}], timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ",
  85. signature, timestamp, nonce, param);
  86. // 微信时间在wxMpMessageRouter中处理
  87. WxMpXmlMessage inMessage = WxMpXmlMessage.fromXml(param);
  88. WxMpXmlOutMessage outMessage = wxMpMessageRouter.route(inMessage);
  89. // 将响应消息转换为xml格式返回
  90. return outMessage == null ? "" : outMessage.toXml();
  91. }
  92. }