微信开发 PC搭建服务器 开发 微信公众号【Java版本】

(1): 注册一个花生壳 ,并且配好 路由器 外网映射 80 端口 【微信只能接受 80端口 】


(2):编写一个 Servlet  响应  微信响应的URL  【Token的要与代码的Token一致】


package com.servlet;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.logging.Logger;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.json.JSONObject;
import net.sf.json.xml.XMLSerializer;

public class WeixinServlet extends HttpServlet {

	private Logger log = Logger.getLogger(this.getClass().getName());
	private static final long serialVersionUID = 1L;
	private String Token;
	private String echostr;

	@Override
	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		connect(request, response);
	}

	@Override
	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		message(request, response);
	}

	/** 
	 *@author haibing.xiao 
	 *@return   
	 *@exception  
	 *@param 
	 *  
	 * <p>接入连接生效验证</p> 
	 */
	private void connect(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		log.info("RemoteAddr: " + request.getRemoteAddr());
		log.info("QueryString: " + request.getQueryString());
		if (!accessing(request, response)) {
			log.info("服务器接入失败.......");
			return;
		}
		String echostr = getEchostr();
		if (echostr != null && !"".equals(echostr)) {
			log.info("服务器接入生效..........");
			PrintWriter out = response.getWriter();
			out.print(echostr);//完成相互认证  
		}
	}

	/** 
	 * @author haibing.xiao 
	 * Date 2013-05-29 
	 * @return boolean 
	 * @exception ServletException, IOException 
	 * @param 
	 * 
	 *<p>用来接收微信公众平台的验证</p>  
	 */
	private boolean accessing(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		String signature = request.getParameter("signature");
		String timestamp = request.getParameter("timestamp");
		String nonce = request.getParameter("nonce");
		String echostr = request.getParameter("echostr");
		if (isEmpty(signature)) {
			return false;
		}
		if (isEmpty(timestamp)) {
			return false;
		}
		if (isEmpty(nonce)) {
			return false;
		}
		if (isEmpty(echostr)) {
			return false;
		}
		String[] ArrTmp = { Token, timestamp, nonce };
		Arrays.sort(ArrTmp);
		StringBuffer sb = new StringBuffer();
		for (int i = 0; i < ArrTmp.length; i++) {
			sb.append(ArrTmp[i]);
		}
		String pwd = Encrypt(sb.toString());

		log.info("signature:" + signature + "timestamp:" + timestamp + "nonce:"
				+ nonce + "pwd:" + pwd + "echostr:" + echostr);

		if (trim(pwd).equals(trim(signature))) {
			log.info("响应token");
			this.echostr = echostr;
			return true;
		} else {
			return false;
		}
	}

	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()); //to HexString  
		} catch (NoSuchAlgorithmException e) {
			System.out.println("Invalid algorithm.");
			return null;
		}
		return strDes;
	}

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

	public String getEchostr() {
		return echostr;
	}

	/** 
	 *@author haibing.xiao 
	 *@return   
	 *@exception ServletException, IOException 
	 *@param 
	 *  
	 * <p>XML组装组件</p> 
	 */
	private void message(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		InputStream is = request.getInputStream();
		// 取HTTP请求流长度  
		int size = request.getContentLength();
		// 用于缓存每次读取的数据  
		byte[] buffer = new byte[size];
		// 用于存放结果的数组  
		byte[] xmldataByte = new byte[size];
		int count = 0;
		int rbyte = 0;
		// 循环读取  
		while (count < size) {
			// 每次实际读取长度存于rbyte中  
			rbyte = is.read(buffer);
			for (int i = 0; i < rbyte; i++) {
				xmldataByte[count + i] = buffer[i];
			}
			count += rbyte;
		}
		is.close();
		String requestStr = new String(xmldataByte, "UTF-8");
		System.out.println("requestStr" + requestStr);

		try {
			manageMessage(requestStr, request, response);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	/** 
	 * @author haibing.xiao 
	 * @return  
	 * @exception ServletException, IOException 
	 * @param 
	 *  
	 * <p>业务转发组件</p> 
	 *  
	 */
	private void manageMessage(String requestStr, HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		String responseStr;

		try {
			System.out.println("---------------------------");
			XMLSerializer xmlSerializer = new XMLSerializer();
			JSONObject jsonObject = (JSONObject) xmlSerializer.read(requestStr);

			String msgtype = jsonObject.getString("MsgType");

			System.out.println("---------------------------");
			System.out.println("msgtype" + msgtype);

			responseStr = creatRevertText(jsonObject);//创建XML  
			log.info("responseStr:" + responseStr);
			OutputStream os = response.getOutputStream();
			os.write(responseStr.getBytes("UTF-8"));
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	private String creatRevertText(JSONObject jsonObject) {
		StringBuffer revert = new StringBuffer();
		revert.append("<xml>");
		revert.append("<ToUserName><![CDATA[" + jsonObject.get("FromUserName")
				+ "]]></ToUserName>");
		revert.append("<FromUserName><![CDATA[" + jsonObject.get("ToUserName")
				+ "]]></FromUserName>");
		revert.append("<CreateTime>" + jsonObject.get("CreateTime")
				+ "</CreateTime>");
		revert.append("<MsgType><![CDATA[text]]></MsgType>");
		revert.append("<Content><![CDATA[" + jsonObject.get("Content")
				+ "]]></Content>");
		revert.append("<FuncFlag>0</FuncFlag>");
		revert.append("</xml>");
		return revert.toString();
	}

	@Override
	public void init() throws ServletException {
		Token = "test123";
	}

	private boolean isEmpty(String str) {
		return null == str || "".equals(str) ? true : false;
	}

	private String trim(String str) {
		return null != str ? str.trim() : str;
	}

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值