微信开发多图文消息_2019 微信开发者模式 回复多图文消息 - CSDN
  • 引言: 上一章讲到了消息的接收和...在微信中用的最多的信息还是图文消息,本章就为大家讲解下微信图文消息是如何实现的。 包括单图文多图文消息图文消息的XML数据包结构: [xml] view plai

    转载于:http://blog.csdn.net/tuposky/article/details/40589319

    引言:

    上一章讲到了消息的接收和发送,但是讲的是最简单的文本信息。

    微信中用的最多的信息还是图文消息,本章就为大家讲解下微信图文消息是如何实现的。

    包括单图文和多图文消息。

    图文消息的XML数据包结构:

    [xml] view plain copy
    1. <xml>  
    2. <ToUserName><![CDATA[toUser]]></ToUserName>  
    3. <FromUserName><![CDATA[fromUser]]></FromUserName>  
    4. <CreateTime>12345678</CreateTime>  
    5. <MsgType><![CDATA[news]]></MsgType>  
    6. <ArticleCount>2</ArticleCount>  
    7. <Articles>  
    8. <item>  
    9. <Title><![CDATA[title1]]></Title>   
    10. <Description><![CDATA[description1]]></Description>  
    11. <PicUrl><![CDATA[picurl]]></PicUrl>  
    12. <Url><![CDATA[url]]></Url>  
    13. </item>  
    14. <item>  
    15. <Title><![CDATA[title]]></Title>  
    16. <Description><![CDATA[description]]></Description>  
    17. <PicUrl><![CDATA[picurl]]></PicUrl>  
    18. <Url><![CDATA[url]]></Url>  
    19. </item>  
    20. </Articles>  
    21. </xml>  

       

     

    从上面结构图中可以看出要注意的几点

    1、图文消息的条数最大限制为10,

    2、多图文中列表中的第一个为大图,其余为小图

    注意:在多图文模式下只有第一个可以显示描述信息,其余的都不显示

    了解了图文消息的结构后,要发送图文消息就简单了。

    我们之前已经封装过消息处理的代码和图文消息的实体类,这里就不啰嗦了,不知道的可以看上一章

    微信公众平台开发教程Java版(三) 消息接收和发送

     

    下面我就上单图文和多图文消息的源代码

     

    [java] view plain copy
    1. package com.ifp.weixin.biz.core.impl;  
    2.   
    3. import java.util.ArrayList;  
    4. import java.util.Date;  
    5. import java.util.List;  
    6. import java.util.Map;  
    7.   
    8. import javax.servlet.http.HttpServletRequest;  
    9.   
    10. import org.apache.log4j.Logger;  
    11. import org.springframework.stereotype.Service;  
    12.   
    13. import com.ifp.weixin.biz.core.CoreService;  
    14. import com.ifp.weixin.constant.Constant;  
    15. import com.ifp.weixin.entity.Message.resp.Article;  
    16. import com.ifp.weixin.entity.Message.resp.NewsMessage;  
    17. import com.ifp.weixin.entity.Message.resp.TextMessage;  
    18. import com.ifp.weixin.util.MessageUtil;  
    19.   
    20. @Service("coreService")  
    21. public class CoreServiceImpl implements CoreService {  
    22.   
    23.     public static Logger log = Logger.getLogger(CoreServiceImpl.class);  
    24.   
    25.     @Override  
    26.     public String processRequest(HttpServletRequest request) {  
    27.         String respMessage = null;  
    28.         try {  
    29.             // xml请求解析  
    30.             Map<String, String> requestMap = MessageUtil.parseXml(request);  
    31.   
    32.             // 发送方帐号(open_id)  
    33.             String fromUserName = requestMap.get("FromUserName");  
    34.             // 公众帐号  
    35.             String toUserName = requestMap.get("ToUserName");  
    36.             // 消息类型  
    37.             String msgType = requestMap.get("MsgType");  
    38.   
    39.             TextMessage textMessage = new TextMessage();  
    40.             textMessage.setToUserName(fromUserName);  
    41.             textMessage.setFromUserName(toUserName);  
    42.             textMessage.setCreateTime(new Date().getTime());  
    43.             textMessage.setMsgType(Constant.RESP_MESSAGE_TYPE_TEXT);  
    44.             textMessage.setFuncFlag(0);  
    45.               
    46.             // 文本消息  
    47.             if (msgType.equals(Constant.REQ_MESSAGE_TYPE_TEXT)) {  
    48.                 // 接收用户发送的文本消息内容  
    49.                 String content = requestMap.get("Content");  
    50.   
    51.                 // 创建图文消息  
    52.                 NewsMessage newsMessage = new NewsMessage();  
    53.                 newsMessage.setToUserName(fromUserName);  
    54.                 newsMessage.setFromUserName(toUserName);  
    55.                 newsMessage.setCreateTime(new Date().getTime());  
    56.                 newsMessage.setMsgType(Constant.RESP_MESSAGE_TYPE_NEWS);  
    57.                 newsMessage.setFuncFlag(0);  
    58.   
    59.                 List<Article> articleList = new ArrayList<Article>();  
    60.                 // 单图文消息  
    61.                 if ("1".equals(content)) {  
    62.                     Article article = new Article();  
    63.                     article.setTitle("我是一条单图文消息");  
    64.                     article.setDescription("我是描述信息,哈哈哈哈哈哈哈。。。");  
    65.                     article.setPicUrl("http://www.iteye.com/upload/logo/user/603624/2dc5ec35-073c-35e7-9b88-274d6b39d560.jpg");  
    66.                     article.setUrl("http://tuposky.iteye.com");  
    67.                     articleList.add(article);  
    68.                     // 设置图文消息个数  
    69.                     newsMessage.setArticleCount(articleList.size());  
    70.                     // 设置图文消息包含的图文集合  
    71.                     newsMessage.setArticles(articleList);  
    72.                     // 将图文消息对象转换成xml字符串  
    73.                     respMessage = MessageUtil.newsMessageToXml(newsMessage);  
    74.                 }  
    75.                 // 多图文消息  
    76.                 else if ("3".equals(content)) {  
    77.                     Article article1 = new Article();  
    78.                     article1.setTitle("我是一条多图文消息");  
    79.                     article1.setDescription("");  
    80.                     article1.setPicUrl("http://www.isic.cn/viewResourcesAction//logo/20130913/2013091314543416032.jpg");  
    81.                     article1.setUrl("http://tuposky.iteye.com/blog/2008583");  
    82.   
    83.                     Article article2 = new Article();  
    84.                     article2.setTitle("微信公众平台开发教程Java版(二)接口配置 ");  
    85.                     article2.setDescription("");  
    86.                     article2.setPicUrl("http://www.isic.cn/viewResourcesAction//logo/20131021/2013102111243367254.jpg");  
    87.                     article2.setUrl("http://tuposky.iteye.com/blog/2008655");  
    88.   
    89.                     Article article3 = new Article();  
    90.                     article3.setTitle("微信公众平台开发教程Java版(三) 消息接收和发送");  
    91.                     article3.setDescription("");  
    92.                     article3.setPicUrl("http://www.isic.cn/viewResourcesAction//logo/20131021/2013102111291287031.jpg");  
    93.                     article3.setUrl("http://tuposky.iteye.com/blog/2017429");  
    94.   
    95.                     articleList.add(article1);  
    96.                     articleList.add(article2);  
    97.                     articleList.add(article3);  
    98.                     newsMessage.setArticleCount(articleList.size());  
    99.                     newsMessage.setArticles(articleList);  
    100.                     respMessage = MessageUtil.newsMessageToXml(newsMessage);  
    101.                 }   
    102.             }  
    103.         } catch (Exception e) {  
    104.             e.printStackTrace();  
    105.         }  
    106.         return respMessage;  
    107.     }  
    108.   
    109. }  

     

    单个图文和多图文的处理方式其实是一样的

    单图文的时候articleList 的size为1

    多图文的时候为多个。

     

    运行的效果截图如下:

    用户发送1,单图文消息

     

    用户发送3 多图文消息

     

     Ps: 图文消息中的图片是可以引用外部资源的!

     

     

     可加我的微信公众号一起讨论

    微信公众号:andedaohang

    或扫描二维码



     

     转载请注明出处:http://blog.csdn.net/tuposky/article/details/40589319

    展开全文
  • 本篇主要介绍微信公众帐号开发图文消息的使用,以及图文消息的几种表现形式。标题取名为“图文消息全攻略”,这绝对不是标题党,是想借此机会把大家对图文消息相关的问题、疑虑、障碍全部清除掉。 图文消息的主要...

    本篇主要介绍微信公众帐号开发中图文消息的使用,以及图文消息的几种表现形式。标题取名为“图文消息全攻略”,这绝对不是标题党,是想借此机会把大家对图文消息相关的问题、疑虑、障碍全部清除掉。

    图文消息的主要参数说明

    通过微信官方的消息接口指南,可以看到对图文消息的参数介绍,如下图所示:

    从图中可以了解到:

    1)图文消息的个数限制为10,也就是图中ArticleCount的值(图文消息的个数,限制在10条以内);

    2)对于多图文消息,第一条图文的图片显示为大图,其他图文的图片显示为小图;

    3)第一条图文的图片大小建议为640*320,其他图文的图片大小建议为80*80;

    好了,了解这些,再结合前面所讲的消息及消息处理工具的封装,想要回复图文消息给用户也就不是什么难事了。

    图文消息的多种表现形式

    下面直接通过代码演示图文消息最主要的五种表现形式的用法,源代码如下:

    
     
    1. package org.liufeng.course.service; 
    2.  
    3. import java.util.ArrayList; 
    4. import java.util.Date; 
    5. import java.util.List; 
    6. import java.util.Map; 
    7.  
    8. import javax.servlet.http.HttpServletRequest; 
    9.  
    10. import org.liufeng.course.message.resp.Article; 
    11. import org.liufeng.course.message.resp.NewsMessage; 
    12. import org.liufeng.course.message.resp.TextMessage; 
    13. import org.liufeng.course.util.MessageUtil; 
    14.  
    15. /** 
    16.  * 核心服务类 
    17.  *  
    18.  * @author liufeng 
    19.  * @date 2013-07-25 
    20.  */ 
    21. public class CoreService { 
    22.     /** 
    23.      * 处理微信发来的请求 
    24.      *  
    25.      * @param request 
    26.      * @return 
    27.      */ 
    28.     public static String processRequest(HttpServletRequest request) { 
    29.         String respMessage = null
    30.         try { 
    31.             // xml请求解析 
    32.             Map<String, String> requestMap = MessageUtil.parseXml(request); 
    33.  
    34.             // 发送方帐号(open_id) 
    35.             String fromUserName = requestMap.get("FromUserName"); 
    36.             // 公众帐号 
    37.             String toUserName = requestMap.get("ToUserName"); 
    38.             // 消息类型 
    39.             String msgType = requestMap.get("MsgType"); 
    40.  
    41.             // 默认回复此文本消息 
    42.             TextMessage textMessage = new TextMessage(); 
    43.             textMessage.setToUserName(fromUserName); 
    44.             textMessage.setFromUserName(toUserName); 
    45.             textMessage.setCreateTime(new Date().getTime()); 
    46.             textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT); 
    47.             textMessage.setFuncFlag(0); 
    48.             // 由于href属性值必须用双引号引起,这与字符串本身的双引号冲突,所以要转义 
    49.             textMessage.setContent("欢迎访问<a href=\"http://blog.csdn.net/lyq8479\">柳峰的博客</a>!"); 
    50.             // 将文本消息对象转换成xml字符串 
    51.             respMessage = MessageUtil.textMessageToXml(textMessage); 
    52.  
    53.             // 文本消息 
    54.             if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) { 
    55.                 // 接收用户发送的文本消息内容 
    56.                 String content = requestMap.get("Content"); 
    57.  
    58.                 // 创建图文消息 
    59.                 NewsMessage newsMessage = new NewsMessage(); 
    60.                 newsMessage.setToUserName(fromUserName); 
    61.                 newsMessage.setFromUserName(toUserName); 
    62.                 newsMessage.setCreateTime(new Date().getTime()); 
    63.                 newsMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_NEWS); 
    64.                 newsMessage.setFuncFlag(0); 
    65.  
    66.                 List<Article> articleList = new ArrayList<Article>(); 
    67.                 // 单图文消息 
    68.                 if ("1".equals(content)) { 
    69.                     Article article = new Article(); 
    70.                     article.setTitle("微信公众帐号开发教程Java版"); 
    71.                     article.setDescription("柳峰,80后,微信公众帐号开发经验4个月。为帮助初学者入门,特推出此系列教程,也希望借此机会认识更多同行!"); 
    72.                     article.setPicUrl("http://0.xiaoqrobot.duapp.com/images/avatar_liufeng.jpg"); 
    73.                     article.setUrl("http://blog.csdn.net/lyq8479"); 
    74.                     articleList.add(article); 
    75.                     // 设置图文消息个数 
    76.                     newsMessage.setArticleCount(articleList.size()); 
    77.                     // 设置图文消息包含的图文集合 
    78.                     newsMessage.setArticles(articleList); 
    79.                     // 将图文消息对象转换成xml字符串 
    80.                     respMessage = MessageUtil.newsMessageToXml(newsMessage); 
    81.                 } 
    82.                 // 单图文消息---不含图片 
    83.                 else if ("2".equals(content)) { 
    84.                     Article article = new Article(); 
    85.                     article.setTitle("微信公众帐号开发教程Java版"); 
    86.                     // 图文消息中可以使用QQ表情、符号表情 
    87.                     article.setDescription("柳峰,80后," + emoji(0x1F6B9
    88.                             + ",微信公众帐号开发经验4个月。为帮助初学者入门,特推出此系列连载教程,也希望借此机会认识更多同行!\n\n目前已推出教程共12篇,包括接口配置、消息封装、框架搭建、QQ表情发送、符号表情发送等。\n\n后期还计划推出一些实用功能的开发讲解,例如:天气预报、周边搜索、聊天功能等。"); 
    89.                     // 将图片置为空 
    90.                     article.setPicUrl(""); 
    91.                     article.setUrl("http://blog.csdn.net/lyq8479"); 
    92.                     articleList.add(article); 
    93.                     newsMessage.setArticleCount(articleList.size()); 
    94.                     newsMessage.setArticles(articleList); 
    95.                     respMessage = MessageUtil.newsMessageToXml(newsMessage); 
    96.                 } 
    97.                 // 多图文消息 
    98.                 else if ("3".equals(content)) { 
    99.                     Article article1 = new Article(); 
    100.                     article1.setTitle("微信公众帐号开发教程\n引言"); 
    101.                     article1.setDescription(""); 
    102.                     article1.setPicUrl("http://0.xiaoqrobot.duapp.com/images/avatar_liufeng.jpg"); 
    103.                     article1.setUrl("http://blog.csdn.net/lyq8479/article/details/8937622"); 
    104.  
    105.                     Article article2 = new Article(); 
    106.                     article2.setTitle("第2篇\n微信公众帐号的类型"); 
    107.                     article2.setDescription(""); 
    108.                     article2.setPicUrl("http://avatar.csdn.net/1/4/A/1_lyq8479.jpg"); 
    109.                     article2.setUrl("http://blog.csdn.net/lyq8479/article/details/8941577"); 
    110.  
    111.                     Article article3 = new Article(); 
    112.                     article3.setTitle("第3篇\n开发模式启用及接口配置"); 
    113.                     article3.setDescription(""); 
    114.                     article3.setPicUrl("http://avatar.csdn.net/1/4/A/1_lyq8479.jpg"); 
    115.                     article3.setUrl("http://blog.csdn.net/lyq8479/article/details/8944988"); 
    116.  
    117.                     articleList.add(article1); 
    118.                     articleList.add(article2); 
    119.                     articleList.add(article3); 
    120.                     newsMessage.setArticleCount(articleList.size()); 
    121.                     newsMessage.setArticles(articleList); 
    122.                     respMessage = MessageUtil.newsMessageToXml(newsMessage); 
    123.                 } 
    124.                 // 多图文消息---首条消息不含图片 
    125.                 else if ("4".equals(content)) { 
    126.                     Article article1 = new Article(); 
    127.                     article1.setTitle("微信公众帐号开发教程Java版"); 
    128.                     article1.setDescription(""); 
    129.                     // 将图片置为空 
    130.                     article1.setPicUrl(""); 
    131.                     article1.setUrl("http://blog.csdn.net/lyq8479"); 
    132.  
    133.                     Article article2 = new Article(); 
    134.                     article2.setTitle("第4篇\n消息及消息处理工具的封装"); 
    135.                     article2.setDescription(""); 
    136.                     article2.setPicUrl("http://avatar.csdn.net/1/4/A/1_lyq8479.jpg"); 
    137.                     article2.setUrl("http://blog.csdn.net/lyq8479/article/details/8949088"); 
    138.  
    139.                     Article article3 = new Article(); 
    140.                     article3.setTitle("第5篇\n各种消息的接收与响应"); 
    141.                     article3.setDescription(""); 
    142.                     article3.setPicUrl("http://avatar.csdn.net/1/4/A/1_lyq8479.jpg"); 
    143.                     article3.setUrl("http://blog.csdn.net/lyq8479/article/details/8952173"); 
    144.  
    145.                     Article article4 = new Article(); 
    146.                     article4.setTitle("第6篇\n文本消息的内容长度限制揭秘"); 
    147.                     article4.setDescription(""); 
    148.                     article4.setPicUrl("http://avatar.csdn.net/1/4/A/1_lyq8479.jpg"); 
    149.                     article4.setUrl("http://blog.csdn.net/lyq8479/article/details/8967824"); 
    150.  
    151.                     articleList.add(article1); 
    152.                     articleList.add(article2); 
    153.                     articleList.add(article3); 
    154.                     articleList.add(article4); 
    155.                     newsMessage.setArticleCount(articleList.size()); 
    156.                     newsMessage.setArticles(articleList); 
    157.                     respMessage = MessageUtil.newsMessageToXml(newsMessage); 
    158.                 } 
    159.                 // 多图文消息---最后一条消息不含图片 
    160.                 else if ("5".equals(content)) { 
    161.                     Article article1 = new Article(); 
    162.                     article1.setTitle("第7篇\n文本消息中换行符的使用"); 
    163.                     article1.setDescription(""); 
    164.                     article1.setPicUrl("http://0.xiaoqrobot.duapp.com/images/avatar_liufeng.jpg"); 
    165.                     article1.setUrl("http://blog.csdn.net/lyq8479/article/details/9141467"); 
    166.  
    167.                     Article article2 = new Article(); 
    168.                     article2.setTitle("第8篇\n文本消息中使用网页超链接"); 
    169.                     article2.setDescription(""); 
    170.                     article2.setPicUrl("http://avatar.csdn.net/1/4/A/1_lyq8479.jpg"); 
    171.                     article2.setUrl("http://blog.csdn.net/lyq8479/article/details/9157455"); 
    172.  
    173.                     Article article3 = new Article(); 
    174.                     article3.setTitle("如果觉得文章对你有所帮助,请通过博客留言或关注微信公众帐号xiaoqrobot来支持柳峰!"); 
    175.                     article3.setDescription(""); 
    176.                     // 将图片置为空 
    177.                     article3.setPicUrl(""); 
    178.                     article3.setUrl("http://blog.csdn.net/lyq8479"); 
    179.  
    180.                     articleList.add(article1); 
    181.                     articleList.add(article2); 
    182.                     articleList.add(article3); 
    183.                     newsMessage.setArticleCount(articleList.size()); 
    184.                     newsMessage.setArticles(articleList); 
    185.                     respMessage = MessageUtil.newsMessageToXml(newsMessage); 
    186.                 } 
    187.             } 
    188.         } catch (Exception e) { 
    189.             e.printStackTrace(); 
    190.         } 
    191.         return respMessage; 
    192.     } 
    193.  
    194.     /** 
    195.      * emoji表情转换(hex -> utf-16) 
    196.      *  
    197.      * @param hexEmoji 
    198.      * @return 
    199.      */ 
    200.     public static String emoji(int hexEmoji) { 
    201.         return String.valueOf(Character.toChars(hexEmoji)); 
    202.     } 

    上面代码实现的功能是当用户发送数字1-5时,分别回复五种不同表现形式的图文消息给用户,如下:

    a)用户发送1,回复单图文消息。参考代码68~81行,运行效果如下:

    b)用户发送2,回复单图文消息---不含图片。参考代码82~96行,运行效果如下:

    说明:图文消息的标题、描述是可以包含QQ表情、符号表情的。

    c)用户发送3,回复多图文消息。参考代码97~123行,运行效果如下:

    说明:对于多图文消息,描述不会被显示,可以在标题使用换行符,使得显示更加美观。

    d)用户发送4,回复多图文消息---首条消息不含图片。参考代码124~158行,运行效果如下:

    e)用户发送5,回复多图文消息---最后一条消息不含图片。参考代码159~186行,运行效果如下:

    可以看出,图文消息有着丰富的内容及多样化的表现形式,希望大家能够根据各自的特点及实际使用需要,合理地运用。

    最后,根据实践经验,我对图文消息做一个使用总结:

    1)一定要给图文消息的Url属性赋值。不管是单图文,还是多图文,或者是不含图片的图文,都有可能会被用户点击。如果Url为空,用户点击后将会打开一个空白页面,这给用户的体验是非常差的;

    2)只有单图文的描述才会显示,多图文的描述不会被显示;

    3)图文消息的标题、描述中可以使用QQ表情和符号表情。合理地运用表情符号,会使得消息更加生动;

    4)图文消息的标题、描述中可以使用换行符。合理地使用换行符,会使得内容结构更加清晰;

    5)图文消息的标题、描述中不支持超文本链接(html的<a>标签)。不只是技术上实现不了,就连逻辑上也说不通,因为一条图文消息的任何位置被点击,都将调用微信内置的浏览器打开Url,如果标题、描述里再放几个超链接,不知道点击该打开哪个页面。真搞不懂为什么有好几个同学都在问这个问题,难道设计成多图文不好吗?

    6)图文消息的链接、图片链接可以使用外部域名下的资源,如本例中:柳峰的头像、博文的链接,都是指向CSDN网站的资源。在网上,甚至是微信官方交流群里,认为图文消息的Url、PicUrl不可以使用外链的大有人在,不知道这谣言从哪开始的,实践是检验真理的唯一标准!

    7)使用指定大小的图片。第一条图文的图片大小建议为640*320,其他图文的图片大小建议为80*80。如果使用的图片太大,加载慢,而且耗流量;如果使用的图片太小,显示后会被拉伸,失真了很难看。

    8)每条图文消息的图文建议控制在1-4条。这样在绝大多数终端上一屏能够显示完,用户扫一眼就能大概了解消息的主要内容,这样最有可能促使用户去点击并阅读。

    展开全文
  • 1.由于个人公众号许多...上一篇创建了一个公用的实体类,这次创建图文消息的回复,我们只需要继承公用的父类,具体实体类如下:public class News { private String Title;//标题 private String Description;//描述...

    1.由于个人公众号许多接口权限用不了,这里方便测试,我们采用测试账号进行开发:



    2.找到回复图文消息相关API文档


    首先查看回复图文消息文本格式如下:


    3.上一篇创建了一个公用的实体类,这次创建图文消息的回复,我们只需要继承公用的父类,具体实体类如下:

    public class News {
    private String Title;//标题
    private String Description;//描述
    private String PicUrl;//图片地址

    private String Url;//访问地址

            set,get方法略。。。。}

    public class NewsMessage extends CommMessage {
    private int ArticleCount;//消息数量

    private List<News> Articles;//消息体

           set,get方法略。。。。

    }

    添加我们需要显示的图片路径


    这里我们同样需要把图文消息转化为XML文件的响应格式,在我们上一次创建的MessageUtil工具类中添加图文转xml及xml转图文的方法,添加图文消息静态常量,代码如下:


           //图文消息转化为XML   
    public static String newsMessageToXml(NewsMessage newsMessage){
    XStream xstream = new XStream();
    xstream.alias("xml", newsMessage.getClass());
    xstream.alias("item", new News().getClass());
    return xstream.toXML(newsMessage);

    }

           //图文消息的组装
    public static String initNewsMessage(String toUserName,String fromUserName){
    String message = null;
    List<News> newList = new ArrayList<News>();
    NewsMessage newsMessage = new NewsMessage();
    News news = new News();
    news.setTitle("JAVA程序员介绍");
    news.setDescription("JAVA程序员广义上是指一群以JAVA为谋生手段的软件开发人员。狭义的说,是指拥有SUN公司JAVA认证的程序员。Sun Java认证分为两个级别:Sun 认证Java程序员和Sun 认证Java开发员。通常要求程序员精通java基础,java高级编程,及常用java设计模式,并深入理解mvc编程模式,了解uml相关知识!");
    news.setPicUrl("http://c3798041.ngrok.io/WeiXinTest/image/java.jpg");//这里测试采用地址,换成自己项目下面的图片路径
    news.setUrl("www.baidu.com");
    newList.add(news);
    newsMessage.setToUserName(fromUserName);
    newsMessage.setFromUserName(toUserName);
    newsMessage.setCreateTime(new Date().getTime());
    newsMessage.setMsgType(MESSAGE_NEWS);
    newsMessage.setArticles(newList);
    newsMessage.setArticleCount(newList.size());
    message = newsMessageToXml(newsMessage);
    return message;
    }

    5.在doPost方法中添加消息回应的相关逻辑:


    运行结果如下:


    展开全文
  • ![消息消息](https://img-ask.csdn.net/upload/201810/15/1539601799_59663.png) count为3但是微信推出的图文只有一条,昨天还是好的,今天早上突然不行,求大神解决!!!
  • 微信群发多图文消息开发是子恒老师《子恒说微信开发》视频教程的第16部。详细讲解了用php开发微信群发图文消息。内容包含图文消息前端页面,一个页面插入个百度UEditor,群发多图文,查询和删除图文消息等等。欢迎...
  • 引言及内容概要 已经有几位读者抱怨“柳峰只用到文本消息作为示例,从来不提图文消息,...本篇主要介绍微信公众帐号开发图文消息的使用,以及图文消息的几种表现形式。标题取名为“图文消息全攻略”,这绝对不是标题

    引言及内容概要

    已经有几位读者抱怨“柳峰只用到文本消息作为示例,从来不提图文消息,都不知道图文消息该如何使用”,好吧,我错了,原本以为把基础API封装完、框架搭建好,再给出一个文本消息的使用示例,大家就能够照猫画虎的,或许是因为我的绘画功底太差,画出的那只猫本来就不像猫吧……

    本篇主要介绍微信公众帐号开发中图文消息的使用,以及图文消息的几种表现形式。标题取名为“图文消息全攻略”,这绝对不是标题党,是想借此机会把大家对图文消息相关的问题、疑虑、障碍全部清除掉。

     

    图文消息的主要参数说明

    通过微信官方的消息接口指南,可以看到对图文消息的参数介绍,如下图所示:

    从图中可以了解到:

    1)图文消息的个数限制为10,也就是图中ArticleCount的值(图文消息的个数,限制在10条以内);

    2)对于多图文消息,第一条图文的图片显示为大图,其他图文的图片显示为小图;

    3)第一条图文的图片大小建议为640*320,其他图文的图片大小建议为80*80;

    好了,了解这些,再结合第4篇文章所讲的消息及消息处理工具的封装,想要回复图文消息给用户也就不是什么难事了。

     

    图文消息的多种表现形式

    下面直接通过代码演示图文消息最主要的五种表现形式的用法,源代码如下:

    package org.liufeng.course.service;
    
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.liufeng.course.message.resp.Article;
    import org.liufeng.course.message.resp.NewsMessage;
    import org.liufeng.course.message.resp.TextMessage;
    import org.liufeng.course.util.MessageUtil;
    
    /**
     * 核心服务类
     * 
     * @author liufeng
     * @date 2013-07-25
     */
    public class CoreService {
    	/**
    	 * 处理微信发来的请求
    	 * 
    	 * @param request
    	 * @return
    	 */
    	public static String processRequest(HttpServletRequest request) {
    		String respMessage = null;
    		try {
    			// 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);
    			// 由于href属性值必须用双引号引起,这与字符串本身的双引号冲突,所以要转义
    			textMessage.setContent("欢迎访问<a href=\"http://blog.csdn.net/lyq8479\">柳峰的博客</a>!");
    			// 将文本消息对象转换成xml字符串
    			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);
    
    				List<Article> articleList = new ArrayList<Article>();
    				// 单图文消息
    				if ("1".equals(content)) {
    					Article article = new Article();
    					article.setTitle("微信公众帐号开发教程Java版");
    					article.setDescription("柳峰,80后,微信公众帐号开发经验4个月。为帮助初学者入门,特推出此系列教程,也希望借此机会认识更多同行!");
    					article.setPicUrl("http://0.xiaoqrobot.duapp.com/images/avatar_liufeng.jpg");
    					article.setUrl("http://blog.csdn.net/lyq8479");
    					articleList.add(article);
    					// 设置图文消息个数
    					newsMessage.setArticleCount(articleList.size());
    					// 设置图文消息包含的图文集合
    					newsMessage.setArticles(articleList);
    					// 将图文消息对象转换成xml字符串
    					respMessage = MessageUtil.newsMessageToXml(newsMessage);
    				}
    				// 单图文消息---不含图片
    				else if ("2".equals(content)) {
    					Article article = new Article();
    					article.setTitle("微信公众帐号开发教程Java版");
    					// 图文消息中可以使用QQ表情、符号表情
    					article.setDescription("柳峰,80后," + emoji(0x1F6B9)
    							+ ",微信公众帐号开发经验4个月。为帮助初学者入门,特推出此系列连载教程,也希望借此机会认识更多同行!\n\n目前已推出教程共12篇,包括接口配置、消息封装、框架搭建、QQ表情发送、符号表情发送等。\n\n后期还计划推出一些实用功能的开发讲解,例如:天气预报、周边搜索、聊天功能等。");
    					// 将图片置为空
    					article.setPicUrl("");
    					article.setUrl("http://blog.csdn.net/lyq8479");
    					articleList.add(article);
    					newsMessage.setArticleCount(articleList.size());
    					newsMessage.setArticles(articleList);
    					respMessage = MessageUtil.newsMessageToXml(newsMessage);
    				}
    				// 多图文消息
    				else if ("3".equals(content)) {
    					Article article1 = new Article();
    					article1.setTitle("微信公众帐号开发教程\n引言");
    					article1.setDescription("");
    					article1.setPicUrl("http://0.xiaoqrobot.duapp.com/images/avatar_liufeng.jpg");
    					article1.setUrl("http://blog.csdn.net/lyq8479/article/details/8937622");
    
    					Article article2 = new Article();
    					article2.setTitle("第2篇\n微信公众帐号的类型");
    					article2.setDescription("");
    					article2.setPicUrl("http://avatar.csdn.net/1/4/A/1_lyq8479.jpg");
    					article2.setUrl("http://blog.csdn.net/lyq8479/article/details/8941577");
    
    					Article article3 = new Article();
    					article3.setTitle("第3篇\n开发模式启用及接口配置");
    					article3.setDescription("");
    					article3.setPicUrl("http://avatar.csdn.net/1/4/A/1_lyq8479.jpg");
    					article3.setUrl("http://blog.csdn.net/lyq8479/article/details/8944988");
    
    					articleList.add(article1);
    					articleList.add(article2);
    					articleList.add(article3);
    					newsMessage.setArticleCount(articleList.size());
    					newsMessage.setArticles(articleList);
    					respMessage = MessageUtil.newsMessageToXml(newsMessage);
    				}
    				// 多图文消息---首条消息不含图片
    				else if ("4".equals(content)) {
    					Article article1 = new Article();
    					article1.setTitle("微信公众帐号开发教程Java版");
    					article1.setDescription("");
    					// 将图片置为空
    					article1.setPicUrl("");
    					article1.setUrl("http://blog.csdn.net/lyq8479");
    
    					Article article2 = new Article();
    					article2.setTitle("第4篇\n消息及消息处理工具的封装");
    					article2.setDescription("");
    					article2.setPicUrl("http://avatar.csdn.net/1/4/A/1_lyq8479.jpg");
    					article2.setUrl("http://blog.csdn.net/lyq8479/article/details/8949088");
    
    					Article article3 = new Article();
    					article3.setTitle("第5篇\n各种消息的接收与响应");
    					article3.setDescription("");
    					article3.setPicUrl("http://avatar.csdn.net/1/4/A/1_lyq8479.jpg");
    					article3.setUrl("http://blog.csdn.net/lyq8479/article/details/8952173");
    
    					Article article4 = new Article();
    					article4.setTitle("第6篇\n文本消息的内容长度限制揭秘");
    					article4.setDescription("");
    					article4.setPicUrl("http://avatar.csdn.net/1/4/A/1_lyq8479.jpg");
    					article4.setUrl("http://blog.csdn.net/lyq8479/article/details/8967824");
    
    					articleList.add(article1);
    					articleList.add(article2);
    					articleList.add(article3);
    					articleList.add(article4);
    					newsMessage.setArticleCount(articleList.size());
    					newsMessage.setArticles(articleList);
    					respMessage = MessageUtil.newsMessageToXml(newsMessage);
    				}
    				// 多图文消息---最后一条消息不含图片
    				else if ("5".equals(content)) {
    					Article article1 = new Article();
    					article1.setTitle("第7篇\n文本消息中换行符的使用");
    					article1.setDescription("");
    					article1.setPicUrl("http://0.xiaoqrobot.duapp.com/images/avatar_liufeng.jpg");
    					article1.setUrl("http://blog.csdn.net/lyq8479/article/details/9141467");
    
    					Article article2 = new Article();
    					article2.setTitle("第8篇\n文本消息中使用网页超链接");
    					article2.setDescription("");
    					article2.setPicUrl("http://avatar.csdn.net/1/4/A/1_lyq8479.jpg");
    					article2.setUrl("http://blog.csdn.net/lyq8479/article/details/9157455");
    
    					Article article3 = new Article();
    					article3.setTitle("如果觉得文章对你有所帮助,请通过博客留言或关注微信公众帐号xiaoqrobot来支持柳峰!");
    					article3.setDescription("");
    					// 将图片置为空
    					article3.setPicUrl("");
    					article3.setUrl("http://blog.csdn.net/lyq8479");
    
    					articleList.add(article1);
    					articleList.add(article2);
    					articleList.add(article3);
    					newsMessage.setArticleCount(articleList.size());
    					newsMessage.setArticles(articleList);
    					respMessage = MessageUtil.newsMessageToXml(newsMessage);
    				}
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return respMessage;
    	}
    
    	/**
    	 * emoji表情转换(hex -> utf-16)
    	 * 
    	 * @param hexEmoji
    	 * @return
    	 */
    	public static String emoji(int hexEmoji) {
    		return String.valueOf(Character.toChars(hexEmoji));
    	}
    }

    如果不明白CoreService类放在什么位置,该如何使用,请查看本系列教程的第5篇。上面代码实现的功能是当用户发送数字1-5时,分别回复五种不同表现形式的图文消息给用户,如下:

    a)用户发送1,回复单图文消息。参考代码68~81行,运行效果如下:

     

    b)用户发送2,回复单图文消息---不含图片。参考代码82~96行,运行效果如下:

    说明:图文消息的标题、描述是可以包含QQ表情、符号表情的。

     

    c)用户发送3,回复多图文消息。参考代码97~123行,运行效果如下:

    说明:对于多图文消息,描述不会被显示,可以在标题使用换行符,使得显示更加美观。

     

    d)用户发送4,回复多图文消息---首条消息不含图片。参考代码124~158行,运行效果如下:

     

    e)用户发送5,回复多图文消息---最后一条消息不含图片。参考代码159~186行,运行效果如下:

    可以看出,图文消息有着丰富的内容及多样化的表现形式,希望大家能够根据各自的特点及实际使用需要,合理地运用。

     

    最后,根据实践经验,我对图文消息做一个使用总结:

    1)一定要给图文消息的Url属性赋值。不管是单图文,还是多图文,或者是不含图片的图文,都有可能会被用户点击。如果Url为空,用户点击后将会打开一个空白页面,这给用户的体验是非常差的;

    2)只有单图文的描述才会显示,多图文的描述不会被显示

    3)图文消息的标题、描述中可以使用QQ表情和符号表情。合理地运用表情符号,会使得消息更加生动;

    4)图文消息的标题、描述中可以使用换行符。合理地使用换行符,会使得内容结构更加清晰;

    5)图文消息的标题、描述中不支持超文本链接(html的<a>标签)。不只是技术上实现不了,就连逻辑上也说不通,因为一条图文消息的任何位置被点击,都将调用微信内置的浏览器打开Url,如果标题、描述里再放几个超链接,不知道点击该打开哪个页面。真搞不懂为什么有好几个同学都在问这个问题,难道设计成多图文不好吗?

    6)图文消息的链接、图片链接可以使用外部域名下的资源如本例中:柳峰的头像、博文的链接,都是指向CSDN网站的资源。在网上,甚至是微信官方交流群里,认为图文消息的Url、PicUrl不可以使用外链的大有人在,不知道这谣言从哪开始的,实践是检验真理的唯一标准!

    7)使用指定大小的图片。第一条图文的图片大小建议为640*320,其他图文的图片大小建议为80*80。如果使用的图片太大,加载慢,而且耗流量;如果使用的图片太小,显示后会被拉伸,失真了很难看。

    8)每条图文消息的图文建议控制在1-4条。这样在绝大多数终端上一屏能够显示完,用户扫一眼就能大概了解消息的主要内容,这样最有可能促使用户去点击并阅读。

     

    如果觉得文章对你有所帮助,请通过留言或关注微信公众帐号xiaoqrobot支持柳峰!

    转帖请注明本文出自柳峰的博客(http://blog.csdn.net/lyq8479),请尊重他人的辛勤劳动成果,谢谢!

     

    展开全文
  • 微信中用的最多的信息还是图文消息,本章就为大家讲解下微信图文消息是如何实现的。 包括单图文多图文消息图文消息的XML数据包结构: &lt;xml&gt; &lt;ToUserName&gt;&lt;![CDATA[to...

    引言:

    上一章讲到了消息的接收和发送,但是讲的是最简单的文本信息。

    在微信中用的最多的信息还是图文消息,本章就为大家讲解下微信图文消息是如何实现的。

    包括单图文和多图文消息。

    图文消息的XML数据包结构:

    <xml>
    <ToUserName><![CDATA[toUser]]></ToUserName>
    <FromUserName><![CDATA[fromUser]]></FromUserName>
    <CreateTime>12345678</CreateTime>
    <MsgType><![CDATA[news]]></MsgType>
    <ArticleCount>2</ArticleCount>
    <Articles>
    <item>
    <Title><![CDATA[title1]]></Title> 
    <Description><![CDATA[description1]]></Description>
    <PicUrl><![CDATA[picurl]]></PicUrl>
    <Url><![CDATA[url]]></Url>
    </item>
    <item>
    <Title><![CDATA[title]]></Title>
    <Description><![CDATA[description]]></Description>
    <PicUrl><![CDATA[picurl]]></PicUrl>
    <Url><![CDATA[url]]></Url>
    </item>
    </Articles>
    </xml>

       

     

    从上面结构图中可以看出要注意的几点

    1、图文消息的条数最大限制为10,

    2、多图文中列表中的第一个为大图,其余为小图

    注意:在多图文模式下只有第一个可以显示描述信息,其余的都不显示
     

    了解了图文消息的结构后,要发送图文消息就简单了。

    我们之前已经封装过消息处理的代码和图文消息的实体类,这里就不啰嗦了,不知道的可以看上一章

    微信公众平台开发教程Java版(三) 消息接收和发送

     

    下面我就上单图文和多图文消息的源代码

     

    package com.ifp.weixin.biz.core.impl;
    
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.apache.log4j.Logger;
    import org.springframework.stereotype.Service;
    
    import com.ifp.weixin.biz.core.CoreService;
    import com.ifp.weixin.constant.Constant;
    import com.ifp.weixin.entity.Message.resp.Article;
    import com.ifp.weixin.entity.Message.resp.NewsMessage;
    import com.ifp.weixin.entity.Message.resp.TextMessage;
    import com.ifp.weixin.util.MessageUtil;
    
    @Service("coreService")
    public class CoreServiceImpl implements CoreService {
    
    	public static Logger log = Logger.getLogger(CoreServiceImpl.class);
    
    	@Override
    	public String processRequest(HttpServletRequest request) {
    		String respMessage = null;
    		try {
    			// 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(Constant.RESP_MESSAGE_TYPE_TEXT);
    			textMessage.setFuncFlag(0);
    			
    			// 文本消息
    			if (msgType.equals(Constant.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(Constant.RESP_MESSAGE_TYPE_NEWS);
    				newsMessage.setFuncFlag(0);
    
    				List<Article> articleList = new ArrayList<Article>();
    				// 单图文消息
    				if ("1".equals(content)) {
    					Article article = new Article();
    					article.setTitle("我是一条单图文消息");
    					article.setDescription("我是描述信息,哈哈哈哈哈哈哈。。。");
    					article.setPicUrl("http://www.iteye.com/upload/logo/user/603624/2dc5ec35-073c-35e7-9b88-274d6b39d560.jpg");
    					article.setUrl("http://tuposky.iteye.com");
    					articleList.add(article);
    					// 设置图文消息个数
    					newsMessage.setArticleCount(articleList.size());
    					// 设置图文消息包含的图文集合
    					newsMessage.setArticles(articleList);
    					// 将图文消息对象转换成xml字符串
    					respMessage = MessageUtil.newsMessageToXml(newsMessage);
    				}
    				// 多图文消息
    				else if ("3".equals(content)) {
    					Article article1 = new Article();
    					article1.setTitle("我是一条多图文消息");
    					article1.setDescription("");
    					article1.setPicUrl("http://www.isic.cn/viewResourcesAction//logo/20130913/2013091314543416032.jpg");
    					article1.setUrl("http://tuposky.iteye.com/blog/2008583");
    
    					Article article2 = new Article();
    					article2.setTitle("微信公众平台开发教程Java版(二)接口配置 ");
    					article2.setDescription("");
    					article2.setPicUrl("http://www.isic.cn/viewResourcesAction//logo/20131021/2013102111243367254.jpg");
    					article2.setUrl("http://tuposky.iteye.com/blog/2008655");
    
    					Article article3 = new Article();
    					article3.setTitle("微信公众平台开发教程Java版(三) 消息接收和发送");
    					article3.setDescription("");
    					article3.setPicUrl("http://www.isic.cn/viewResourcesAction//logo/20131021/2013102111291287031.jpg");
    					article3.setUrl("http://tuposky.iteye.com/blog/2017429");
    
    					articleList.add(article1);
    					articleList.add(article2);
    					articleList.add(article3);
    					newsMessage.setArticleCount(articleList.size());
    					newsMessage.setArticles(articleList);
    					respMessage = MessageUtil.newsMessageToXml(newsMessage);
    				} 
    			}
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    		return respMessage;
    	}
    
    }
    

     

    单个图文和多图文的处理方式其实是一样的

    单图文的时候articleList 的size为1

    多图文的时候为多个。

     

    运行的效果截图如下:

    用户发送1,单图文消息

     

    用户发送3 多图文消息

     

     Ps: 图文消息中的图片是可以引用外部资源的!

     

     

     可加我的微信公众号一起讨论:



     

     转载请注明出处:http://blog.csdn.net/tuposky/article/details/40589319

     

    展开全文
  • 微信订阅号开发模式下实现多图文消息的源码
  • 最新在做微信多图文管理,自己写了一个模仿微信多图文的界面,有需要的可以参取参考参考,改改就能用哈! 里面我以及集成了ajax 上传文件的插件了,不想要的可以自己换,截图如下: 代码地址
  • 基于 laravel框架的微信公众号的自动回复功能。主要是图文消息和文本类型
  • (一)微信公众号开发之VS远程调试 (二)微信公众号开发之基础梳理 (三)微信公众号开发之自动消息回复和自定义菜单 (四)微信公众号开发之网页授权获取用户基本信息 (五)微信公众号开发之网页中及时获取...
  • ASP.NET微信开发包括图文上传菜单上传 自带数据库以及说明文档 消息群发等微信功能实现
  • 接着上次分享的服务器被动回复文本消息,这次分享的是图文消息(也叫文章消息),文本消息虽然可以处理大部分的业务需求,但美中不足的是消息过于死板不够活泼生动,为了丰富消息的内容和展现微信提供了图文消息供...
  • 引言及内容概要 已经有几位读者抱怨“柳峰只用到文本消息作为示例,从来不提图文消息,都不知道...本篇主要介绍微信公众帐号开发图文消息的使用,以及图文消息的几种表现形式。标题取名为“图文消息全攻略”,这绝对
  • 创建微信回复的图文消息
  • 公众号类型 测试号 测试号现在仅支持使用预览接口,并不能实现群发。 ...id=mp1481187827_i0l21截图】 ...前端是自己根据图文消息(Article)的格式设计的,Article的内容如下: 【图片来源:官方文...
  • 通过微信官方的消息接口指南,可以看到对图文消息的参数介绍,如下图所示: 从上图可以了解到: 1、图文消息的个数限制为10,也就是图文中ArticleCount的值(图文消息的个数,限制在10条以内) 2、对于图文消息...
  • “`
  • 微信开发群发多图文消息-微信开发16(PHP) 大秦电商创始人,专注网络技术...
  • 本周,我们一起来学习一下微信公众平台开发之【图文消息的发送与响应】  一、了解图文消息XML包结构  相信一直学习我们系列博文的同学,一定了解我们的“套路”了,首先,我们要来了解一下图文消息的X...
1 2 3 4 5 ... 20
收藏数 11,122
精华内容 4,448
关键字:

微信开发多图文消息