微信公众平台自动回复wechatlib.jar的生成及wechatlib解析
1 package xidian.wq.wechatlib.entity.receive; 2 3 4 /** 5 * 6 * 项目名称:wechatlib 7 * 类名称:ReceiveBaseMessage 8 * 类描述:接收消息基类(普通用户发送信息给公众帐号) 9 * 创建人:WQ 10 * 创建时间:2013-10-3 下午4:12:57 11 * @version 12 */ 13 public class ReceiveBaseMessage { 14 // 开发者微信号 15 private String ToUserName; 16 // 发送方帐号(OpenID) 17 private String FromUserName; 18 // 消息创建时间 (整型) 19 private long CreateTime; 20 // 消息类型(text/image/location/link) 21 private String MsgType; 22 // 消息id,64位整型 23 private long MsgId; 24 25 public String getToUserName() { 26 return ToUserName; 27 } 28 29 public void setToUserName(String toUserName) { 30 ToUserName = toUserName; 31 } 32 33 public String getFromUserName() { 34 return FromUserName; 35 } 36 37 public void setFromUserName(String fromUserName) { 38 FromUserName = fromUserName; 39 } 40 41 public long getCreateTime() { 42 return CreateTime; 43 } 44 45 public void setCreateTime(long createTime) { 46 CreateTime = createTime; 47 } 48 49 public String getMsgType() { 50 return MsgType; 51 } 52 53 public void setMsgType(String msgType) { 54 MsgType = msgType; 55 } 56 57 public long getMsgId() { 58 return MsgId; 59 } 60 61 public void setMsgId(long msgId) { 62 MsgId = msgId; 63 } 64 }
请求消息中的文本消息
1 package xidian.wq.wechatlib.entity.receive; 2 3 /** 4 * 5 * 项目名称:wechatlib 6 * 类名称:TextMessage 7 * 类描述:文本消息 8 * 创建人:WQ 9 * 创建时间:2013-10-3 下午4:13:06 10 * @version 11 */ 12 public class TextMessage extends ReceiveBaseMessage{ 13 // 消息内容 14 private String Content; 15 16 public String getContent() { 17 return Content; 18 } 19 20 public void setContent(String content) { 21 Content = content; 22 } 23 }
请求消息中的图片消息
1 package xidian.wq.wechatlib.entity.receive; 2 3 4 /** 5 * 6 * 项目名称:wechatlib 7 * 类名称:ImageMessage 8 * 类描述:图片消息 9 * 创建人:WQ 10 * 创建时间:2013-10-3 下午4:12:19 11 * @version 12 */ 13 public class ImageMessage extends ReceiveBaseMessage{ 14 // 图片链接 15 private String PicUrl; 16 17 public String getPicUrl() { 18 return PicUrl; 19 } 20 21 public void setPicUrl(String picUrl) { 22 PicUrl = picUrl; 23 } 24 }
请求消息中的地理位置消息
1 package xidian.wq.wechatlib.entity.receive; 2 3 4 /** 5 * 6 * 项目名称:wechatlib 7 * 类名称:LocationMessage 8 * 类描述:地理位置消息 9 * 创建人:WQ 10 * 创建时间:2013-10-3 下午4:12:45 11 * @version 12 */ 13 public class LocationMessage extends ReceiveBaseMessage{ 14 // 地理位置维度 15 private String Location_X; 16 // 地理位置经度 17 private String Location_Y; 18 // 地图缩放大小 19 private String Scale; 20 // 地理位置信息 21 private String Label; 22 23 public String getLocation_X() { 24 return Location_X; 25 } 26 27 public void setLocation_X(String location_X) { 28 Location_X = location_X; 29 } 30 31 public String getLocation_Y() { 32 return Location_Y; 33 } 34 35 public void setLocation_Y(String location_Y) { 36 Location_Y = location_Y; 37 } 38 39 public String getScale() { 40 return Scale; 41 } 42 43 public void setScale(String scale) { 44 Scale = scale; 45 } 46 47 public String getLabel() { 48 return Label; 49 } 50 51 public void setLabel(String label) { 52 Label = label; 53 } 54 }
请求消息中的链接消息
1 package xidian.wq.wechatlib.entity.receive; 2 3 /** 4 * 5 * 项目名称:wechatlib 6 * 类名称:LinkMessage 7 * 类描述:链接消息 8 * 创建人:WQ 9 * 创建时间:2013-10-3 下午4:12:33 10 * @version 11 */ 12 public class LinkMessage { 13 // 消息标题 14 private String Title; 15 // 消息描述 16 private String Description; 17 // 消息链接 18 private String Url; 19 20 public String getTitle() { 21 return Title; 22 } 23 24 public void setTitle(String title) { 25 Title = title; 26 } 27 28 public String getDescription() { 29 return Description; 30 } 31 32 public void setDescription(String description) { 33 Description = description; 34 } 35 36 public String getUrl() { 37 return Url; 38 } 39 40 public void setUrl(String url) { 41 Url = url; 42 } 43 }
请求消息中的语音消息
1 package xidian.wq.wechatlib.entity.receive; 2 3 /** 4 * 5 * 项目名称:wechatlib 6 * 类名称:VoiceMessage 7 * 类描述:音频消息 8 * 创建人:WQ 9 * 创建时间:2013-10-3 下午4:13:18 10 * @version 11 */ 12 public class VoiceMessage { 13 // 媒体ID 14 private String MediaId; 15 // 语音格式 16 private String Format; 17 18 public String getMediaId() { 19 return MediaId; 20 } 21 22 public void setMediaId(String mediaId) { 23 MediaId = mediaId; 24 } 25 26 public String getFormat() { 27 return Format; 28 } 29 30 public void setFormat(String format) { 31 Format = format; 32 } 33 }
b.回复消息封装(xidian.wq.wechatlib.entity.send)
回复消息的基类
1 package xidian.wq.wechatlib.entity.send; 2 3 /** 4 * 5 * 项目名称:wechatlib 6 * 类名称:SendBaseMessage 7 * 类描述:回复消息基类(公众帐号回复消息给普通用户) 8 * 创建人:WQ 9 * 创建时间:2013-10-3 下午4:11:46 10 * @version 11 */ 12 public class SendBaseMessage { 13 // 接收方帐号(OpenID) 14 private String ToUserName; 15 // 开发者微信号 16 private String FromUserName; 17 // 消息创建时间 (整型) 18 private long CreateTime; 19 // 消息类型(text/music/news) 20 private String MsgType; 21 22 public String getToUserName() { 23 return ToUserName; 24 } 25 26 public void setToUserName(String toUserName) { 27 ToUserName = toUserName; 28 } 29 30 public String getFromUserName() { 31 return FromUserName; 32 } 33 34 public void setFromUserName(String fromUserName) { 35 FromUserName = fromUserName; 36 } 37 38 public long getCreateTime() { 39 return CreateTime; 40 } 41 42 public void setCreateTime(long createTime) { 43 CreateTime = createTime; 44 } 45 46 public String getMsgType() { 47 return MsgType; 48 } 49 50 public void setMsgType(String msgType) { 51 MsgType = msgType; 52 } 53 }
回复消息中的文本消息
1 package xidian.wq.wechatlib.entity.send; 2 3 /** 4 * 5 * 项目名称:wechatlib 6 * 类名称:TextMessage 7 * 类描述:文本消息 8 * 创建人:WQ 9 * 创建时间:2013-10-3 下午4:12:00 10 * @version 11 */ 12 public class TextMessage extends SendBaseMessage{ 13 // 消息内容 14 private String Content; 15 16 public String getContent() { 17 return Content; 18 } 19 20 public void setContent(String content) { 21 Content = content; 22 } 23 }
回复消息中的音乐消息
1 package xidian.wq.wechatlib.entity.send; 2 3 4 /** 5 * 6 * 项目名称:wechatlib 7 * 类名称:MusicMessage 8 * 类描述:音乐消息 9 * 创建人:WQ 10 * 创建时间:2013-10-3 下午4:11:19 11 * @version 12 */ 13 public class MusicMessage extends SendBaseMessage{ 14 // 音乐 15 private Music Music; 16 17 public Music getMusic() { 18 return Music; 19 } 20 21 public void setMusic(Music music) { 22 Music = music; 23 } 24 }
音乐消息中的music类
1 package xidian.wq.wechatlib.entity.send; 2 3 4 /** 5 * 6 * 项目名称:wechatlib 7 * 类名称:Music 8 * 类描述:音乐model 9 * 创建人:WQ 10 * 创建时间:2013-10-3 下午4:11:03 11 * @version 12 */ 13 public class Music { 14 // 音乐名称 15 private String Title; 16 // 音乐描述 17 private String Description; 18 // 音乐链接 19 private String MusicUrl; 20 // 高质量音乐链接,WIFI环境优先使用该链接播放音乐 21 private String HQMusicUrl; 22 23 public String getTitle() { 24 return Title; 25 } 26 27 public void setTitle(String title) { 28 Title = title; 29 } 30 31 public String getDescription() { 32 return Description; 33 } 34 35 public void setDescription(String description) { 36 Description = description; 37 } 38 39 public String getMusicUrl() { 40 return MusicUrl; 41 } 42 43 public void setMusicUrl(String musicUrl) { 44 MusicUrl = musicUrl; 45 } 46 47 public String getHQMusicUrl() { 48 return HQMusicUrl; 49 } 50 51 public void setHQMusicUrl(String musicUrl) { 52 HQMusicUrl = musicUrl; 53 } 54 }
回复消息中的图文消息
1 package xidian.wq.wechatlib.entity.send; 2 3 import java.util.List; 4 5 6 /** 7 * 8 * 项目名称:wechatlib 9 * 类名称:NewsMessage 10 * 类描述:图文消息 11 * 创建人:WQ 12 * 创建时间:2013-10-3 下午4:11:32 13 * @version 14 */ 15 public class NewsMessage extends SendBaseMessage{ 16 // 图文消息个数,限制为10条以内 17 private int ArticleCount; 18 // 多条图文消息信息,默认第一个item为大图 19 private List<Article> Articles; 20 21 public int getArticleCount() { 22 return ArticleCount; 23 } 24 25 public void setArticleCount(int articleCount) { 26 ArticleCount = articleCount; 27 } 28 29 public List<Article> getArticles() { 30 return Articles; 31 } 32 33 public void setArticles(List<Article> articles) { 34 Articles = articles; 35 } 36 }
图文消息中的article类
1 package xidian.wq.wechatlib.entity.send; 2 3 4 /** 5 * 6 * 项目名称:wechatlib 7 * 类名称:Article 8 * 类描述:图文model 9 * 创建人:WQ 10 * 创建时间:2013-10-3 下午4:10:51 11 * @version 12 */ 13 public class Article { 14 // 图文消息名称 15 private String Title; 16 // 图文消息描述 17 private String Description; 18 // 图片链接,支持JPG、PNG格式,较好的效果为大图600*300,小图80*80,限制图片链接的域名需要与开发者填写的基本资料中的Url一致 19 private String PicUrl; 20 // 点击图文消息跳转链接 21 private String Url; 22 23 public String getTitle() { 24 return Title; 25 } 26 27 public void setTitle(String title) { 28 Title = title; 29 } 30 31 public String getDescription() { 32 return null == Description ? "" : Description; 33 } 34 35 public void setDescription(String description) { 36 Description = description; 37 } 38 39 public String getPicUrl() { 40 return null == PicUrl ? "" : PicUrl; 41 } 42 43 public void setPicUrl(String picUrl) { 44 PicUrl = picUrl; 45 } 46 47 public String getUrl() { 48 return null == Url ? "" : Url; 49 } 50 51 public void setUrl(String url) { 52 Url = url; 53 } 54 }
c.基础设置(xidian.wq.wechatlib.utils)
消息处理工具类
1 package xidian.wq.wechatlib.utils; 2 3 import java.io.InputStream; 4 import java.io.Writer; 5 import java.util.HashMap; 6 import java.util.List; 7 import java.util.Map; 8 9 import javax.servlet.http.HttpServletRequest; 10 11 import org.dom4j.Document; 12 import org.dom4j.Element; 13 import org.dom4j.io.SAXReader; 14 15 import xidian.wq.wechatlib.entity.send.Article; 16 import xidian.wq.wechatlib.entity.send.MusicMessage; 17 import xidian.wq.wechatlib.entity.send.NewsMessage; 18 import xidian.wq.wechatlib.entity.send.TextMessage; 19 20 import com.thoughtworks.xstream.XStream; 21 import com.thoughtworks.xstream.core.util.QuickWriter; 22 import com.thoughtworks.xstream.io.HierarchicalStreamWriter; 23 import com.thoughtworks.xstream.io.xml.PrettyPrintWriter; 24 import com.thoughtworks.xstream.io.xml.XppDriver; 25 26 /** 27 * 28 * 项目名称:wechatlib 29 * 类名称:MessageUtil 30 * 类描述:消息处理工具类 31 * 创建人:WQ 32 * 创建时间:2013-10-3 下午4:08:40 33 * @version 34 */ 35 public class MessageUtil { 36 /** 37 * 返回消息类型:文本 38 */ 39 public static final String SEND_TEXT = "text"; 40 41 /** 42 * 返回消息类型:音乐 43 */ 44 public static final String SEND_MUSIC = "music"; 45 46 /** 47 * 返回消息类型:图文 48 */ 49 public static final String SEND_NEWS = "news"; 50 51 /** 52 * 请求消息类型:文本 53 */ 54 public static final String RECRIVE_TEXT = "text"; 55 56 /** 57 * 请求消息类型:图片 58 */ 59 public static final String RECRIVE_IMAGE = "image"; 60 61 /** 62 * 请求消息类型:链接 63 */ 64 public static final String RECRIVE_LINK = "link"; 65 66 /** 67 * 请求消息类型:地理位置 68 */ 69 public static final String RECRIVE_LOCATION = "location"; 70 71 /** 72 * 请求消息类型:音频 73 */ 74 public static final String RECRIVE_VOICE = "voice"; 75 76 /** 77 * 请求消息类型:推送 78 */ 79 public static final String RECRIVE_EVENT = "event"; 80 81 /** 82 * 事件类型:subscribe(订阅) 83 */ 84 public static final String RECRIVE_SUBSCRIBE = "subscribe"; 85 86 /** 87 * 事件类型:unsubscribe(取消订阅) 88 */ 89 public static final String RECRIVE_UNSUBSCRIBE = "unsubscribe"; 90 91 /** 92 * 事件类型:CLICK(自定义菜单点击事件) 93 */ 94 public static final String RECRIVE_CLICK = "CLICK"; 95 96 /** 97 * 解析微信发来的请求(XML) 98 * 99 * @param request 100 * @return 101 * @throws Exception 102 */ 103 @SuppressWarnings("unchecked") 104 public static Map<String, String> parseXml(HttpServletRequest request) throws Exception { 105 // 将解析结果存储在HashMap中 106 Map<String, String> map = new HashMap<String, String>(); 107 // 从request中取得输入流 108 InputStream inputStream = request.getInputStream(); 109 // 读取输入流 110 SAXReader reader = new SAXReader(); 111 Document document = reader.read(inputStream); 112 // 得到xml根元素 113 Element root = document.getRootElement(); 114 // 得到根元素的所有子节点 115 List<Element> elementList = root.elements(); 116 // 遍历所有子节点 117 for (Element e : elementList) 118 map.put(e.getName(), e.getText()); 119 // 释放资源 120 inputStream.close(); 121 inputStream = null; 122 return map; 123 } 124 125 /** 126 * 文本消息对象转换成xml 127 * 128 * @param textMessage 文本消息对象 129 * @return xml 130 */ 131 public static String textMessageToXml(TextMessage textMessage) { 132 xstream.alias("xml", textMessage.getClass()); 133 return xstream.toXML(textMessage); 134 } 135 136 /** 137 * 音乐消息对象转换成xml 138 * 139 * @param musicMessage 音乐消息对象 140 * @return xml 141 */ 142 public static String musicMessageToXml(MusicMessage musicMessage) { 143 xstream.alias("xml", musicMessage.getClass()); 144 return xstream.toXML(musicMessage); 145 } 146 147 /** 148 * 图文消息对象转换成xml 149 * 150 * @param newsMessage 图文消息对象 151 * @return xml 152 */ 153 public static String newsMessageToXml(NewsMessage newsMessage) { 154 xstream.alias("xml", newsMessage.getClass()); 155 xstream.alias("item", new Article().getClass()); 156 return xstream.toXML(newsMessage); 157 } 158 159 160 /** 161 * 扩展xstream,使其支持CDATA块 162 * 163 * @date 2013-05-19 164 */ 165 private static XStream xstream = new XStream(new XppDriver() { 166 public HierarchicalStreamWriter createWriter(Writer out) { 167 return new PrettyPrintWriter(out) { 168 // 对所有xml节点的转换都增加CDATA标记 169 boolean cdata = true; 170 @SuppressWarnings("unchecked") 171 public void startNode(String name, Class clazz) { 172 super.startNode(name, clazz); 173 } 174 protected void writeText(QuickWriter writer, String text) { 175 if (cdata) { 176 writer.write("<![CDATA["); 177 writer.write(text); 178 writer.write("]]>"); 179 } else { 180 writer.write(text); 181 } 182 } 183 }; 184 } 185 }); 186 }
url配置请求校验工具类
1 package xidian.wq.wechatlib.utils; 2 3 import java.security.MessageDigest; 4 import java.security.NoSuchAlgorithmException; 5 import java.util.Arrays; 6 7 import java.security.MessageDigest; 8 import java.security.NoSuchAlgorithmException; 9 import java.util.Arrays; 10 11 12 /** 13 * 14 * 项目名称:wechatlib 15 * 类名称:SignUtil 16 * 类描述:url配置请求校验工具类 17 * 创建人:WQ 18 * 创建时间:2013-10-3 下午4:09:14 19 * @version 20 */ 21 public class SignUtil { 22 // 与接口配置信息中的Token要一致 23 private static String token = "fromsedion"; 24 /** 25 * 验证签名 26 * 27 * @param signature 微信加密签名 28 * @param timestamp 时间戳 29 * @param nonce 随机数 30 * @return 31 */ 32 public static boolean checkSignature(String signature, String timestamp, String nonce) { 33 String[] arr = new String[] { token, timestamp, nonce }; 34 // 将token、timestamp、nonce三个参数进行字典序排序 35 Arrays.sort(arr); 36 StringBuilder content = new StringBuilder(); 37 for (int i = 0; i < arr.length; i++) { 38 content.append(arr[i]); 39 } 40 MessageDigest md = null; 41 String tmpStr = null; 42 43 try { 44 md = MessageDigest.getInstance("SHA-1"); 45 // 将三个参数字符串拼接成一个字符串进行sha1加密 46 byte[] digest = md.digest(content.toString().getBytes()); 47 tmpStr = byteToStr(digest); 48 } catch (NoSuchAlgorithmException e) { 49 e.printStackTrace(); 50 } 51 52 content = null; 53 // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信 54 return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false; 55 } 56 57 /** 58 * 将字节数组转换为十六进制字符串 59 * 60 * @param byteArray 61 * @return 62 */ 63 private static String byteToStr(byte[] byteArray) { 64 String strDigest = ""; 65 for (int i = 0; i < byteArray.length; i++) { 66 strDigest += byteToHexStr(byteArray[i]); 67 } 68 return strDigest; 69 } 70 71 /** 72 * 将字节转换为十六进制字符串 73 * 74 * @param mByte 75 * @return 76 */ 77 private static String byteToHexStr(byte mByte) { 78 char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; 79 char[] tempArr = new char[2]; 80 tempArr[0] = Digit[(mByte >>> 4) & 0X0F]; 81 tempArr[1] = Digit[mByte & 0X0F]; 82 String s = new String(tempArr); 83 return s; 84 } 85 }
d.service回复信息处理(xidian.wq.wechatlib.ways.send)
1 package xidian.wq.wechatlib.ways.send; 2 import java.util.Date; 3 import java.util.List; 4 5 import xidian.wq.wechatlib.entity.send.Article; 6 import xidian.wq.wechatlib.entity.send.NewsMessage; 7 import xidian.wq.wechatlib.entity.send.TextMessage; 8 import xidian.wq.wechatlib.utils.MessageUtil; 9 10 /** 11 * 12 * 项目名称:wechatlib 13 * 类名称:SendService 14 * 类描述: 回复信息类型的封装 15 * 创建人:WQ 16 * 创建时间:2013-10-3 下午4:07:59 17 * @version 18 */ 19 public class SendService { 20 /** 21 * 回复文本消息 22 * @param fromusername 粉丝openid 23 * @param tousername 微信公众号 24 * @param respContent 回复信息 25 * @return 26 */ 27 public static String sendTextmessage(String fromusername,String tousername,String respContent){ 28 //初始化回复信息 29 String respmessage; 30 //回复文本消息 31 TextMessage textMessage = new TextMessage(); 32 //发送方帐号(一个OpenID) 33 textMessage.setToUserName(fromusername); 34 //开发者微信号 35 textMessage.setFromUserName(tousername); 36 //消息创建时间 (整型) 37 textMessage.setCreateTime(new Date().getTime()); 38 //消息类型text 39 textMessage.setMsgType(MessageUtil.SEND_TEXT); 40 //回复的消息内容,长度不超过2048字节 41 textMessage.setContent(respContent); 42 //转为xml格式 43 respmessage = MessageUtil.textMessageToXml(textMessage); 44 //返回回复信息 45 return respmessage; 46 } 47 48 /** 49 * 图文消息设置 50 * @param fromusername 粉丝openid 51 * @param tousername 开发者微信公众账号 52 * @param newslist 图文消息list 53 * @return 54 */ 55 public static String sendNewsmessage(String fromusername,String tousername,List<Article> newslist){ 56 //初始化回复信息 57 String respmessage; 58 //创建图文消息 59 NewsMessage newsMessage=new NewsMessage(); 60 //发送方帐号(一个OpenID) 61 newsMessage.setToUserName(fromusername); 62 //开发者微信号 63 newsMessage.setFromUserName(tousername); 64 //消息创建时间 (整型) 65 newsMessage.setCreateTime(new Date().getTime()); 66 //消息类型news 67 newsMessage.setMsgType(MessageUtil.SEND_NEWS); 68 //图文消息个数,限制为10条以内 69 newsMessage.setArticleCount(newslist.size()); 70 //多条图文消息信息,默认第一个item为大图 71 newsMessage.setArticles(newslist); 72 //转成xml形式 73 respmessage = MessageUtil.newsMessageToXml(newsMessage); 74 //回复信息 75 return respmessage; 76 } 77 }
打包
以上即是所要打的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),请尊重他人的辛勤劳动成果,谢谢!