这个微信公共平台是我很早之前写的,大概是去年的八月份吧. 网上很多开发的例子都是用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();
}
}
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 加密上面。