微信公众平台出来有一段时日了,官方提供的自动回复的接口调用大致是这么些类型(text/image/location/link),每个项目都如此拷贝代码,在笔者看来比较麻烦,今天乘着点闲暇的时间特意将这些内容打成jar包,以方便日后的调用。

 
前期准备:
1)jdk1.7
2)eclipse(juno)
3)tomcat7.0.39
这些都准备好了后,我们开始解析wechatlib的原代码
 
wechatlib内容解析
先上结构图
  
 
  1.jar包解释
    dom4j-1.6.1.jar 将request中得到微信服务器发送给我们的xml格式的消息(xml格式)进行解析,然后将解析得到的结果存入HashMap
    xstream-1.3.1.jar 将响应的消息java类转换成xml格式
  2.源码解析
    a.请求消息封装(xidian.wq.wechatlib.entity.receive)
    请求消息的基类
  1. package xidian.wq.wechatlib.entity.receive;
  2.  
  3. /**
  4. *
  5. * 项目名称:wechatlib
  6. * 类名称:ReceiveBaseMessage
  7. * 类描述:接收消息基类(普通用户发送信息给公众帐号)
  8. * 创建人:WQ
  9. * 创建时间:2013-10-3 下午4:12:57
  10. * @version
  11. */
  12. public class ReceiveBaseMessage {
  13. // 开发者微信号
  14. private String ToUserName;
  15. // 发送方帐号(OpenID)
  16. private String FromUserName;
  17. // 消息创建时间 (整型)
  18. private long CreateTime;
  19. // 消息类型(text/image/location/link)
  20. private String MsgType;
  21. // 消息id,64位整型
  22. private long MsgId;
  23.  
  24. public String getToUserName() {
  25. return ToUserName;
  26. }
  27.  
  28. public void setToUserName(String toUserName) {
  29. ToUserName = toUserName;
  30. }
  31.  
  32. public String getFromUserName() {
  33. return FromUserName;
  34. }
  35.  
  36. public void setFromUserName(String fromUserName) {
  37. FromUserName = fromUserName;
  38. }
  39.  
  40. public long getCreateTime() {
  41. return CreateTime;
  42. }
  43.  
  44. public void setCreateTime(long createTime) {
  45. CreateTime = createTime;
  46. }
  47.  
  48. public String getMsgType() {
  49. return MsgType;
  50. }
  51.  
  52. public void setMsgType(String msgType) {
  53. MsgType = msgType;
  54. }
  55.  
  56. public long getMsgId() {
  57. return MsgId;
  58. }
  59.  
  60. public void setMsgId(long msgId) {
  61. MsgId = msgId;
  62. }
  63. }

  请求消息中的文本消息

  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. * 项目名称:wechatlib
  6. * 类名称:ImageMessage
  7. * 类描述:图片消息
  8. * 创建人:WQ
  9. * 创建时间:2013-10-3 下午4:12:19
  10. * @version
  11. */
  12. public class ImageMessage extends ReceiveBaseMessage{
  13. // 图片链接
  14. private String PicUrl;
  15.  
  16. public String getPicUrl() {
  17. return PicUrl;
  18. }
  19.  
  20. public void setPicUrl(String picUrl) {
  21. PicUrl = picUrl;
  22. }
  23. }

  请求消息中的地理位置消息

  1. package xidian.wq.wechatlib.entity.receive;
  2.  
  3. /**
  4. *
  5. * 项目名称:wechatlib
  6. * 类名称:LocationMessage
  7. * 类描述:地理位置消息
  8. * 创建人:WQ
  9. * 创建时间:2013-10-3 下午4:12:45
  10. * @version
  11. */
  12. public class LocationMessage extends ReceiveBaseMessage{
  13. // 地理位置维度
  14. private String Location_X;
  15. // 地理位置经度
  16. private String Location_Y;
  17. // 地图缩放大小
  18. private String Scale;
  19. // 地理位置信息
  20. private String Label;
  21.  
  22. public String getLocation_X() {
  23. return Location_X;
  24. }
  25.  
  26. public void setLocation_X(String location_X) {
  27. Location_X = location_X;
  28. }
  29.  
  30. public String getLocation_Y() {
  31. return Location_Y;
  32. }
  33.  
  34. public void setLocation_Y(String location_Y) {
  35. Location_Y = location_Y;
  36. }
  37.  
  38. public String getScale() {
  39. return Scale;
  40. }
  41.  
  42. public void setScale(String scale) {
  43. Scale = scale;
  44. }
  45.  
  46. public String getLabel() {
  47. return Label;
  48. }
  49.  
  50. public void setLabel(String label) {
  51. Label = label;
  52. }
  53. }

  请求消息中的链接消息

  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. * 项目名称:wechatlib
  6. * 类名称:MusicMessage
  7. * 类描述:音乐消息
  8. * 创建人:WQ
  9. * 创建时间:2013-10-3 下午4:11:19
  10. * @version
  11. */
  12. public class MusicMessage extends SendBaseMessage{
  13. // 音乐
  14. private Music Music;
  15.  
  16. public Music getMusic() {
  17. return Music;
  18. }
  19.  
  20. public void setMusic(Music music) {
  21. Music = music;
  22. }
  23. }

  音乐消息中的music类

  1. package xidian.wq.wechatlib.entity.send;
  2.  
  3. /**
  4. *
  5. * 项目名称:wechatlib
  6. * 类名称:Music
  7. * 类描述:音乐model
  8. * 创建人:WQ
  9. * 创建时间:2013-10-3 下午4:11:03
  10. * @version
  11. */
  12. public class Music {
  13. // 音乐名称
  14. private String Title;
  15. // 音乐描述
  16. private String Description;
  17. // 音乐链接
  18. private String MusicUrl;
  19. // 高质量音乐链接,WIFI环境优先使用该链接播放音乐
  20. private String HQMusicUrl;
  21.  
  22. public String getTitle() {
  23. return Title;
  24. }
  25.  
  26. public void setTitle(String title) {
  27. Title = title;
  28. }
  29.  
  30. public String getDescription() {
  31. return Description;
  32. }
  33.  
  34. public void setDescription(String description) {
  35. Description = description;
  36. }
  37.  
  38. public String getMusicUrl() {
  39. return MusicUrl;
  40. }
  41.  
  42. public void setMusicUrl(String musicUrl) {
  43. MusicUrl = musicUrl;
  44. }
  45.  
  46. public String getHQMusicUrl() {
  47. return HQMusicUrl;
  48. }
  49.  
  50. public void setHQMusicUrl(String musicUrl) {
  51. HQMusicUrl = musicUrl;
  52. }
  53. }

  回复消息中的图文消息

  1. package xidian.wq.wechatlib.entity.send;
  2.  
  3. import java.util.List;
  4.  
  5. /**
  6. *
  7. * 项目名称:wechatlib
  8. * 类名称:NewsMessage
  9. * 类描述:图文消息
  10. * 创建人:WQ
  11. * 创建时间:2013-10-3 下午4:11:32
  12. * @version
  13. */
  14. public class NewsMessage extends SendBaseMessage{
  15. // 图文消息个数,限制为10条以内
  16. private int ArticleCount;
  17. // 多条图文消息信息,默认第一个item为大图
  18. private List<Article> Articles;
  19.  
  20. public int getArticleCount() {
  21. return ArticleCount;
  22. }
  23.  
  24. public void setArticleCount(int articleCount) {
  25. ArticleCount = articleCount;
  26. }
  27.  
  28. public List<Article> getArticles() {
  29. return Articles;
  30. }
  31.  
  32. public void setArticles(List<Article> articles) {
  33. Articles = articles;
  34. }
  35. }

  图文消息中的article类

  1. package xidian.wq.wechatlib.entity.send;
  2.  
  3. /**
  4. *
  5. * 项目名称:wechatlib
  6. * 类名称:Article
  7. * 类描述:图文model
  8. * 创建人:WQ
  9. * 创建时间:2013-10-3 下午4:10:51
  10. * @version
  11. */
  12. public class Article {
  13. // 图文消息名称
  14. private String Title;
  15. // 图文消息描述
  16. private String Description;
  17. // 图片链接,支持JPG、PNG格式,较好的效果为大图600*300,小图80*80,限制图片链接的域名需要与开发者填写的基本资料中的Url一致
  18. private String PicUrl;
  19. // 点击图文消息跳转链接
  20. private String Url;
  21.  
  22. public String getTitle() {
  23. return Title;
  24. }
  25.  
  26. public void setTitle(String title) {
  27. Title = title;
  28. }
  29.  
  30. public String getDescription() {
  31. return null == Description ? "" : Description;
  32. }
  33.  
  34. public void setDescription(String description) {
  35. Description = description;
  36. }
  37.  
  38. public String getPicUrl() {
  39. return null == PicUrl ? "" : PicUrl;
  40. }
  41.  
  42. public void setPicUrl(String picUrl) {
  43. PicUrl = picUrl;
  44. }
  45.  
  46. public String getUrl() {
  47. return null == Url ? "" : Url;
  48. }
  49.  
  50. public void setUrl(String url) {
  51. Url = url;
  52. }
  53. }

  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. * 扩展xstream,使其支持CDATA块
  161. *
  162. * @date 2013-05-19
  163. */
  164. private static XStream xstream = new XStream(new XppDriver() {
  165. public HierarchicalStreamWriter createWriter(Writer out) {
  166. return new PrettyPrintWriter(out) {
  167. // 对所有xml节点的转换都增加CDATA标记
  168. boolean cdata = true;
  169. @SuppressWarnings("unchecked")
  170. public void startNode(String name, Class clazz) {
  171. super.startNode(name, clazz);
  172. }
  173. protected void writeText(QuickWriter writer, String text) {
  174. if (cdata) {
  175. writer.write("<![CDATA[");
  176. writer.write(text);
  177. writer.write("]]>");
  178. } else {
  179. writer.write(text);
  180. }
  181. }
  182. };
  183. }
  184. });
  185. }

  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. * 项目名称:wechatlib
  14. * 类名称:SignUtil
  15. * 类描述:url配置请求校验工具类
  16. * 创建人:WQ
  17. * 创建时间:2013-10-3 下午4:09:14
  18. * @version
  19. */
  20. public class SignUtil {
  21. // 与接口配置信息中的Token要一致
  22. private static String token = "fromsedion";
  23. /**
  24. * 验证签名
  25. *
  26. * @param signature 微信加密签名
  27. * @param timestamp 时间戳
  28. * @param nonce 随机数
  29. * @return
  30. */
  31. public static boolean checkSignature(String signature, String timestamp, String nonce) {
  32. String[] arr = new String[] { token, timestamp, nonce };
  33. // 将token、timestamp、nonce三个参数进行字典序排序
  34. Arrays.sort(arr);
  35. StringBuilder content = new StringBuilder();
  36. for (int i = 0; i < arr.length; i++) {
  37. content.append(arr[i]);
  38. }
  39. MessageDigest md = null;
  40. String tmpStr = null;
  41.  
  42. try {
  43. md = MessageDigest.getInstance("SHA-1");
  44. // 将三个参数字符串拼接成一个字符串进行sha1加密
  45. byte[] digest = md.digest(content.toString().getBytes());
  46. tmpStr = byteToStr(digest);
  47. } catch (NoSuchAlgorithmException e) {
  48. e.printStackTrace();
  49. }
  50.  
  51. content = null;
  52. // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
  53. return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
  54. }
  55.  
  56. /**
  57. * 将字节数组转换为十六进制字符串
  58. *
  59. * @param byteArray
  60. * @return
  61. */
  62. private static String byteToStr(byte[] byteArray) {
  63. String strDigest = "";
  64. for (int i = 0; i < byteArray.length; i++) {
  65. strDigest += byteToHexStr(byteArray[i]);
  66. }
  67. return strDigest;
  68. }
  69.  
  70. /**
  71. * 将字节转换为十六进制字符串
  72. *
  73. * @param mByte
  74. * @return
  75. */
  76. private static String byteToHexStr(byte mByte) {
  77. char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
  78. char[] tempArr = new char[2];
  79. tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
  80. tempArr[1] = Digit[mByte & 0X0F];
  81. String s = new String(tempArr);
  82. return s;
  83. }
  84. }

  

  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

 
菜鸟胖子总结,如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号codenewbie来支持胖子!若有不妥之处,欢迎指点。

转帖请注明本文出自胖子的博客(http://www.cnblogs.com/Codenewbie),请尊重他人的辛勤劳动成果,谢谢!

微信公众平台自动回复wechatlib.jar的生成及wechatlib解析的更多相关文章

  1. 微信公众平台java开发详解(工程代码+解析)

    原文:http://blog.csdn.net/pamchen/article/details/38718947 说明:本次的教程主要是对微信公众平台开发者模式的讲解,网络上很多类似文章,但很多都让初 ...

  2. 微信公众平台java开发具体解释(project代码+解析)

    说明: 本次的教程主要是对微信公众平台开发人员模式的解说,网络上非常多类似文章,但非常多都让初学微信开发的人一头雾水,所以总结自己的微信开发经验,将微信开发的整个过程系统的列出,并对主要代码进行解说分 ...

  3. 微信公众平台开发教程--方培工作室,PHP语言版本

    准备工作 微信公众平台的注册 介绍如何注册一个微信公众账号. 入门教程 微信公众平台开发入门教程 内容:1.申请SAE作为服务器; 2.启用开发模式; 3.微信公众平台PHP SDK; 4.接收发送消 ...

  4. 自动回复消息-微信公众平台开发4(asp.net)

    接着上一节的processRequest 处理函数,代码如下: /// <summary>    /// 处理微信发来的请求     /// </summary>    /// ...

  5. 利用微信公众平台实现自动回复消息—java版

    最近公司需要拿微信公众平台做个东西,所以就开始了最基本学习,网上很多是php版的,对于我这个只会java,不会php的就只能在网上找点只言片语来一点一点学习了.不费话了直接贴图看效果(很简单的). 不 ...

  6. C# asp.net 搭建微信公众平台(可实现关注消息与消息自动回复)的代码以及我所遇到的问题

    [引言] 利用asp.net搭建微信公众平台的案例并不多,微信官方给的案例是用PHP的,网上能找到的代码很多也是存在着这样那样的问题或者缺少部分方法,无法使用,下面是我依照官方文档写的基于.net 搭 ...

  7. 微信公众平台开发,模板消息,网页授权,微信JS-SDK,二维码生成(4)

    微信公众平台开发,模板消息,什么是模板消息,模板消息接口指的是向用户发送重要的服务通知,只能用于符合场景的要求中去,如信用卡刷卡通知,购物成功通知等等.不支持广告营销,打扰用户的消息,模板消息类有固定 ...

  8. 微信公众平台开发,图文回复、access_token生成调用、以及微信SDK的实现(2)

    上一节课,我给大家分享了微信API接入以及事件推送的回复,这是微信开发的第二节课,重点给说一说单图文回复,多图文回复,access_token,微信SDK. 公众号消息回复很多种形式,常见的形式有,文 ...

  9. *** wechat-php-sdk 微信公众平台php开发包

    wechat-php-sdk 微信公众平台php开发包,细化各项接口操作,支持链式调用,欢迎Fork此项目weixin developer SDK. 项目地址:https://github.com/d ...

随机推荐

  1. Zookeeper API for JAVA实战与应用

    package com.zookeeper.watcher; import java.util.List; import java.util.concurrent.CountDownLatch; im ...

  2. 未找到与约束 ContractName Microsoft.VisualStudio.Text.ITextBufferFactoryService RequiredTypeIdentity Microsoft.VisualStudio.Text.ITextBufferFactoryService

    问题:vs2013在装了 之后,重启,打开VS提示: 未找到与约束 ContractName Microsoft.VisualStudio.Text.ITextBufferFactoryService ...

  3. .NET 基础 一步步 一幕幕 [注释、命名规则、访问修饰符、数据类型、常量、变量]

    注释.命名规则.访问修饰符.数据类型.常量.变量 话说一个不会写注释的程序猿的不是一个好吃货,我们本篇就从注释开始说起好了. 在C#中有三种注释: 第一种:单行注释  以//开头,后面的就是注释内容 ...

  4. Linux下安装Java环境配置步骤详述

    0.下载jdk8 登录网址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html选择对 ...

  5. ORA-01652:无法通过128(在表空间temp中)扩展temp段 解决方法

    ORA-01652:无法通过128(在表空间temp中)扩展temp段 解决方法 (2016-10-21 16:49:53)   今天在做一个查询的时候,报了一个"ORA-01652无法通过 ...

  6. MongoDB 安装和可视化工具

    MongoDB 是一款非常热门的NoSQL,面向文档的数据库管理系统,官方下载地址是:MongoDB,博主选择的是 Enterprise Server (MongoDB 3.2.9)版本,安装在Win ...

  7. SSISDB1:使用SSISDB管理SSIS Projects

    使用Project Deployment Model,将SSIS Project部署到Integration Services Catalog之后,SSISDB负责管理SSIS Project.在SS ...

  8. SQL Server 解读【已分区索引的特殊指导原则】(1)- 索引对齐

    一.前言 在MSDN上看到一篇关于SQL Server 表分区的文档:已分区索引的特殊指导原则,如果你对表分区没有实战经验的话是比较难理解文档里面描述的意思.这里我就里面的一些概念进行讲解,方便大家的 ...

  9. 解密jQuery内核 DOM操作的核心函数domManip

    domManip是什么 dom即Dom元素,Manip是Manipulate的缩写,连在一起就是Dom操作的意思. .domManip()是jQuery DOM操作的核心函数 对封装的节点操作做了参数 ...

  10. js 根据屏幕大小调用不同的css文件

    原因:屏幕大小不一样,网站看起来总觉得怪怪的,所以,针对不同大小的屏幕,写了不同的css,写完了,要解决的问题就是:怎么根据屏幕的大小来引用不同的CSS,下面就是解决方法了. 解决方法:首先,在hea ...