From 1e9648225b5deb66aa6f083f7cef0a95b3fce983 Mon Sep 17 00:00:00 2001 From: yangjun <1173114630@qq.com> Date: Wed, 21 May 2025 13:43:12 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BE=AE=E4=BF=A1=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E8=8E=B7=E5=8F=96=E4=BF=A1=E6=81=AF=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../H5ApiAdvisoryInfoController.java | 18 ++ .../service/INuBizAdvisoryInfoService.java | 1 + .../impl/NuBizAdvisoryInfoServiceImpl.java | 16 ++ .../weixin/controller/WeixinController.java | 154 ++++++++++++++++++ .../com/nu/modules/weixin/utils/SignUtil.java | 66 ++++++++ .../org/jeecg/config/shiro/ShiroConfig.java | 1 + .../controller/SysDepartController.java | 2 + .../modules/system/entity/SysDepart.java | 2 + .../system/model/SysDepartTreeModel.java | 11 ++ .../src/main/resources/application-dev.yml | 6 + .../src/main/resources/application-uat.yml | 9 +- pom.xml | 4 +- 12 files changed, 286 insertions(+), 4 deletions(-) create mode 100644 nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/weixin/controller/WeixinController.java create mode 100644 nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/weixin/utils/SignUtil.java diff --git a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/NuBizAdvisoryInfo/controller/H5ApiAdvisoryInfoController.java b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/NuBizAdvisoryInfo/controller/H5ApiAdvisoryInfoController.java index 203341f..627e087 100644 --- a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/NuBizAdvisoryInfo/controller/H5ApiAdvisoryInfoController.java +++ b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/NuBizAdvisoryInfo/controller/H5ApiAdvisoryInfoController.java @@ -57,6 +57,11 @@ public class H5ApiAdvisoryInfoController extends JeecgController queryByOpenId(@RequestParam(name="openId",required=true) String openId) { QueryWrapper queryWrapper = new QueryWrapper<>(); @@ -97,4 +102,17 @@ public class H5ApiAdvisoryInfoController extends JeecgController queryByOpenId(@RequestParam(name="openId",required=true) String openId,@RequestParam(name="wechatName",required=true) String wechatName) { + NuBizAdvisoryInfo nuBizAdvisoryInfo = nuBizAdvisoryInfoService.queryWeixinInfo(openId,wechatName); + return Result.OK(nuBizAdvisoryInfo); + } } diff --git a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/NuBizAdvisoryInfo/service/INuBizAdvisoryInfoService.java b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/NuBizAdvisoryInfo/service/INuBizAdvisoryInfoService.java index feedd64..f3bf965 100644 --- a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/NuBizAdvisoryInfo/service/INuBizAdvisoryInfoService.java +++ b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/NuBizAdvisoryInfo/service/INuBizAdvisoryInfoService.java @@ -11,4 +11,5 @@ import com.baomidou.mybatisplus.extension.service.IService; */ public interface INuBizAdvisoryInfoService extends IService { + NuBizAdvisoryInfo queryWeixinInfo(String openId, String wechatName); } diff --git a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/NuBizAdvisoryInfo/service/impl/NuBizAdvisoryInfoServiceImpl.java b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/NuBizAdvisoryInfo/service/impl/NuBizAdvisoryInfoServiceImpl.java index d6765ec..e6a443a 100644 --- a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/NuBizAdvisoryInfo/service/impl/NuBizAdvisoryInfoServiceImpl.java +++ b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/NuBizAdvisoryInfo/service/impl/NuBizAdvisoryInfoServiceImpl.java @@ -1,5 +1,6 @@ package com.nu.modules.NuBizAdvisoryInfo.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.nu.modules.NuBizAdvisoryInfo.entity.NuBizAdvisoryInfo; import com.nu.modules.NuBizAdvisoryInfo.mapper.NuBizAdvisoryInfoMapper; import com.nu.modules.NuBizAdvisoryInfo.service.INuBizAdvisoryInfoService; @@ -16,4 +17,19 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @Service public class NuBizAdvisoryInfoServiceImpl extends ServiceImpl implements INuBizAdvisoryInfoService { + @Override + public NuBizAdvisoryInfo queryWeixinInfo(String openId, String wechatName) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("open_id",openId); + queryWrapper.eq("wechat_name",wechatName); + NuBizAdvisoryInfo nuBizAdvisoryInfo = baseMapper.selectOne(queryWrapper); + //查询是否有微信注册信息,没有则创建 + if(nuBizAdvisoryInfo==null) { + nuBizAdvisoryInfo = new NuBizAdvisoryInfo(); + nuBizAdvisoryInfo.setOpenId(openId); + nuBizAdvisoryInfo.setWechatName(wechatName); + baseMapper.insert(nuBizAdvisoryInfo); + } + return nuBizAdvisoryInfo; + } } diff --git a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/weixin/controller/WeixinController.java b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/weixin/controller/WeixinController.java new file mode 100644 index 0000000..01665b4 --- /dev/null +++ b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/weixin/controller/WeixinController.java @@ -0,0 +1,154 @@ +package com.nu.modules.weixin.controller; + +import com.alibaba.cloud.commons.lang.StringUtils; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.nu.modules.appversionconfig.entity.AppVersionConfig; +import com.nu.modules.appversionconfig.service.IAppVersionConfigService; +import com.nu.modules.weixin.utils.SignUtil; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.jeecg.common.system.base.controller.JeecgController; +import org.jeecg.common.system.query.QueryGenerator; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.Arrays; +import java.util.Map; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.client.RestTemplate; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.client.RestTemplate; + +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.IOException; + + +@RestController +@RequestMapping("/weixin") +@Slf4j +public class WeixinController { + @Value("${wechat.appId}") + private String appId; + + + @Value("${wechat.appSecret:}") + private String appSecret; + + // RestTemplate 用于发送 HTTP 请求 + private final RestTemplate restTemplate; + + public WeixinController(RestTemplate restTemplate) { + this.restTemplate = restTemplate; + } + + + /** + * @description 微信公众号服务器配置校验token + * @author: liyinlong + * @date 2019-05-09 9:38 + * @return + */ + @ApiOperation("微信公众号服务器配置校验token") + @RequestMapping("/checkToken") + public void checkToken(HttpServletRequest request,HttpServletResponse response){ + //token验证代码段 + try{ + log.info("请求已到达,开始校验token"); + if (StringUtils.isNotBlank(request.getParameter("signature"))) { + String signature = request.getParameter("signature"); + String timestamp = request.getParameter("timestamp"); + String nonce = request.getParameter("nonce"); + String echostr = request.getParameter("echostr"); + log.info("signature[{}], timestamp[{}], nonce[{}], echostr[{}]", signature, timestamp, nonce, echostr); + if (SignUtil.checkSignature(signature, timestamp, nonce)) { + log.info("数据源为微信后台,将echostr[{}]返回!", echostr); + response.getOutputStream().println(echostr); + } + } + }catch (IOException e){ + log.error("校验出错"); + e.printStackTrace(); + } + } + + @GetMapping("/auth/callback") + public String wxCallback(String code) { + // 1. 用code换token + // 2. 获取用户信息 return + return "redirect:https://www.focusnu.com/wechat/thd/#/pages/index/callback"; + } + + + @GetMapping("/wechat/callback") + public JsonNode callback(@RequestParam("code") String code, Model model) { + String tokenUrl = String.format( + "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code", + appId, appSecret, code + ); + System.out.println(tokenUrl); + + RestTemplate restTemplate = new RestTemplate(); + System.out.println("-------------------11111111111111111----------"); + String tokenResponse = restTemplate.getForObject(tokenUrl, String.class); + System.out.println("-------------------22222222222222222----------"+tokenResponse); + + JsonNode retJson = null; + ObjectMapper objectMapper = new ObjectMapper(); + try { + System.out.println("-------------------33333333333333----------"); + JsonNode tokenNode = objectMapper.readTree(tokenResponse); + System.out.println("-------------------444444444444444----------"+tokenNode); + String accessToken = tokenNode.get("access_token").asText(); + System.out.println("-------------------55555555555555----------"+accessToken); + String openId = tokenNode.get("openid").asText(); + System.out.println("-------------------666666666666666----------"+openId); + + String userInfoUrl = String.format( + "https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN", + accessToken, openId + ); + System.out.println("-------------------777777777777777----------"+userInfoUrl); + + String userInfoResponse = restTemplate.getForObject(userInfoUrl, String.class); + System.out.println("-------------------888888888888888----------"+userInfoResponse); + JsonNode userInfoNode = objectMapper.readTree(userInfoResponse); + System.out.println("-------------------999999999999999----------"+userInfoNode); + + model.addAttribute("openid", openId); + System.out.println("-------------------999999999999999----------"+openId); + model.addAttribute("nickname", userInfoNode.get("nickname").asText()); + model.addAttribute("headimgurl", userInfoNode.get("headimgurl").asText()); + model.addAttribute("code", code); + retJson = userInfoNode; + } catch (IOException e) { + e.printStackTrace(); + model.addAttribute("openid", "Error parsing JSON response"); + } + + return retJson; + } + + + +} diff --git a/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/weixin/utils/SignUtil.java b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/weixin/utils/SignUtil.java new file mode 100644 index 0000000..acadeb2 --- /dev/null +++ b/nursing-unit-admin/nu-admin-biz/src/main/java/com/nu/modules/weixin/utils/SignUtil.java @@ -0,0 +1,66 @@ +package com.nu.modules.weixin.utils; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Arrays; + +public class SignUtil { + private static String token = "Blxc20250520"; + + /** + * 校验签名 + * @param signature 签名 + * @param timestamp 时间戳 + * @param nonce 随机数 + * @return 布尔值 + */ + public static boolean checkSignature(String signature,String timestamp,String nonce){ + String checktext = null; + if (null != signature) { + //对ToKen,timestamp,nonce 按字典排序 + String[] paramArr = new String[]{token,timestamp,nonce}; + Arrays.sort(paramArr); + //将排序后的结果拼成一个字符串 + String content = paramArr[0].concat(paramArr[1]).concat(paramArr[2]); + + try { + MessageDigest md = MessageDigest.getInstance("SHA-1"); + //对接后的字符串进行sha1加密 + byte[] digest = md.digest(content.toString().getBytes()); + checktext = byteToStr(digest); + } catch (NoSuchAlgorithmException e){ + e.printStackTrace(); + } + } + //将加密后的字符串与signature进行对比 + return checktext !=null ? checktext.equals(signature.toUpperCase()) : false; + } + + /** + * 将字节数组转化我16进制字符串 + * @param byteArrays 字符数组 + * @return 字符串 + */ + private static String byteToStr(byte[] byteArrays){ + String str = ""; + for (int i = 0; i < byteArrays.length; i++) { + str += byteToHexStr(byteArrays[i]); + } + return str; + } + + /** + * 将字节转化为十六进制字符串 + * @param myByte 字节 + * @return 字符串 + */ + private static String byteToHexStr(byte myByte) { + char[] Digit = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; + char[] tampArr = new char[2]; + tampArr[0] = Digit[(myByte >>> 4) & 0X0F]; + tampArr[1] = Digit[myByte & 0X0F]; + String str = new String(tampArr); + return str; + } + +} diff --git a/nursing-unit-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java b/nursing-unit-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java index 7ccc975..511fb82 100644 --- a/nursing-unit-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java +++ b/nursing-unit-base-core/src/main/java/org/jeecg/config/shiro/ShiroConfig.java @@ -108,6 +108,7 @@ public class ShiroConfig { filterChainDefinitionMap.put("/sys/dict/getDictItems/**", "anon");//获取字典数据 filterChainDefinitionMap.put("/sys/sysDepart/queryInstitutionsList", "anon");//授权接口排除 filterChainDefinitionMap.put("/h5Api/nuBizAdvisoryInfo/**", "anon"); //授权接口排除 + filterChainDefinitionMap.put("/weixin/**", "anon"); //授权接口排除 filterChainDefinitionMap.put("/sys/getLoginQrcode/**", "anon"); //登录二维码 diff --git a/nursing-unit-system/nu-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java b/nursing-unit-system/nu-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java index d24b7a2..e1f6a21 100644 --- a/nursing-unit-system/nu-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java +++ b/nursing-unit-system/nu-system-biz/src/main/java/org/jeecg/modules/system/controller/SysDepartController.java @@ -703,6 +703,7 @@ public class SysDepartController { map.put("id",depart.getId()); map.put("departName",depart.getDepartName()); map.put("serverUrl",depart.getServerUrl()); + map.put("picUrl",depart.getPicUrl()); result.add(map); } return result; @@ -724,4 +725,5 @@ public class SysDepartController { return result; } + } diff --git a/nursing-unit-system/nu-system-biz/src/main/java/org/jeecg/modules/system/entity/SysDepart.java b/nursing-unit-system/nu-system-biz/src/main/java/org/jeecg/modules/system/entity/SysDepart.java index e7b90c4..151d2ab 100644 --- a/nursing-unit-system/nu-system-biz/src/main/java/org/jeecg/modules/system/entity/SysDepart.java +++ b/nursing-unit-system/nu-system-biz/src/main/java/org/jeecg/modules/system/entity/SysDepart.java @@ -116,6 +116,8 @@ public class SysDepart implements Serializable { /**各机构服务器后台接口地址*/ private String serverUrl; + /**各机构服务器后台接口地址*/ + private String picUrl; //update-begin---author:wangshuai ---date:20200308 for:[JTC-119]在部门管理菜单下设置部门负责人,新增字段负责人ids和旧的负责人ids /**部门负责人的ids*/ diff --git a/nursing-unit-system/nu-system-biz/src/main/java/org/jeecg/modules/system/model/SysDepartTreeModel.java b/nursing-unit-system/nu-system-biz/src/main/java/org/jeecg/modules/system/model/SysDepartTreeModel.java index 3c6c8ad..c7e1075 100644 --- a/nursing-unit-system/nu-system-biz/src/main/java/org/jeecg/modules/system/model/SysDepartTreeModel.java +++ b/nursing-unit-system/nu-system-biz/src/main/java/org/jeecg/modules/system/model/SysDepartTreeModel.java @@ -87,6 +87,8 @@ public class SysDepartTreeModel implements Serializable{ private Date updateTime; + private String picUrl; + //update-begin---author:wangshuai ---date:20200308 for:[JTC-119]在部门管理菜单下设置部门负责人,新增字段部门负责人ids /**部门负责人ids*/ private String directorUserIds; @@ -130,6 +132,7 @@ public class SysDepartTreeModel implements Serializable{ this.updateBy = sysDepart.getUpdateBy(); this.updateTime = sysDepart.getUpdateTime(); this.directorUserIds = sysDepart.getDirectorUserIds(); + this.picUrl = sysDepart.getPicUrl(); if(0 == sysDepart.getIzLeaf()){ this.isLeaf = false; }else{ @@ -408,6 +411,14 @@ public class SysDepartTreeModel implements Serializable{ this.directorUserIds = directorUserIds; } + public String getPicUrl() { + return picUrl; + } + + public void setPicUrl(String picUrl) { + this.picUrl = picUrl; + } + /** * 重写equals方法 */ diff --git a/nursing-unit-system/nu-system-start/src/main/resources/application-dev.yml b/nursing-unit-system/nu-system-start/src/main/resources/application-dev.yml index 6c37bd7..d87d442 100644 --- a/nursing-unit-system/nu-system-start/src/main/resources/application-dev.yml +++ b/nursing-unit-system/nu-system-start/src/main/resources/application-dev.yml @@ -361,3 +361,9 @@ justauth: type: default prefix: 'demo::' timeout: 1h + +# 微信 +wechat: + appId: wx8fc3e4305d2fbf0b + appSecret: 3bf3dd4ec72f591432db6b28c2c044e5 + diff --git a/nursing-unit-system/nu-system-start/src/main/resources/application-uat.yml b/nursing-unit-system/nu-system-start/src/main/resources/application-uat.yml index 5867baa..3fb93f8 100644 --- a/nursing-unit-system/nu-system-start/src/main/resources/application-uat.yml +++ b/nursing-unit-system/nu-system-start/src/main/resources/application-uat.yml @@ -1,5 +1,5 @@ server: - port: 8082 + port: 8080 tomcat: max-swallow-size: -1 error: @@ -7,7 +7,7 @@ server: include-stacktrace: ALWAYS include-message: ALWAYS servlet: - context-path: /nursing-unit-nacos + context-path: /nursing-unit compression: enabled: true min-response-size: 1024 @@ -360,3 +360,8 @@ justauth: type: default prefix: 'demo::' timeout: 1h + +# 微信 +wechat: + appId: wx8fc3e4305d2fbf0b + appSecret: 3bf3dd4ec72f591432db6b28c2c044e5 \ No newline at end of file diff --git a/pom.xml b/pom.xml index 8d18ae5..b5ccfb5 100644 --- a/pom.xml +++ b/pom.xml @@ -454,7 +454,7 @@ dev - true + false @@ -466,7 +466,7 @@ uat - false + true