微信公众平台开发入门教程(图文详解)

<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;
	}
	




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章