微信开发手册(7)
1、图文消息的主要参数说明通过微信官方的消息接口指南,可以看到对图文消息的参数介绍,如下图所示:
2、从图中可以了解到:1)图文消息的个数限制为10,也就是图中ArticleCount的值(图文消息的个数,限制在10条以内);2)对于多图文消息,第一条图文的图片显示为大图,其他图文的图片显示为小图;3)第一条图文的图片大小建议为640*320,其他图文的图片大小建议为80*80;好了,了解这些,再结合消息及消息处理工具的封装,想要回复图文消息给用户也就不是什么难事了。
3、图文消息的多种表现形式下面直接通过代码演示图文消息最主要的五种表现形式的用法,源代码如下:pa罕铞泱殳ckage edu.siso.service;import java.util.ArrayList;import java.util.Date;import java.util.List;import java.util.Map;import javax.servlet.http.HttpServletRequest;import edu.siso.resp.Article;import edu.siso.resp.NewsMessage;import edu.siso.resp.TextMessage;import edu.siso.util.BaseUtil;import edu.siso.util.MessageUtil;public class CoreService { /** * 处理微信发来的请求 * * @param request * @return */ public static String processRequest(HttpServletRequest request) { String respMessage = null; try { // 默认返回的文本消息内容 String respContent = "请求处理异常,请稍候尝试!"; // xml请求解析 Map<String, String> requestMap = MessageUtil.parseXml(request); // 发送方帐号(open_id) String fromUserName = requestMap.get("FromUserName"); // 公众帐号 String toUserName = requestMap.get("ToUserName"); // 消息类型 String msgType = requestMap.get("MsgType"); // 回复文本消息 TextMessage textMessage = new TextMessage(); textMessage.setToUserName(fromUserName); textMessage.setFromUserName(toUserName); textMessage.setCreateTime(new Date().getTime()); textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT); textMessage.setFuncFlag(0); respContent = BaseUtil.getMainMenu(); textMessage.setContent(respContent); respMessage = MessageUtil.textMessageToXml(textMessage); // 文本消息 if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) { String Content = requestMap.get("Content"); // 创建图文消息 NewsMessage newsMessage = new NewsMessage(); newsMessage.setToUserName(fromUserName); newsMessage.setFromUserName(toUserName); newsMessage.setCreateTime(new Date().getTime()); newsMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_NEWS); newsMessage.setFuncFlag(0); if (Content.equals("1")) { respContent = "<a href=\"http://www.baidu.com/\">百度</a>"; textMessage.setContent(respContent); respMessage = MessageUtil.textMessageToXml(textMessage); } if (Content.equals("2")) { List<Article> articleList = new ArrayList<Article>(); Article article = new Article(); article.setTitle("我能开发微信啦"); article.setDescription("努力的程序员—钟仁,历时三天,成功开发微信..."); article.setPicUrl("http://a.hiphotos.baidu.com/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26%3Bt%3Dgif/sign=3bb6b7b60db30f242197e451a9fcba26/64380cd7912397dde17b84d35b82b2b7d1a287e2.jpg"); article.setUrl("http://baike.baidu.com/view/5160047.htm?fr=aladdin"); articleList.add(article); Article article2 = new Article(); article2.setTitle("第一天"); article2.setDescription(""); article2.setPicUrl("http://a.hiphotos.baidu.com/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26%3Bt%3Dgif/sign=3bb6b7b60db30f242197e451a9fcba26/64380cd7912397dde17b84d35b82b2b7d1a287e2.jpg"); article2.setUrl("http://baike.baidu.com/view/5160047.htm?fr=aladdin"); articleList.add(article2); Article article3 = new Article(); article3.setTitle("第二天"); article3.setDescription(""); article3.setPicUrl("http://a.hiphotos.baidu.com/baike/c0%3Dbaike80%2C5%2C5%2C80%2C26%3Bt%3Dgif/sign=3bb6b7b60db30f242197e451a9fcba26/64380cd7912397dde17b84d35b82b2b7d1a287e2.jpg"); article3.setUrl("http://baike.baidu.com/view/5160047.htm?fr=aladdin"); articleList.add(article3); // 设置图文消息个数 newsMessage.setArticleCount(articleList.size()); // 设置图文消息包含的图文集合 newsMessage.setArticles(articleList); // 将图文消息对象转换成xml字符串 respMessage = MessageUtil.newsMessageToXml(newsMessage); } if (BaseUtil.isQqFace(Content)) { respContent = Content; textMessage.setContent(respContent); respMessage = MessageUtil.textMessageToXml(textMessage); } } // 图片消息 else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) { respContent = "您发送的是图片消息!"; } // 地理位置消息 else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) { respContent = "您发送的是地理位置消息!"; } // 链接消息 else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) { respContent = "您发送的是链接消息!"; } // 音频消息 else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) { respContent = "您发送的是音频消息!"; } // 事件推送 else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) { // 事件类型 String eventType = requestMap.get("Event"); // 订阅 if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) { respContent = "谢谢您的关注!"; textMessage.setContent(respContent); respMessage = MessageUtil.textMessageToXml(textMessage); } // 取消订阅 else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) { // TODO 取消订阅后用户再收不到公众号发送的消息,因此不需要回复消息 } // 自定义菜单点击事件 else if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) { // TODO 自定义菜单权没有开放,暂不处理该类消息 String eventKey = requestMap.get("EventKey"); if (eventKey.equals("11")) { respContent = "百度菜单项被点击!"; } else if (eventKey.equals("12")) { respContent = "公交查询菜单项被点击!"; } else if (eventKey.equals("13")) { respContent = "周边搜索菜单项被点击!"; } else if (eventKey.equals("14")) { respContent = "历史上的今天菜单项被点击!"; } else if (eventKey.equals("21")) { respContent = "最新动态!"; } else if (eventKey.equals("22")) { respContent = "我要专接本!"; } textMessage.setContent(respContent); respMessage = MessageUtil.textMessageToXml(textMessage); } } } catch (Exception e) { e.printStackTrace(); } return respMessage; }}
4、a)用户发送1,回复文本信息b)用户发送2,回复图文消息
5、最后,根据实践经验,我对图文消息做一个使用总结:1)一定要给图文消息的Url属性赋值。不管是单图文,还是多图文,或者是不含图片的图文,都有可能会被用户点击。如果Url为空,用户点击后将会打开一个空白页面,这给用户的体验是非常差的;2)只有单图文的描述才会显示,多图文的描述不会被显示;3)图文消息的标题、描述中可以使用QQ表情和符号表情。合理地运用表情符号,会使得消息更加生动;4)图文消息的标题、描述中可以使用换行符。合理地使用换行符,会使得内容结构更加清晰;5)图文消息的标题、描述中不支持超文本链接(html的<a>标签)。不只是技术上实现不了,就连逻辑上也说不通,因为一条图文消息的任何位置被点击,都将调用微信内置的浏览器打开Url,如果标题、描述里再放几个超链接,不知道点击该打开哪个页面。真搞不懂为什么有好几个同学都在问这个问题,难道设计成多图文不好吗?6)图文消息的链接、图片链接可以使用外部域名下的资源。7)使用指定大小的图片。第一条图文的图片大小建议为640*320,其他图文的图片大小建议为80*80。如果使用的图片太大,加载慢,而且耗流量;如果使用的图片太小,显示后会被拉伸,失真了很难看。8)每条图文消息的图文建议控制在1-4条。这样在绝大多数终端上一屏能够显示完,用户扫一眼就能大概了解消息的主要内容,这样最有可能促使用户去点击并阅读。