

package xidian.wq.wechatlib.entity.receive; /**
*
* 项目名称:wechatlib
* 类名称:ReceiveBaseMessage
* 类描述:接收消息基类(普通用户发送信息给公众帐号)
* 创建人:WQ
* 创建时间:2013-10-3 下午4:12:57
* @version
*/
public class ReceiveBaseMessage {
// 开发者微信号
private String ToUserName;
// 发送方帐号(OpenID)
private String FromUserName;
// 消息创建时间 (整型)
private long CreateTime;
// 消息类型(text/image/location/link)
private String MsgType;
// 消息id,64位整型
private long MsgId; public String getToUserName() {
return ToUserName;
} public void setToUserName(String toUserName) {
ToUserName = toUserName;
} public String getFromUserName() {
return FromUserName;
} public void setFromUserName(String fromUserName) {
FromUserName = fromUserName;
} public long getCreateTime() {
return CreateTime;
} public void setCreateTime(long createTime) {
CreateTime = createTime;
} public String getMsgType() {
return MsgType;
} public void setMsgType(String msgType) {
MsgType = msgType;
} public long getMsgId() {
return MsgId;
} public void setMsgId(long msgId) {
MsgId = msgId;
}
}
请求消息中的文本消息
package xidian.wq.wechatlib.entity.receive; /**
*
* 项目名称:wechatlib
* 类名称:TextMessage
* 类描述:文本消息
* 创建人:WQ
* 创建时间:2013-10-3 下午4:13:06
* @version
*/
public class TextMessage extends ReceiveBaseMessage{
// 消息内容
private String Content; public String getContent() {
return Content;
} public void setContent(String content) {
Content = content;
}
}
请求消息中的图片消息
package xidian.wq.wechatlib.entity.receive; /**
*
* 项目名称:wechatlib
* 类名称:ImageMessage
* 类描述:图片消息
* 创建人:WQ
* 创建时间:2013-10-3 下午4:12:19
* @version
*/
public class ImageMessage extends ReceiveBaseMessage{
// 图片链接
private String PicUrl; public String getPicUrl() {
return PicUrl;
} public void setPicUrl(String picUrl) {
PicUrl = picUrl;
}
}
请求消息中的地理位置消息
package xidian.wq.wechatlib.entity.receive; /**
*
* 项目名称:wechatlib
* 类名称:LocationMessage
* 类描述:地理位置消息
* 创建人:WQ
* 创建时间:2013-10-3 下午4:12:45
* @version
*/
public class LocationMessage extends ReceiveBaseMessage{
// 地理位置维度
private String Location_X;
// 地理位置经度
private String Location_Y;
// 地图缩放大小
private String Scale;
// 地理位置信息
private String Label; public String getLocation_X() {
return Location_X;
} public void setLocation_X(String location_X) {
Location_X = location_X;
} public String getLocation_Y() {
return Location_Y;
} public void setLocation_Y(String location_Y) {
Location_Y = location_Y;
} public String getScale() {
return Scale;
} public void setScale(String scale) {
Scale = scale;
} public String getLabel() {
return Label;
} public void setLabel(String label) {
Label = label;
}
}
请求消息中的链接消息
package xidian.wq.wechatlib.entity.receive; /**
*
* 项目名称:wechatlib
* 类名称:LinkMessage
* 类描述:链接消息
* 创建人:WQ
* 创建时间:2013-10-3 下午4:12:33
* @version
*/
public class LinkMessage {
// 消息标题
private String Title;
// 消息描述
private String Description;
// 消息链接
private String Url; public String getTitle() {
return Title;
} public void setTitle(String title) {
Title = title;
} public String getDescription() {
return Description;
} public void setDescription(String description) {
Description = description;
} public String getUrl() {
return Url;
} public void setUrl(String url) {
Url = url;
}
}
请求消息中的语音消息
package xidian.wq.wechatlib.entity.receive; /**
*
* 项目名称:wechatlib
* 类名称:VoiceMessage
* 类描述:音频消息
* 创建人:WQ
* 创建时间:2013-10-3 下午4:13:18
* @version
*/
public class VoiceMessage {
// 媒体ID
private String MediaId;
// 语音格式
private String Format; public String getMediaId() {
return MediaId;
} public void setMediaId(String mediaId) {
MediaId = mediaId;
} public String getFormat() {
return Format;
} public void setFormat(String format) {
Format = format;
}
}
b.回复消息封装(xidian.wq.wechatlib.entity.send)
回复消息的基类
package xidian.wq.wechatlib.entity.send; /**
*
* 项目名称:wechatlib
* 类名称:SendBaseMessage
* 类描述:回复消息基类(公众帐号回复消息给普通用户)
* 创建人:WQ
* 创建时间:2013-10-3 下午4:11:46
* @version
*/
public class SendBaseMessage {
// 接收方帐号(OpenID)
private String ToUserName;
// 开发者微信号
private String FromUserName;
// 消息创建时间 (整型)
private long CreateTime;
// 消息类型(text/music/news)
private String MsgType; public String getToUserName() {
return ToUserName;
} public void setToUserName(String toUserName) {
ToUserName = toUserName;
} public String getFromUserName() {
return FromUserName;
} public void setFromUserName(String fromUserName) {
FromUserName = fromUserName;
} public long getCreateTime() {
return CreateTime;
} public void setCreateTime(long createTime) {
CreateTime = createTime;
} public String getMsgType() {
return MsgType;
} public void setMsgType(String msgType) {
MsgType = msgType;
}
}
回复消息中的文本消息
package xidian.wq.wechatlib.entity.send; /**
*
* 项目名称:wechatlib
* 类名称:TextMessage
* 类描述:文本消息
* 创建人:WQ
* 创建时间:2013-10-3 下午4:12:00
* @version
*/
public class TextMessage extends SendBaseMessage{
// 消息内容
private String Content; public String getContent() {
return Content;
} public void setContent(String content) {
Content = content;
}
}
回复消息中的音乐消息
package xidian.wq.wechatlib.entity.send; /**
*
* 项目名称:wechatlib
* 类名称:MusicMessage
* 类描述:音乐消息
* 创建人:WQ
* 创建时间:2013-10-3 下午4:11:19
* @version
*/
public class MusicMessage extends SendBaseMessage{
// 音乐
private Music Music; public Music getMusic() {
return Music;
} public void setMusic(Music music) {
Music = music;
}
}
音乐消息中的music类
package xidian.wq.wechatlib.entity.send; /**
*
* 项目名称:wechatlib
* 类名称:Music
* 类描述:音乐model
* 创建人:WQ
* 创建时间:2013-10-3 下午4:11:03
* @version
*/
public class Music {
// 音乐名称
private String Title;
// 音乐描述
private String Description;
// 音乐链接
private String MusicUrl;
// 高质量音乐链接,WIFI环境优先使用该链接播放音乐
private String HQMusicUrl; public String getTitle() {
return Title;
} public void setTitle(String title) {
Title = title;
} public String getDescription() {
return Description;
} public void setDescription(String description) {
Description = description;
} public String getMusicUrl() {
return MusicUrl;
} public void setMusicUrl(String musicUrl) {
MusicUrl = musicUrl;
} public String getHQMusicUrl() {
return HQMusicUrl;
} public void setHQMusicUrl(String musicUrl) {
HQMusicUrl = musicUrl;
}
}
回复消息中的图文消息
package xidian.wq.wechatlib.entity.send; import java.util.List; /**
*
* 项目名称:wechatlib
* 类名称:NewsMessage
* 类描述:图文消息
* 创建人:WQ
* 创建时间:2013-10-3 下午4:11:32
* @version
*/
public class NewsMessage extends SendBaseMessage{
// 图文消息个数,限制为10条以内
private int ArticleCount;
// 多条图文消息信息,默认第一个item为大图
private List<Article> Articles; public int getArticleCount() {
return ArticleCount;
} public void setArticleCount(int articleCount) {
ArticleCount = articleCount;
} public List<Article> getArticles() {
return Articles;
} public void setArticles(List<Article> articles) {
Articles = articles;
}
}
图文消息中的article类
package xidian.wq.wechatlib.entity.send; /**
*
* 项目名称:wechatlib
* 类名称:Article
* 类描述:图文model
* 创建人:WQ
* 创建时间:2013-10-3 下午4:10:51
* @version
*/
public class Article {
// 图文消息名称
private String Title;
// 图文消息描述
private String Description;
// 图片链接,支持JPG、PNG格式,较好的效果为大图600*300,小图80*80,限制图片链接的域名需要与开发者填写的基本资料中的Url一致
private String PicUrl;
// 点击图文消息跳转链接
private String Url; public String getTitle() {
return Title;
} public void setTitle(String title) {
Title = title;
} public String getDescription() {
return null == Description ? "" : Description;
} public void setDescription(String description) {
Description = description;
} public String getPicUrl() {
return null == PicUrl ? "" : PicUrl;
} public void setPicUrl(String picUrl) {
PicUrl = picUrl;
} public String getUrl() {
return null == Url ? "" : Url;
} public void setUrl(String url) {
Url = url;
}
}
c.基础设置(xidian.wq.wechatlib.utils)
消息处理工具类
package xidian.wq.wechatlib.utils; import java.io.InputStream;
import java.io.Writer;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import javax.servlet.http.HttpServletRequest; import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; import xidian.wq.wechatlib.entity.send.Article;
import xidian.wq.wechatlib.entity.send.MusicMessage;
import xidian.wq.wechatlib.entity.send.NewsMessage;
import xidian.wq.wechatlib.entity.send.TextMessage; import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.core.util.QuickWriter;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.PrettyPrintWriter;
import com.thoughtworks.xstream.io.xml.XppDriver; /**
*
* 项目名称:wechatlib
* 类名称:MessageUtil
* 类描述:消息处理工具类
* 创建人:WQ
* 创建时间:2013-10-3 下午4:08:40
* @version
*/
public class MessageUtil {
/**
* 返回消息类型:文本
*/
public static final String SEND_TEXT = "text"; /**
* 返回消息类型:音乐
*/
public static final String SEND_MUSIC = "music"; /**
* 返回消息类型:图文
*/
public static final String SEND_NEWS = "news"; /**
* 请求消息类型:文本
*/
public static final String RECRIVE_TEXT = "text"; /**
* 请求消息类型:图片
*/
public static final String RECRIVE_IMAGE = "image"; /**
* 请求消息类型:链接
*/
public static final String RECRIVE_LINK = "link"; /**
* 请求消息类型:地理位置
*/
public static final String RECRIVE_LOCATION = "location"; /**
* 请求消息类型:音频
*/
public static final String RECRIVE_VOICE = "voice"; /**
* 请求消息类型:推送
*/
public static final String RECRIVE_EVENT = "event"; /**
* 事件类型:subscribe(订阅)
*/
public static final String RECRIVE_SUBSCRIBE = "subscribe"; /**
* 事件类型:unsubscribe(取消订阅)
*/
public static final String RECRIVE_UNSUBSCRIBE = "unsubscribe"; /**
* 事件类型:CLICK(自定义菜单点击事件)
*/
public static final String RECRIVE_CLICK = "CLICK"; /**
* 解析微信发来的请求(XML)
*
* @param request
* @return
* @throws Exception
*/
@SuppressWarnings("unchecked")
public static Map<String, String> parseXml(HttpServletRequest request) throws Exception {
// 将解析结果存储在HashMap中
Map<String, String> map = new HashMap<String, String>();
// 从request中取得输入流
InputStream inputStream = request.getInputStream();
// 读取输入流
SAXReader reader = new SAXReader();
Document document = reader.read(inputStream);
// 得到xml根元素
Element root = document.getRootElement();
// 得到根元素的所有子节点
List<Element> elementList = root.elements();
// 遍历所有子节点
for (Element e : elementList)
map.put(e.getName(), e.getText());
// 释放资源
inputStream.close();
inputStream = null;
return map;
} /**
* 文本消息对象转换成xml
*
* @param textMessage 文本消息对象
* @return xml
*/
public static String textMessageToXml(TextMessage textMessage) {
xstream.alias("xml", textMessage.getClass());
return xstream.toXML(textMessage);
} /**
* 音乐消息对象转换成xml
*
* @param musicMessage 音乐消息对象
* @return xml
*/
public static String musicMessageToXml(MusicMessage musicMessage) {
xstream.alias("xml", musicMessage.getClass());
return xstream.toXML(musicMessage);
} /**
* 图文消息对象转换成xml
*
* @param newsMessage 图文消息对象
* @return xml
*/
public static String newsMessageToXml(NewsMessage newsMessage) {
xstream.alias("xml", newsMessage.getClass());
xstream.alias("item", new Article().getClass());
return xstream.toXML(newsMessage);
} /**
* 扩展xstream,使其支持CDATA块
*
* @date 2013-05-19
*/
private static XStream xstream = new XStream(new XppDriver() {
public HierarchicalStreamWriter createWriter(Writer out) {
return new PrettyPrintWriter(out) {
// 对所有xml节点的转换都增加CDATA标记
boolean cdata = true;
@SuppressWarnings("unchecked")
public void startNode(String name, Class clazz) {
super.startNode(name, clazz);
}
protected void writeText(QuickWriter writer, String text) {
if (cdata) {
writer.write("<![CDATA[");
writer.write(text);
writer.write("]]>");
} else {
writer.write(text);
}
}
};
}
});
}
url配置请求校验工具类
package xidian.wq.wechatlib.utils; import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays; import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays; /**
*
* 项目名称:wechatlib
* 类名称:SignUtil
* 类描述:url配置请求校验工具类
* 创建人:WQ
* 创建时间:2013-10-3 下午4:09:14
* @version
*/
public class SignUtil {
// 与接口配置信息中的Token要一致
private static String token = "fromsedion";
/**
* 验证签名
*
* @param signature 微信加密签名
* @param timestamp 时间戳
* @param nonce 随机数
* @return
*/
public static boolean checkSignature(String signature, String timestamp, String nonce) {
String[] arr = new String[] { token, timestamp, nonce };
// 将token、timestamp、nonce三个参数进行字典序排序
Arrays.sort(arr);
StringBuilder content = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
content.append(arr[i]);
}
MessageDigest md = null;
String tmpStr = null; try {
md = MessageDigest.getInstance("SHA-1");
// 将三个参数字符串拼接成一个字符串进行sha1加密
byte[] digest = md.digest(content.toString().getBytes());
tmpStr = byteToStr(digest);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} content = null;
// 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
} /**
* 将字节数组转换为十六进制字符串
*
* @param byteArray
* @return
*/
private static String byteToStr(byte[] byteArray) {
String strDigest = "";
for (int i = 0; i < byteArray.length; i++) {
strDigest += byteToHexStr(byteArray[i]);
}
return strDigest;
} /**
* 将字节转换为十六进制字符串
*
* @param mByte
* @return
*/
private static String byteToHexStr(byte mByte) {
char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
char[] tempArr = new char[2];
tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
tempArr[1] = Digit[mByte & 0X0F];
String s = new String(tempArr);
return s;
}
}
d.service回复信息处理(xidian.wq.wechatlib.ways.send)
package xidian.wq.wechatlib.ways.send;
import java.util.Date;
import java.util.List; import xidian.wq.wechatlib.entity.send.Article;
import xidian.wq.wechatlib.entity.send.NewsMessage;
import xidian.wq.wechatlib.entity.send.TextMessage;
import xidian.wq.wechatlib.utils.MessageUtil; /**
*
* 项目名称:wechatlib
* 类名称:SendService
* 类描述: 回复信息类型的封装
* 创建人:WQ
* 创建时间:2013-10-3 下午4:07:59
* @version
*/
public class SendService {
/**
* 回复文本消息
* @param fromusername 粉丝openid
* @param tousername 微信公众号
* @param respContent 回复信息
* @return
*/
public static String sendTextmessage(String fromusername,String tousername,String respContent){
//初始化回复信息
String respmessage;
//回复文本消息
TextMessage textMessage = new TextMessage();
//发送方帐号(一个OpenID)
textMessage.setToUserName(fromusername);
//开发者微信号
textMessage.setFromUserName(tousername);
//消息创建时间 (整型)
textMessage.setCreateTime(new Date().getTime());
//消息类型text
textMessage.setMsgType(MessageUtil.SEND_TEXT);
//回复的消息内容,长度不超过2048字节
textMessage.setContent(respContent);
//转为xml格式
respmessage = MessageUtil.textMessageToXml(textMessage);
//返回回复信息
return respmessage;
} /**
* 图文消息设置
* @param fromusername 粉丝openid
* @param tousername 开发者微信公众账号
* @param newslist 图文消息list
* @return
*/
public static String sendNewsmessage(String fromusername,String tousername,List<Article> newslist){
//初始化回复信息
String respmessage;
//创建图文消息
NewsMessage newsMessage=new NewsMessage();
//发送方帐号(一个OpenID)
newsMessage.setToUserName(fromusername);
//开发者微信号
newsMessage.setFromUserName(tousername);
//消息创建时间 (整型)
newsMessage.setCreateTime(new Date().getTime());
//消息类型news
newsMessage.setMsgType(MessageUtil.SEND_NEWS);
//图文消息个数,限制为10条以内
newsMessage.setArticleCount(newslist.size());
//多条图文消息信息,默认第一个item为大图
newsMessage.setArticles(newslist);
//转成xml形式
respmessage = MessageUtil.newsMessageToXml(newsMessage);
//回复信息
return respmessage;
}
}
打包
以上即是所要打的jar包包含的所有类,接下去讲解打包:
因为项目中要将外部引用的jar包(dom4j-1.6.1.jar和xstream-1.3.1.jar)打进jar包,所以笔者准备了fat-jar(sourcefprge.net下的一个开源工具),下载地址为http://pan.baidu.com/s/1CCtSf也可以到http://sourcefprge.net/projects/fjep下载,将下载好的net.sf.fjep.fatjar_0.0.31.jar拷贝到eclipse目录下的plugins目录下,然后重启eclipse,准备完成。
点击项目wechatlib,右键选中Build Fat Jar
选择需要用到的jar和文件
点击finish即可
如果你急需用到wechatlib,可直接在此处下载http://pan.baidu.com/share/link?uk=1730904624&shareid=1479736624
转帖请注明本文出自胖子的博客(http://www.cnblogs.com/Codenewbie),请尊重他人的辛勤劳动成果,谢谢!