您的位置:首页 > 编程语言 > Java开发

springMVC中微信公众平台开发

2015-07-23 12:09 597 查看
码农的世界

期待各位码友在欣赏我的无私创作之时,也请大家多多支持我码农的世界,谢谢各位!

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包,请自行下载。找不到的留言,我会提供。

码农的世界

期待各位码友在欣赏我的无私创作之时,也请大家多多支持我码农的世界,谢谢各位!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: