微信公共平臺 JAVA server 例子

這個微信公共平臺是我很早之前寫的,大概是去年的八月份吧. 網上很多開發的例子都是用PHP 直接寫成的。

而現在網上都出現了免費的整體微信公共平臺.........所以搭建成本越來越低。

本文只打算介紹 java Servlet 接入 微信公共平臺, 很類似 一般的JAVA web工程.

下面是servlet 主類 

package org.luairan.weixin;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Arrays;

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

public class Weixin extends HttpServlet {

	private static final long serialVersionUID = -3351872544860340352L;
	private  static final String TOKEN="luairan";
	private static final String PUBLICUSER="";
	public Weixin() {
		super();
	}

	public void doGet(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");
		/*************************************************/
		StringBuilder sha1 = new StringBuilder();
		String[] ss = new String[] { TOKEN, timestamp, nonce };
		Arrays.sort(ss);
		for (String s : ss) {
			sha1.append(s);
		}
		/*************************************************/
		/*************************************************/
		SHA_1Coder sha = new SHA_1Coder();
		sha.setSourceString(sha1.toString());
		String result = sha.getResult();
		/*************************************************/
		/*************************************************/
		if (result.equals(signature))
			response.getWriter().write(echostr);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		/************************************************/
		/************************************************/
		ServletInputStream sis = request.getInputStream();
		WeiXinTool weixintool=new WeiXinTool();
		weixintool.getInfoFromServletInputStream(sis);
		sis.close();
		/************************************************/
		/************************************************/
		
		weixintool.proceduer();
		
		/************************************************/
		/************************************************/
		response.setCharacterEncoding("utf-8");
		PrintWriter out = response.getWriter();
		weixintool.writeTextMessage(out, PUBLICUSER);
		out.close();
	}
}



SHA_1Coder 類:

package org.luairan.weixin;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class SHA_1Coder {
	private String source=null;
	private byte[] byteArray=null;
	private String target=null;
	private MessageDigest md=null;
	public void setSourceString(String source){
		this.source=source;
	}
	public String getResult(){
		procedure();
		return target;
	}
	public SHA_1Coder(){
		
	}
	private void procedure() {
			try {
				md = MessageDigest.getInstance("SHA-1");
			} catch (NoSuchAlgorithmException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			byteArray = md.digest(source.getBytes());
		 target = bytetoString(byteArray);
	}
	
	public  String bytetoString(byte[] digest) {
		StringBuilder sb = new StringBuilder();
		String tempStr = "";
		for (int i = 0; i < digest.length; i++) {
			tempStr = (Integer.toHexString(digest[i] & 0xff));
			if (tempStr.length() == 1) {
				sb.append("0" + tempStr);
			} else {
				sb.append(tempStr);
			}
		}
		return sb.toString().toLowerCase();
	}
}

WeiXinTool 類:

package org.luairan.weixin;

import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.servlet.ServletInputStream;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.hibernate.Query;
import org.hibernate.Session;
import org.luairan.dao.Dao;
import org.luairan.dao.beam.HibernateSessionFactory;
import org.luairan.factory.DaoFactory;
import org.luairan.module.WeiXinDiscuss;

public class WeiXinTool {
	private Map<String, String> map = null;
	private String message=null;
	private Dao dao=DaoFactory.getDaoBean();
	public void getInfoFromServletInputStream(ServletInputStream sis) {
		map = null;
		SAXReader saxr = new SAXReader();
		try {
			map = new HashMap<String, String>();
			Document document = saxr.read(sis);
			Element er = document.getRootElement();
			Iterator<?> it = er.elementIterator();
			while (it.hasNext()) {
				Element temp = (Element) it.next();
				map.put(temp.getName(), temp.getText());
				System.out.println(temp.getName() + ":" + temp.getStringValue());
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}


	public void writeTextMessage(PrintWriter out, String publicUser) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss",Locale.SIMPLIFIED_CHINESE);
		out.write("<xml>");
		out.write("<ToUserName><![CDATA[" + map.get("FromUserName")+ "]]></ToUserName>");
		out.write("<FromUserName><![CDATA[" + publicUser+ "]]></FromUserName>");
		out.write("<CreateTime>" + sdf.format(new Date()) + "</CreateTime>");
		out.write("<MsgType><![CDATA[text]]></MsgType>");
		out.write("<Content><![CDATA[" + message + "]]></Content>");
		out.write("</xml>");
		out.flush();
	}

	@SuppressWarnings("unchecked")
	public void proceduer() {
		String msgtype = map.get("MsgType");
		if (msgtype.equals("event")) {
			message="歡迎關注該公共賬戶號~想吐槽食堂請直接輸入'餐廳(或窗口,菜品)'+空格+評分(1-100)+空格+評價 即可,輸入'最好吃'查看其他同學的分享";
		}
		if (msgtype.equals("text")) {
			String content=map.get("Content");
			
			String input[] =content.split(" ");
			for(String temp:input){
				System.out.println(temp);
			}
			boolean flag=false;
			int point=0;
			try {
				point=Integer.parseInt(input[1]);
				if(point>0&&point<100){
					Session session = HibernateSessionFactory.getSession();
					Long a=0L;
					try {
						Date a2=new Date();
						Calendar ca1=Calendar.getInstance();
						ca1.setTime(a2);
						ca1.add(Calendar.HOUR_OF_DAY, -2);
						 Query q=session.createQuery("select count(*) from WeiXinDiscuss where usernum='"+map.get("FromUserName")+"' and date between ? and ?");
						 q.setParameter(0, ca1.getTime());
						 q.setParameter(1, a2);
						a= (Long) q.uniqueResult();
						
						System.out.println(a);
					} catch (Exception e) {
						e.printStackTrace();
					} finally {
						HibernateSessionFactory.closeSession();
					}
					if(a==0L) flag=true;
					else{
						message="對不起,您的操作過於頻繁,請耐心等待";
					}
				}
			} catch (Exception e) {
				
			}
			if(input.length==3&&flag){
				WeiXinDiscuss temp=new WeiXinDiscuss();
				temp.setDate(new Date());
				temp.setDiscuss(input[2]);
				temp.setHead(input[0]);
				temp.setPoint(point);
				temp.setUsernum(map.get("FromUserName"));
				dao.save(temp);
				message="收到評論,謝謝你的評價O(∩_∩)O哈哈~";
			}
			if(content.equals("最好吃")){
				List<WeiXinDiscuss> list=(List<WeiXinDiscuss>) dao.getListFromHql("from WeiXinDiscuss order by point , date desc ", null, 5);
				
				StringBuilder sb=new StringBuilder();
				for(WeiXinDiscuss temp:list){
					sb.append(temp);
				}
				message=sb.toString();
			}
			
				if(message==null)
				message="對不起,您的輸入有誤,請重新輸入";
			
			
		}

	}
}

WeiXinTool 這個類主要是用來接收處理數據。


其實大部分都是卡殼在SHA_1 加密上面。


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