springMVC中微信公众平台开发
2015-07-23 12:09
597 查看
码农的世界
期待各位码友在欣赏我的无私创作之时,也请大家多多支持我码农的世界,谢谢各位!
service
sha1加密类
Controller类
以上代码即可实现通过springmvc的方式和微信公众平台token对接。需要的相对应jar包,请自行下载。找不到的留言,我会提供。
码农的世界
期待各位码友在欣赏我的无私创作之时,也请大家多多支持我码农的世界,谢谢各位!
期待各位码友在欣赏我的无私创作之时,也请大家多多支持我码农的世界,谢谢各位!
service
package cn.bluemobi.service; import java.util.Arrays; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import cn.bluemobi.entity.weixin.CheckModel; import cn.bluemobi.util.sha1; /** * Description: <br/> * Date: 2015年7月8日 下午12:05:54 <br/> * * @author fang * @version * @see */ @Service public class TokenService { /** * 微信开发者验证 * * @param wxAccount * * @param signature * @param timestamp * @param nonce * @param echostr * @return */ @Transactional public String validate(String wxToken, CheckModel tokenModel) { String signature = tokenModel.getSignature(); String timestamp = tokenModel.getTimestamp(); String nonce = tokenModel.getNonce(); String echostr = tokenModel.getEchostr(); if (signature != null && timestamp != null & nonce != null) { String[] str = { wxToken, timestamp + "", nonce + "" }; Arrays.sort(str); // 字典序排序 String bigStr = str[0] + str[1] + str[2]; // SHA1加密 String digest = sha1.encode("SHA1", bigStr).toLowerCase(); // 确认请求来至微信 if (digest.equals(signature)) { // 最好此处将echostr存起来,以后每次校验消息来源都需要用到 return echostr; } } return "error"; } }
sha1加密类
package cn.bluemobi.util; import java.io.InputStream; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.Arrays; 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; /** * * 验证微信响应过来的参数以及拼接成字符串进行sha1加密 <br/> * date: 2015年7月7日 下午4:44:51 <br/> * * @author fang * @version */ public class sha1 { // 与接口配置信息中的Token要一致 private static String token = "2013wh"; /** * 验证微信响应过来的参数以及拼接成字符串进行sha1加密 * * @param signature * @param timestamp * @param nonce * @return */ public static boolean checkSignature(String signature, String timestamp, String nonce) { String[] arr = new String[] { token, timestamp, nonce }; // 将token、timestamp、nonce三个参数进行字典序排序 Arrays.sort(arr); StringBuilder content = new StringBuilder(); for (int i = 0; i < arr.length; i++) { content.append(arr[i]); } MessageDigest md = null; String tmpStr = null; try { md = MessageDigest.getInstance("SHA-1"); // 将三个参数字符串拼接成一个字符串进行sha1加密 byte[] digest = md.digest(content.toString().getBytes()); tmpStr = byteToStr(digest); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } content = null; // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信 return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false; } /** * 将字节转换为十六进制字符串 * * @param mByte * @return */ private static String byteToHexStr(byte mByte) { char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; char[] tempArr = new char[2]; tempArr[0] = Digit[(mByte >>> 4) & 0X0F]; tempArr[1] = Digit[mByte & 0X0F]; String s = new String(tempArr); return s; } /** * 将字节数组转换为十六进制字符串 * * @param byteArray * @return */ private static String byteToStr(byte[] byteArray) { String strDigest = ""; for (int i = 0; i < byteArray.length; i++) { strDigest += byteToHexStr(byteArray[i]); } return strDigest; } /** * 解析XML * * * @param req * @return */ public static Map<String, String> parseWikiMsg(HttpServletRequest req) throws Exception { // 将解析结果存储在HashMap中 Map<String, String> map = new HashMap<String, String>(); // 从request中取得输入流 InputStream inputStream = req.getInputStream(); // 读取输入流 SAXReader reader = new SAXReader(); Document document = reader.read(inputStream); // 得到xml根元素 Element root = document.getRootElement(); // 得到根元素的所有子节点 List<Element> elementList = root.elements(); // 遍历所有子节点 for (Element e : elementList) map.put(e.getName(), e.getText()); // 释放资源 inputStream.close(); inputStream = null; return map; } /** * @author fanglf 需要微信端自行输入token,也就是随意输入token。 */ private static final String ALGORITHM = "MD5"; private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; /** * encode string * * @param algorithm * @param str * @return String */ public static String encode(String algorithm, String str) { if (str == null) { return null; } try { MessageDigest messageDigest = MessageDigest.getInstance(algorithm); messageDigest.update(str.getBytes()); return getFormattedText(messageDigest.digest()); } catch (Exception e) { throw new RuntimeException(e); } } /** * encode By MD5 * * @param str * @return String */ public static String encodeByMD5(String str) { if (str == null) { return null; } try { MessageDigest messageDigest = MessageDigest.getInstance(ALGORITHM); messageDigest.update(str.getBytes()); return getFormattedText(messageDigest.digest()); } catch (Exception e) { throw new RuntimeException(e); } } /** * Takes the raw bytes from the digest and formats them correct. * * @param bytes the raw bytes from the digest. * @return the formatted bytes. */ private static String getFormattedText(byte[] bytes) { int len = bytes.length; StringBuilder buf = new StringBuilder(len * 2); // 把密文转换成十六进制的字符串形式 for (int j = 0; j < len; j++) { buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]); buf.append(HEX_DIGITS[bytes[j] & 0x0f]); } return buf.toString(); } }
Controller类
/** * Project Name:xbrcw * File Name:TokenController.java * Package Name:cn.bluemobi.controller.weixin * Date:2015年7月8日下午12:04:57 * Copyright (c) 2015, bluemobi.cn All Rights Reserved. * */ package cn.bluemobi.controller.weixin; import java.io.IOException; import java.io.PrintWriter; import java.text.ParseException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import cn.bluemobi.MicroServiceUtil.MicroServiceUtil; import cn.bluemobi.entity.weixin.CheckModel; import cn.bluemobi.service.TokenService; /** * Description: <br/> * Date: 2015年7月8日 下午12:04:57 <br/> * * @author fang * @version * @see */ @Controller @RequestMapping("/wechat") public class TokenController { @Autowired private TokenService tokenService; // private Logger log = Logger.getLogger(TokenController.class); /** * 开发者模式token校验 * * @param wxAccount 开发者url后缀 * @param response * @param tokenModel * @throws ParseException * @throws IOException */ @RequestMapping(method = { RequestMethod.GET }) @ResponseBody public String validate(String wxToken, CheckModel tokenModel) throws ParseException, IOException { return tokenService.validate(wxToken, tokenModel); } /** * 微信消息的处理 * * @param request * @param out * @throws IOException */ @RequestMapping(method = { RequestMethod.POST }) public void dispose(HttpServletRequest request, HttpServletResponse response) throws IOException { /* 消息的接收、处理、响应 */ // 将请求、响应的编码均设置为UTF-8(防止中文乱码) request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); // 调用核心业务类接收消息、处理消息 String respMessage = MicroServiceUtil.processRequest(request); // log.info(respMessage); // 响应消息 PrintWriter out = response.getWriter(); out.print(respMessage); out.close(); } }
以上代码即可实现通过springmvc的方式和微信公众平台token对接。需要的相对应jar包,请自行下载。找不到的留言,我会提供。
码农的世界
期待各位码友在欣赏我的无私创作之时,也请大家多多支持我码农的世界,谢谢各位!
相关文章推荐
- Java语言系列02——Lexical Grammar (词法)介绍
- springmvc拦截器启动报错
- JAVA中通过代码操作PC内容进行功能的实现
- Java语言系列01——索引
- 刚学的Struts2的一些结构
- java中清空session
- inner class DEMO(quote from Head First Java 2e)
- JavaIO之删除指定目录(递归删除,先删除目录下的文件再删除目录)
- java null
- Eclipse jetty
- java中sleep()和wait()的区别?
- struts2 ajax jsonp跨域
- 中文化和国际化问题权威解析之四:Java中文化和国际化攻略
- 中文化和国际化问题权威解析之三:Java中文问题分析
- 中文化和国际化问题权威解析之二:Java国际化基础
- 如何准确判断邮件地址是否存在
- 贝叶斯的JAVA分类器实现
- Java设计模式 Bridge(桥接)Adapter,command,State,Mediator,Facade
- Java中JDK的安装和path,classpath的环境配置 Android集成开发环境配置
- Java调用动态库方法说明