From 809a56390b8ed4dd6c845b976a60fcd4bd6f5e8f Mon Sep 17 00:00:00 2001 From: ck <851316342@qq.com> Date: Tue, 4 Aug 2020 18:00:21 +0800 Subject: [PATCH] up --- pom.xml | 6 + .../bsd/say/controller/WechatController.java | 87 +++++- .../bsd/say/service/impl/WeixinService.java | 3 +- .../java/com/bsd/say/util/Xml2MapUtil.java | 255 ++++++++++++++++++ .../com/bsd/say/util/wechat/WeChatUtils.java | 25 ++ src/main/resources/application.yml | 4 +- 6 files changed, 369 insertions(+), 11 deletions(-) create mode 100644 src/main/java/com/bsd/say/util/Xml2MapUtil.java create mode 100644 src/main/java/com/bsd/say/util/wechat/WeChatUtils.java diff --git a/pom.xml b/pom.xml index 0a4f141..e90d187 100644 --- a/pom.xml +++ b/pom.xml @@ -193,6 +193,12 @@ junit 4.12 + + + dom4j + dom4j + 1.6.1 + diff --git a/src/main/java/com/bsd/say/controller/WechatController.java b/src/main/java/com/bsd/say/controller/WechatController.java index 0798b00..8e5c457 100644 --- a/src/main/java/com/bsd/say/controller/WechatController.java +++ b/src/main/java/com/bsd/say/controller/WechatController.java @@ -1,23 +1,92 @@ package com.bsd.say.controller; +import com.bsd.say.util.LogUtils; import com.bsd.say.util.ResponseUtil; +import com.bsd.say.util.Xml2MapUtil; +import com.bsd.say.util.wechat.AesException; +import com.bsd.say.util.wechat.WXBizMsgCrypt; +import com.bsd.say.util.wechat.WeChatUtils; +import org.apache.commons.collections.MapUtils; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.BufferedReader; +import java.io.IOException; +import java.io.PrintWriter; +import java.util.HashMap; +import java.util.Map; @RestController @RequestMapping("wechat") public class WechatController { -// /** -// * 接收component_verify_ticket 或 authorized事件 -// */ -// @RequestMapping(value = "/getComponentVerifyTicket") -// @ResponseBody -// public String getComponentVerifyTicket(@RequestParam("timestamp")String timestamp, @RequestParam("nonce")String nonce, -// @RequestParam("msg_signature")String msgSignature, @RequestBody String postData){ -// -// } + @Value("${wechat.aesKey}") + private String aesKey; + @Value("${wechat.componentToken}") + private String componentToken; + @Value("${wechat.appId}") + private String appId; + @Resource + private RedisTemplate redisTemplate; + Logger logger = LogUtils.getBussinessLogger(); + /** + * 接收component_verify_ticket 或 authorized事件 + */ + @RequestMapping(value = "/getComponentVerifyTicket") + @ResponseBody + public String getComponentVerifyTicket(@RequestParam("timestamp")String timestamp, @RequestParam("nonce")String nonce, + @RequestParam("msg_signature")String msgSignature, @RequestBody String postData) throws IOException { + +// logger.info("接收component_verify_ticket 或 authorized事件"); +// String nonce = request.getParameter("nonce"); +// String timestamp = request.getParameter("timestamp"); +// String msgSignature = request.getParameter("msg_signature"); + +// StringBuilder sb = new StringBuilder(); +// BufferedReader in = request.getReader(); +// String line; +// while((line = in.readLine()) != null) { +// sb.append(line); +// } + System.out.println("nonce: " + nonce); + System.out.println("timestamp: " + timestamp); + System.out.println("msgSignature: " + msgSignature); + System.out.println("postData: " + postData); + try { + //这个类是微信官网提供的解密类,需要用到消息校验Token 消息加密Key和服务平台appid + WXBizMsgCrypt pc = new WXBizMsgCrypt(componentToken, + aesKey, appId); + String xml = pc.decryptMsg(msgSignature, timestamp, nonce, postData); + Map result = Xml2MapUtil.xml2map(xml);// 将xml转为map + + String componentVerifyTicket = MapUtils.getString(result, "ComponentVerifyTicket"); + // 存储平台授权票据,保存ticket + String TICKET = componentVerifyTicket; + redisTemplate.opsForValue().set("component_verify_ticket",TICKET); + } catch (Exception e) { +// log.error(e.getMessage(), e); + e.printStackTrace(); + } + return "success"; + } + + + + @RequestMapping(value="/{appid}/callback",method={RequestMethod.GET,RequestMethod.POST}) + public void callBackEvent(@PathVariable String appid, + HttpServletResponse response,HttpServletRequest request){ + try { + logger.info(appid+"进入callback+++++++++++++++++++++++++++++++++"); +// handleMessage(request,response); + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } } diff --git a/src/main/java/com/bsd/say/service/impl/WeixinService.java b/src/main/java/com/bsd/say/service/impl/WeixinService.java index 2d4e97a..5b701ce 100644 --- a/src/main/java/com/bsd/say/service/impl/WeixinService.java +++ b/src/main/java/com/bsd/say/service/impl/WeixinService.java @@ -34,7 +34,7 @@ public class WeixinService { * 刷新第三方accessToken */ public void refreshComponentAccessToken(){ - Map reMap; +// Map reMap; try { // 核心定时器,每一个小时执行一次 String ComponentVerifyTicket = redisTemplate.opsForValue().get("component_verify_ticket").toString(); @@ -49,6 +49,7 @@ public class WeixinService { if (StringUtils.isNotEmpty(componentAccessToken)) { redisTemplate.opsForValue().set("component_access_token", componentAccessToken, 60 * 60 * 2, TimeUnit.SECONDS); String accessToken = redisTemplate.opsForValue().get("component_access_token").toString(); + System.out.println("accessToken"+accessToken); // logger.debug("====================令牌component_access_token】:【" + accessToken + "】===================="); } else { throw new RuntimeException("微信开放平台,第三方平台获取【令牌】失败"); diff --git a/src/main/java/com/bsd/say/util/Xml2MapUtil.java b/src/main/java/com/bsd/say/util/Xml2MapUtil.java new file mode 100644 index 0000000..ec6e499 --- /dev/null +++ b/src/main/java/com/bsd/say/util/Xml2MapUtil.java @@ -0,0 +1,255 @@ +package com.bsd.say.util; + + +import org.apache.commons.lang3.StringUtils; +import org.dom4j.Document; +import org.dom4j.DocumentHelper; +import org.dom4j.Element; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + + + +/** + * @version 1.0 + * @date 创建时间:2019年3月6日 下午4:29:13 + */ +public class Xml2MapUtil { + + public static Map xml2map(String xml){ + Map rootmap = new HashMap<>(); + if(StringUtils.isBlank(xml)){ + return rootmap; + } + try{ + Document doc; + doc = DocumentHelper.parseText(xml); + Map map = new HashMap<>(); + if (doc == null) + return map; + Element rootElement = doc.getRootElement(); + map = xml2map2(rootElement); + rootmap.put(rootElement.getName(), map); + }catch(Exception e){ + e.printStackTrace(); + } + + return rootmap; + } + + private static Map xml2map2(Element _elem) { + Map result = new HashMap<>(); + + String _elemName = _elem.getName(); + // String _elemAttriName = _elem.attributeValue("name"); + + List list = _elem.elements(); + +// if (!"struct".equals(_elemName) && !"field".equals(_elemName) && (null == list || list.size() <= 0)) { +// return result; +// } + + if ("array".equals(_elemName)) { + List> arayList = new ArrayList<>(); + for (int i = 0;list != null && i < list.size(); i++) { + Element elem = list.get(i); + arayList.add(xml2map2(elem)); + } + result.put(_elem.getParent().attributeValue("name"), arayList); + } + else if ("struct".equals(_elemName)) { + Map tempMap = new HashMap(); + for (int i = 0;list != null && i < list.size(); i++) { + Element elem = list.get(i); + tempMap.putAll(xml2map2(elem)); + } + Element __elem = _elem.getParent(); + if("data".equals(__elem.getName())){ + result.put(_elem.getParent().attributeValue("name"), tempMap); + } + if("array".equals(__elem.getName())){ + result.putAll(tempMap); + } + } + else if ("field".equals(_elemName)) { + result.put(_elem.getParent().attributeValue("name"), _elem.getStringValue()); + } + else if ("data".equals(_elemName)) { + for (int i = 0;list != null && i < list.size(); i++) { + Element elem = list.get(i); + String elemName = elem.getName(); + if ("field".equals(elemName)) { + //字段 map单个元素 + result = xml2map2(elem); + } + if ("struct".equals(elemName)) { + //对象 map1个元素(map) + result = xml2map2(elem); + } + if ("array".equals(elemName)) { + //数组 map1个元素(List<>) + result = xml2map2(elem); + } + } + } + else if ("body".equals(_elemName)) { + Map tempMap = new HashMap(); + for (int i = 0; list != null && i < list.size(); i++) { + Element elem = list.get(i); + tempMap.putAll(xml2map2(elem)); + } + result.put(_elemName, tempMap); + } + else if("service".equals(_elemName)){ + for (int i = 0;list != null && i < list.size(); i++) { + Element elem = list.get(i); + result.putAll(xml2map2(elem)); + } + } + else { + for (int i = 0; list != null && i < list.size(); i++) { + Element elem = list.get(i); + result=xml2map2(elem); + } + } + return result; + } + + private static Map xml2map22(Element _elem) { + Map result = new HashMap<>(); + List list = _elem.elements(); + String _elemName = _elem.getName(); + String _elemAttriName = _elem.attributeValue("name"); + if (null == list || list.size() <= 0) { + return result; + } + + int size = list.size(); + for (int i = 0; i < size; i++) { + Element elem = list.get(i); + + String nodeName = elem.getName().toString(); + String nodeAttriName = elem.attributeValue("name"); + if ("struct".equals(nodeName)) { + List subNodes = elem.elements(); + if (null != subNodes && subNodes.size() != 0) { + Map subMap; + for (int j = 0; j < subNodes.size(); j++) { + Element subElem = (Element) subNodes.get(j); + subMap = xml2map2(subElem); + result.putAll(subMap); + } + } else { + // result = new HashMap<>(); + } + } else if ("data".equals(nodeName)) { + List subNodes = elem.elements(); + if (null != subNodes && subNodes.size() > 0) { + for (int j = 0; j < subNodes.size(); j++) { + Element subElem = (Element) subNodes.get(j); + String subNodeAttriName = subElem.attributeValue("name"); + String subNodeName = subElem.getName(); + if ("struct".equals(subNodeName)) { + Map subMap = xml2map2(subElem); + result.put(nodeAttriName, subMap); + } + if ("array".equals(subNodeName)) { + List arrayList = (ArrayList) result.get(nodeAttriName); + if (null == arrayList) { + arrayList = new ArrayList(); + arrayList.add(xml2map2(elem)); + result.put(nodeAttriName, arrayList); + } else { + arrayList.add(xml2map2(elem)); + result.put(nodeAttriName, arrayList); + } + } + if ("field".equals(subNodeName)) { + result.putAll(xml2map2(elem)); + } + + } + } + } else if ("field".equals(nodeName)) { + String nodeAttriType = elem.attributeValue("type"); + if ("string".equals(nodeAttriType)) { + result.put(_elemAttriName, elem.getStringValue()); + } else { + result.put(_elemAttriName, elem.getStringValue()); + } + } else if ("array".equals(nodeName)) { + result.putAll(xml2map2(elem)); + } else if ("body".equals(nodeName)) { + Map subMap = xml2map2(elem); + result.put(nodeName, subMap); + } else { + if (elem.elements() != null && elem.elements().size() > 0) { + Map subMap = xml2map2(elem); + result.putAll(subMap); + } else { + String nodeText = elem.getText().trim(); + if (isEmpty(nodeText)) { + result.put(nodeName, null); + } else { + result.put(nodeName, nodeText); + } + } + } + } + + return result; + } + + +// } +// // TODO +// Map arrayMap = new HashMap(); +// temp.add(arrayMap); +// +// List subNodes = elem.elements(); +// if (null !=subNodes && subNodes.size() > 0) { +// for (int j = 0; j < subNodes.size(); j++) { +// Element subElem = (Element) subNodes.get(j); +// String subNodeName = subElem.getName(); +// subNodeName = subNodeName.toLowerCase(Locale.ENGLISH); +// List arrayList = (ArrayList)arrayMap.get(subNodeName); +// if(null == arrayList){ +// arrayList = new ArrayList(); +// arrayMap.put(subNodeName, arrayList); +// } +// +// Map subMap = xml2map2(subElem); +// arrayList.add(subMap); +// } +// } + + public static boolean isEmpty(String text) { + return text != null && !"".equals(text); + } + + private static String readString3() { + + String str ; + File file = new File("E:\\work\\众邦银行众易贷\\9、ESB\\request_std.xml"); + try { + FileInputStream in = new FileInputStream(file); + // size 为字串的长度 ,这里一次性读完 + int size = in.available(); + byte[] buffer = new byte[size]; + in.read(buffer); + in.close(); + str = new String(buffer, "utf-8"); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return null; + } + return str; + } +} diff --git a/src/main/java/com/bsd/say/util/wechat/WeChatUtils.java b/src/main/java/com/bsd/say/util/wechat/WeChatUtils.java new file mode 100644 index 0000000..ce62f29 --- /dev/null +++ b/src/main/java/com/bsd/say/util/wechat/WeChatUtils.java @@ -0,0 +1,25 @@ +package com.bsd.say.util.wechat; + +import org.apache.commons.lang3.StringUtils; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; + +public class WeChatUtils { + + + /** + * 统一回复微信服务器 + * @param response + * @param content + * @throws IOException + */ + public static void responseReplyMessage(HttpServletResponse response, String content) throws IOException { + PrintWriter pw = response.getWriter(); + pw.write(content); + pw.flush(); + pw.close(); + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 4ea6677..69401d7 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -44,8 +44,10 @@ award: rule: 5 wechat: + aesKey: R5sudie7ydu76shduy7wjdyuksu7d8fjdnsyduehwysd + componentToken: bosidengqixi appId: - componentAppId: + componentAppId: wxcd29dc3be20cbfc7 componentAppSecret: getComponentAccessTokenUrl: https://api.weixin.qq.com/cgi-bin/component/api_component_token getAccessTokenUrl: https://api.weixin.qq.com/sns/oauth2/component/access_token?appid=