master
ck 5 years ago
parent 7c3aa8b815
commit 809a56390b

@ -193,6 +193,12 @@
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
</dependencies>
<build>

@ -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<String, Object> 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();
}
}
}

@ -34,7 +34,7 @@ public class WeixinService {
* accessToken
*/
public void refreshComponentAccessToken(){
Map<String, String> reMap;
// Map<String, String> 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("微信开放平台,第三方平台获取【令牌】失败");

@ -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 201936 4:29:13
*/
public class Xml2MapUtil {
public static Map<String, Object> xml2map(String xml){
Map<String, Object> rootmap = new HashMap<>();
if(StringUtils.isBlank(xml)){
return rootmap;
}
try{
Document doc;
doc = DocumentHelper.parseText(xml);
Map<String, Object> 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<String, Object> xml2map2(Element _elem) {
Map<String, Object> result = new HashMap<>();
String _elemName = _elem.getName();
// String _elemAttriName = _elem.attributeValue("name");
List<Element> list = _elem.elements();
// if (!"struct".equals(_elemName) && !"field".equals(_elemName) && (null == list || list.size() <= 0)) {
// return result;
// }
if ("array".equals(_elemName)) {
List<Map<String,Object>> 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<key,value>
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<String, Object> xml2map22(Element _elem) {
Map<String, Object> result = new HashMap<>();
List<Element> 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;
}
}

@ -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();
}
}

@ -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=

Loading…
Cancel
Save