<pre name="code" class="java">1.由于微信的大热,为了更好的方便使用微信的用户查询一些信息,这篇文章是入门级的微信公众平台开发教程,需要的朋友可以参考下
简介
公众平台消息接口为开发者提供了一种新的消息处理方式。
申请消息接口
点击申请,填写网址url和token,其中token可由开发者可以任意填写,用作生成签名。
网址接入
公众平台用户提交信息后,微信服务器将发送GET请求到填写的URL上,并且带上四个参数:
参数 | 描述 |
---|---|
signature | 微信加密签名 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,否则接入失败。
signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
加密/校验流程: 1. 将token、timestamp、nonce三个参数进行字典序排序 2. 将三个参数字符串拼接成一个字符串进行sha1加密 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信1.程序验证代码如下
@RequestMapping("/index")
public String weixinService(HttpServletRequest request,
HttpServletResponse response) {
try {
String method = request.getMethod();
if ("GET".equals(method)) {
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
String token = request.getParameter("token");
if (echostr != null && !"".equals(echostr)) {
echostr = checkAuthentication(signature, timestamp, nonce,echostr,token);
// 验证通过返回随即字串
response.getWriter().write(echostr);
response.getWriter().flush();
}
} else {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
// 调用核心业务类接收消息、处理消息
String respMessage = coreService.processRequest(request);
// 响应消息
if (null != respMessage) {
response.getWriter().write(respMessage);
response.getWriter().flush();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* Function:微信验证方法
*
* @author JLC
* @param signature
* 微信加密签名
* @param timestamp
* 时间戳
* @param nonce
* 随机数
* @param echostr
* 随机字符串
* @return
*/
private String checkAuthentication(String signature, String timestamp,
String nonce, String echostr,String token) {
String result = "";
// 将获取到的参数放入数组
String[] ArrTmp = { token, timestamp, nonce };
// 按微信提供的方法,对数据内容进行排序
Arrays.sort(ArrTmp);
StringBuffer sb = new StringBuffer();
for (int i = 0; i < ArrTmp.length; i++) {
sb.append(ArrTmp[i]);
}
// 对排序后的字符串进行SHA-1加密
String pwd = Encrypt(sb.toString());
if (pwd.equals(signature)) {
try {
result = echostr;
} catch (Exception e) {
e.printStackTrace();
}
} else {
System.out.println("微信平台签名消息验证失败!");
}
return result;
}
/**
* 用SHA-1算法加密字符串并返回16进制串
* @param strSrc
* @return
*/
private String Encrypt(String strSrc) {
MessageDigest md = null;
String strDes = null;
byte[] bt = strSrc.getBytes();
try {
md = MessageDigest.getInstance("SHA-1");
md.update(bt);
strDes = bytes2Hex(md.digest());
} catch (NoSuchAlgorithmException e) {
System.out.println("错误");
return null;
}
return strDes;
}
private String bytes2Hex(byte[] bts) {
String des = "";
String tmp = null;
for (int i = 0; i < bts.length; i++) {
tmp = (Integer.toHexString(bts[i] & 0xFF));
if (tmp.length() == 1) {
des += "0";
}
des += tmp;
}
return des;
}