diff --git a/src/main/java/com/bsd/say/controller/WechatController.java b/src/main/java/com/bsd/say/controller/WechatController.java index 6d15aa4..df24065 100644 --- a/src/main/java/com/bsd/say/controller/WechatController.java +++ b/src/main/java/com/bsd/say/controller/WechatController.java @@ -1,16 +1,16 @@ package com.bsd.say.controller; -import com.bsd.say.config.RedisProperies; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.bsd.say.beans.AjaxResult; import com.bsd.say.service.WxOpenServiceDemo; import com.bsd.say.service.impl.WeixinService; +import com.bsd.say.util.AESWithJCEUtils; +import com.bsd.say.util.HttpRequestUtils; import com.bsd.say.util.LogUtils; -import com.bsd.say.util.Xml2MapUtil; import com.bsd.say.util.wechat.AesException; -import com.bsd.say.util.wechat.WXBizMsgCrypt; -import com.sun.org.apache.bcel.internal.generic.NEW; import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.open.bean.message.WxOpenXmlMessage; -import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; import org.dom4j.DocumentException; import org.slf4j.Logger; @@ -18,21 +18,12 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.web.bind.annotation.*; -import org.w3c.dom.NodeList; -import org.xml.sax.InputSource; -import redis.clients.jedis.Jedis; -import redis.clients.jedis.JedisPool; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import java.io.BufferedReader; import java.io.IOException; import java.io.PrintWriter; -import java.io.StringReader; -import java.util.Map; @RestController @RequestMapping("wechat") @@ -134,9 +125,28 @@ public class WechatController { } @RequestMapping("test") - public void test(){ + public void test() { // Object o = redisTemplate.opsForValue().getOperations(); weixinService.refreshComponentAccessToken(); } + @RequestMapping("autologin") + public AjaxResult autoLogin(@RequestParam String openId) throws IOException { + + + String result1 = HttpRequestUtils.sendGet("https://api.weq.me/wx/token.php?id=15969759463491&key=1234567890123456"); + + JSONObject result2 = JSONObject.parseObject(result1); + String result3 = result2.getString("access_token"); + String pubkey = "1234567890123456"; + String iv = "WJi7HTZQoh8eHjup"; + String decode = AESWithJCEUtils.aesDecode(result3, pubkey, iv); + String resutl = HttpRequestUtils.sendGet("https://api.weixin.qq.com/cgi-bin/user/info?access_token=" + decode + "&openid=" + openId + "&lang=zh_CN"); + JSONObject jsonObject = JSONObject.parseObject(resutl); + AjaxResult ajaxResult = new AjaxResult(); + ajaxResult.setData(jsonObject); + return ajaxResult; + } + + } diff --git a/src/main/java/com/bsd/say/util/AESWithJCEUtils.java b/src/main/java/com/bsd/say/util/AESWithJCEUtils.java new file mode 100644 index 0000000..4b19627 --- /dev/null +++ b/src/main/java/com/bsd/say/util/AESWithJCEUtils.java @@ -0,0 +1,77 @@ +package com.bsd.say.util; + +import java.security.Key; +import java.security.Security; + +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.bouncycastle.util.encoders.Base64; + +public class AESWithJCEUtils { + + /** + * 第三方提供Token的URL: http://XXX + * @param args + */ + public static void main(String[] args) { + String pubkey = "1234567890123456"; + String iv = "WJi7HTZQoh8eHjup"; + String content ="pnHNKu5KCZibpf2iKU7YqYp4TXtDjaV/cvD1E1YlgLjXU9eDzClRa70AgEIvEuPo+A4F8ZwkWeWLjKhFVReywxNdGwXWZy9Hj7CVhTnmkyQ2wo0dLTY+IiC/HPdxPrpCeGuPRABpZjQ+S33VQSP1vywIoKEmTPGU2JSbu0tGiOsZYk3Lhq7vJ3TMljhq0k8R5j5yBYNMgd3Az9+7+LfIZw=="; + +// String encode = aesEncode(content, pubkey, iv); +// System.out.println(encode); + + String decode = aesDecode(content, pubkey, iv); + System.out.println(decode); + + } + + /** + * 加密方法 + * @param content - 需要加密的串 + * @param pubKey - 秘钥,即API接口中的参数key(随机的16位数字) + * @param iv - IV向量,固定的16字节串,加密方要告诉解密方该值 + * @return + */ + public static String aesEncode(String content, String pubKey, String iv){ + try{ + Security.addProvider(new BouncyCastleProvider()); + Key key = new SecretKeySpec(pubKey.getBytes(), "AES"); + Cipher in = Cipher.getInstance("AES/CBC/PKCS5Padding"); + in.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv.getBytes())); + byte[] enc = in.doFinal(content.getBytes()); + String result = (new String(Base64.encode(enc))).replaceAll("\n", ""); + + return result; + }catch(Exception ex){ + ex.printStackTrace(); + return null; + } + } + /** + * 解密方法 + * @param mima - 需要解密的串 + * @param pubKey - 秘钥,即API接口中的参数key + * @param iv - IV向量,固定的16字节串,接口提供方提供该值 + * @return + */ + public static String aesDecode(String mima, String pubKey, String iv){ + try{ + Security.addProvider(new BouncyCastleProvider()); + Key key = new SecretKeySpec(pubKey.getBytes(), "AES"); + Cipher out = Cipher.getInstance("AES/CBC/PKCS5Padding"); + out.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv.getBytes())); + byte[] dec = out.doFinal(Base64.decode(mima)); + String result = new String(dec); + + return result; + }catch(Exception ex){ + ex.printStackTrace(); + return null; + } + } + +} \ No newline at end of file diff --git a/src/main/java/com/bsd/say/util/MessageUtil.java b/src/main/java/com/bsd/say/util/MessageUtil.java new file mode 100644 index 0000000..dd719ed --- /dev/null +++ b/src/main/java/com/bsd/say/util/MessageUtil.java @@ -0,0 +1,145 @@ +package com.bsd.say.util; +import java.io.InputStream; +import java.io.Writer; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.dom4j.Document; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; + +import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.core.util.QuickWriter; +import com.thoughtworks.xstream.io.HierarchicalStreamWriter; +import com.thoughtworks.xstream.io.xml.PrettyPrintWriter; +import com.thoughtworks.xstream.io.xml.XppDriver; + +/** + * ClassName: MessageUtil + * @Description: 消息工具类 + * @author dapengniao + * @date 2016年3月7日 上午10:05:04 + */ +public class MessageUtil { + + /** + * 返回消息类型:文本 + */ + public static final String RESP_MESSAGE_TYPE_TEXT = "text"; + + /** + * 返回消息类型:音乐 + */ + public static final String RESP_MESSAGE_TYPE_MUSIC = "music"; + + /** + * 返回消息类型:图文 + */ + public static final String RESP_MESSAGE_TYPE_NEWS = "news"; + + /** + * 请求消息类型:文本 + */ + public static final String REQ_MESSAGE_TYPE_TEXT = "text"; + + /** + * 请求消息类型:图片 + */ + public static final String REQ_MESSAGE_TYPE_IMAGE = "image"; + + /** + * 请求消息类型:链接 + */ + public static final String REQ_MESSAGE_TYPE_LINK = "link"; + + /** + * 请求消息类型:地理位置 + */ + public static final String REQ_MESSAGE_TYPE_LOCATION = "location"; + + /** + * 请求消息类型:音频 + */ + public static final String REQ_MESSAGE_TYPE_VOICE = "voice"; + + /** + * 请求消息类型:推送 + */ + public static final String REQ_MESSAGE_TYPE_EVENT = "event"; + + /** + * 事件类型:subscribe(订阅) + */ + public static final String EVENT_TYPE_SUBSCRIBE = "subscribe"; + + /** + * 事件类型:unsubscribe(取消订阅) + */ + public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe"; + + /** + * 事件类型:CLICK(自定义菜单点击事件) + */ + public static final String EVENT_TYPE_CLICK = "CLICK"; + + /** + * @Description: 解析微信发来的请求(XML) + * @param @param request + * @param @return + * @param @throws Exception + * @author dapengniao + * @date 2016年3月7日 上午10:04:02 + */ + @SuppressWarnings("unchecked") + public static Map parseXml(HttpServletRequest request) throws Exception { + // 将解析结果存储在HashMap中 + Map map = new HashMap(); + + // 从request中取得输入流 + InputStream inputStream = request.getInputStream(); + // 读取输入流 + SAXReader reader = new SAXReader(); + Document document = reader.read(inputStream); + // 得到xml根元素 + Element root = document.getRootElement(); + // 得到根元素的所有子节点 + List elementList = root.elements(); + + // 遍历所有子节点 + for (Element e : elementList) + map.put(e.getName(), e.getText()); + + // 释放资源 + inputStream.close(); + inputStream = null; + + return map; + } + + @SuppressWarnings("unused") + private static XStream xstream = new XStream(new XppDriver() { + public HierarchicalStreamWriter createWriter(Writer out) { + return new PrettyPrintWriter(out) { + // 对所有xml节点的转换都增加CDATA标记 + boolean cdata = true; + @SuppressWarnings("rawtypes") + public void startNode(String name, Class clazz) { + super.startNode(name, clazz); + } + + protected void writeText(QuickWriter writer, String text) { + if (cdata) { + writer.write(""); + } else { + writer.write(text); + } + } + }; + } + }); +} \ No newline at end of file