精华内容
下载资源
问答
  • 问题是这样的:有一个多图文消息,然后每个图文消息都是一个链接, 例如A链接,当点击A链接时在Android系统会先跳一个空白页之后再跳转到目的页B,在IOS不会有这个问题, 最终发现原因是这样的: 比如B页的链接是...

    今天做微信开发遇到了个问题恶心了一下午终于解决了。

    问题是这样的:有一个多图文消息,然后每个图文消息都是一个链接, 例如A链接,当点击A链接时在Android系统会先跳一个空白页之后再跳转到目的页B,在IOS不会有这个问题,

    最终发现原因是这样的: 比如B页的链接是"http://www.abc.com/shop", 当把这个链接当做图文消息A的URL参数时就会先跳空白页再跳目的页,你需要把URL改成这样

    "http://www.abc.com/shop/"看到了么 后面多了个“/”,之后问题就解决了

    展开全文
  • send_news.Url =...这是微信上显示的链接 ...
  • 如果返回的是图文消息Description参数则失效,返回一条则生效。 图文消息的图片链接支持png和jpg较好支持的 大图:300*200 小图:200*200 index.php 的代码如下: <?php /** * wechat php test ...

    温馨提示以下,

    如果返回的是多条图文消息Description参数则失效,返回一条则生效。

    图文消息的图片链接支持png和jpg较好支持的

    大图:300*200

    小图:200*200

    index.php 的代码如下:

     

    <?php
    /**
      * wechat php test
      */
    
    //define your token
    require_once "common.php";
    define("TOKEN", "twgdh");
    $wechatObj = new wechatCallbackapiTest();
    //当接入成功后,请注销这句话,否则,会反复验证。
    //$wechatObj->valid();
    //添加响应请求的语句
    $wechatObj->responseMsg();
    
    class wechatCallbackapiTest
    {
        public function valid()
        {
            $echoStr = $_GET["echostr"];
    
            //valid signature , option
            if($this->checkSignature()){
                echo $echoStr;
                exit;
            }
        }
    
        public function responseMsg()
        {
            //get post data, May be due to the different environments
            $postStr = $GLOBALS["HTTP_RAW_POST_DATA"];
            
              //extract post data
            if (!empty($postStr)){
                    /* libxml_disable_entity_loader is to prevent XML eXternal Entity Injection,
                       the best way is to check the validity of xml by yourself */
                    // 使用simplexml技术对xml进行解析 
                    // libxml_disable_entity_loader(true), 是从安全性考虑,为了防止xml外部注入,
                    //只对xml内部实体内容进行解析
                    libxml_disable_entity_loader(true);
                    //加载 postStr 字符串
                      $postObj = simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);
                    file_put_contents('abc.log', "\r\n\r\n". $postStr, FILE_APPEND);
                    $fromUsername = $postObj->FromUserName;
                    file_put_contents('abc.log', "\r\n\r\n". $fromUsername, FILE_APPEND);
                    $toUsername = $postObj->ToUserName;
                    file_put_contents('abc.log', "\r\n\r\n". $toUsername, FILE_APPEND);
                    $keyword = trim($postObj->Content);
                    $time = time();
                    global $tmp_arr;
                    //根据接收到的消息类型,来进行分支处理(switch)
                    switch($postObj->MsgType)
                    {
                        case 'event':
                            if($postObj->Event == 'subscribe')
                            {
                                
                                $contentStr = "欢迎关注leigood微信测试号噢";
                                $resultStr = sprintf($tmp_arr['text'], $fromUsername, $toUsername, $time, $contentStr);
                                echo $resultStr; 
                            }
                            break;
                        case 'text': //回复文本模块
                            //必须是以“图片”开头,后面并且是以数字结尾
                            if(preg_match("/^图片([0-9][0-9]*)$/u",$keyword,$matches)){
                                $connect = mysql_connect('localhost','root','root');
                                mysql_select_db('wxdb',$connect);
                                mysql_query('set names utf8');
                                $matches = array();
                                preg_match("/^图片([0-9][0-9]*)$/u",$keyword,$matches); 
                                $sql = "select media_id from keep_image_uploads where id=$matches[1]";
                                $res = mysql_query($sql,$connect);
                                if($row = mysql_fetch_assoc($res)){
                                    //先取出么media_id
                                    $media_id = $row['media_id'];
                                    $resultStr = sprintf($tmp_arr['image'], $fromUsername, $toUsername, $time, $media_id);
                                    echo $resultStr;
                                }else{
                                    $contentStr = '该图片还没上传噢!';
                                    $resultStr = sprintf($tmp_arr['text'], $fromUsername, $toUsername, $time, $contentStr);
                                    echo $resultStr;
                                }
                            }else if($keyword == '十八摸'){
                                $title = '十八摸'; //标题
                                $Description = '十八摸,您懂得~~~~~'; //音乐描述
                                $MusicUrl = "http://weixin.showtp.com/music/gq1.mp3"; //音乐链接
                                $HQMusicUrl = "http://weixin.showtp.com/music/gq1.mp3"; //高质量音乐链接
                                
                                $resultStr = sprintf($tmp_arr['music'], $fromUsername, $toUsername, $time, $title,$Description,$MusicUrl,$HQMusicUrl);
                                echo $resultStr;
                            }else if($keyword == '初夜泪流'){
                                $title = '初夜泪流'; //标题
                                $Description = '初夜泪流,时间宝贵的夜'; //音乐描述
                                $MusicUrl = "http://weixin.showtp.com/music/gq2.mp3"; //音乐链接
                                $HQMusicUrl = "http://weixin.showtp.com/music/gq2.mp3"; //高质量音乐链接
                                
                                $resultStr = sprintf($tmp_arr['music'], $fromUsername, $toUsername, $time, $title,$Description,$MusicUrl,$HQMusicUrl);
                                echo $resultStr;
                            }else if($keyword == '头条新闻'){
                                $Title = '百度PK谷歌';
                                $Description = '在国际舞台上百度和谷歌的pk究竟相差多远呢?'; //图文消息描述
                                $PicUrl = "http://weixin.showtp.com/image/logo.png"; 
                                //图片链接,支持JPG、PNG格式,较好的效果为大图360*200,小图200*200
                                $Url = "http://www.cyzone.cn/a/20150225/270130.html"; //点击图文消息跳转链接
                                $resultStr = sprintf($tmp_arr['singlenews'], $fromUsername, $toUsername, $time, $Title, $Description, $PicUrl, $Url);
                                echo $resultStr;
                            }else if($keyword == '新闻'){
                                //处理返回多条图文消息,但不能超过十条
                                $news_arr = array(
                                    'news1'=>array('title'=>'百度新闻','Description'=>'大陆百度很牛逼噢',
                                        'PicUrl'=>'http://weixin.showtp.com/image/logo.png',
                                        'Url'=>'http://www.baidu.com'),
                                    'news2'=>array('title'=>'新浪新闻','Description'=>'大陆百度很牛逼噢',
                                        'PicUrl'=>'http://weixin.showtp.com/image/news1.png',
                                        'Url'=>'http://www.sina.com.cn'),
                                    'news3'=>array('title'=>'腾讯新闻','Description'=>'大陆百度很牛逼噢',
                                        'PicUrl'=>'http://weixin.showtp.com/image/news2.png',
                                        'Url'=>'http://www.qq.com'),
                                    'news4'=>array('title'=>'搜狐新闻','Description'=>'大陆百度很牛逼噢',
                                        'PicUrl'=>'http://weixin.showtp.com/image/news3.png',
                                        'Url'=>'http://www.sohu.com')
                                    );
                                    
                                    $resultStr = sprintf($tmp_arr['newses'], $fromUsername, $toUsername, $time, 
                                    $news_arr['news1']['title'],
                                    $news_arr['news1']['Description'],
                                    $news_arr['news1']['PicUrl'],
                                    $news_arr['news1']['Url'],
                                    
                                    $news_arr['news2']['title'],
                                    $news_arr['news2']['Description'],
                                    $news_arr['news2']['PicUrl'],
                                    $news_arr['news2']['Url'],
                                    
                                    $news_arr['news3']['title'],
                                    $news_arr['news3']['Description'],
                                    $news_arr['news3']['PicUrl'],
                                    $news_arr['news3']['Url'],
                                    
                                    $news_arr['news4']['title'],
                                    $news_arr['news4']['Description'],
                                    $news_arr['news4']['PicUrl'],
                                    $news_arr['news4']['Url']
                                    
                                    );
                                echo $resultStr;
                            
                            }else{
                                $contentStr = '您输入的格式有误';
                                $resultStr = sprintf($tmp_arr['text'], $fromUsername, $toUsername, $time, $contentStr);
                                echo $resultStr;
                            }
                            break;
                        case 'image': //处理用户上传图片
                            $media_id = $postObj -> MediaId; //获取到用户上传的图片的mediaid
                            $resultStr = sprintf($tmp_arr['image'], $fromUsername, $toUsername, $time, $media_id);
                            echo $resultStr;
                            
                            //将图片保存到本地服务器的文件系统
                            //1.先给图片创建一个名字
                            $image_file_name = time().'.jpg';
                            //2.获取该图片的内容
                            $image_file = file_get_contents($postObj->PicUrl);
                            //3.保存到本地服务器的文件系统
                            //提醒:一定要保证您创建的文件夹是www用户可读可写,否则无法保存该图片到文件夹下
                            file_put_contents("./uploadimage/".$image_file_name,$image_file);
                            
                            //将图片的路径和相关信息入库
                            //1.创建一张表
                            //2.链接mysql数据库,并且添加图片信息
                            $connect = mysql_connect('localhost','root','root');
                            mysql_select_db('wxdb',$connect);
                            mysql_query('set names utf8');
                            $media_path = "./uploadimage/".$image_file_name; //路径
                            $sql = "insert into keep_image_uploads (id,openid,media_id,media_path) values(NULL,'{$fromUsername}','{$media_id}','{$media_path}')";
                            mysql_query($sql,$connect);
                            break;
                        case 'voice': //处理用户上传语言的业务逻辑
                            $media_id = $postObj -> MediaId; //获取media_id的id号
                            $resultStr = sprintf($tmp_arr['voice'], $fromUsername, $toUsername, $time, $media_id);
                            echo $resultStr;
                            break;
                        case 'location': //处理用户上传的地理位置信息
                            $Location_X = $postObj -> Location_X; //获取上传地理位置的纬度
                            $Location_Y = $postObj -> Location_Y; //获取上传地地理位置经度
                            $contentStr = "您上报的地理位置是:\n经度是:{$Location_Y} \n纬度是: {$Location_X}";
                            $resultStr = sprintf($tmp_arr['text'], $fromUsername, $toUsername, $time, $contentStr);
                            echo $resultStr;
                            break;
                            
                    }
            }else {
                echo "";
                exit;
            }
        }
            
        private function checkSignature()
        {
            // you must define TOKEN by yourself
            if (!defined("TOKEN")) {
                throw new Exception('TOKEN is not defined!');
            }
            
            $signature = $_GET["signature"];
            $timestamp = $_GET["timestamp"];
            $nonce = $_GET["nonce"];
                    
            $token = TOKEN;
            $tmpArr = array($token, $timestamp, $nonce);
            // use SORT_STRING rule
            sort($tmpArr, SORT_STRING);
            $tmpStr = implode( $tmpArr );
            $tmpStr = sha1( $tmpStr );
            
            if( $tmpStr == $signature ){
                return true;
            }else{
                return false;
            }
        }
    }
    
    ?>

     

     

     

    common.php 代码如下:

    <?php
        $tmp_arr = array(
        'text' => <<<XML
    <xml>
    <ToUserName><![CDATA[%s]]></ToUserName>
    <FromUserName><![CDATA[%s]]></FromUserName>
    <CreateTime>%s</CreateTime>
    <MsgType><![CDATA[text]]></MsgType>
    <Content><![CDATA[%s]]></Content>
    <FuncFlag>0</FuncFlag>
    </xml>
    XML
    ,
        'image'=> <<<XML
    <xml>
    <ToUserName><![CDATA[%s]]></ToUserName>
    <FromUserName><![CDATA[%s]]></FromUserName>
    <CreateTime>%s</CreateTime>
    <MsgType><![CDATA[image]]></MsgType>
    <Image>
    <MediaId><![CDATA[%s]]></MediaId>
    </Image>
    </xml>
    XML
    ,
        'voice'=> <<<XML
    <xml>
    <ToUserName><![CDATA[%s]]></ToUserName>
    <FromUserName><![CDATA[%s]]></FromUserName>
    <CreateTime>%s</CreateTime>
    <MsgType><![CDATA[voice]]></MsgType>
    <Voice>
    <MediaId><![CDATA[%s]]></MediaId>
    </Voice>
    </xml>
    XML
    ,
        'music'=> <<<XML
    <xml>
    <ToUserName><![CDATA[%s]]></ToUserName>
    <FromUserName><![CDATA[%s]]></FromUserName>
    <CreateTime>%s</CreateTime>
    <MsgType><![CDATA[music]]></MsgType>
    <Music>
    <Title><![CDATA[%s]]></Title>
    <Description><![CDATA[%s]]></Description>
    <MusicUrl><![CDATA[%s]]></MusicUrl>
    <HQMusicUrl><![CDATA[%s]]></HQMusicUrl>
    </Music>
    </xml>
    XML
    ,
        'singlenews'=> <<<XML
    <xml>
    <ToUserName><![CDATA[%s]]></ToUserName>
    <FromUserName><![CDATA[%s]]></FromUserName>
    <CreateTime>%s</CreateTime>
    <MsgType><![CDATA[news]]></MsgType>
    <ArticleCount>1</ArticleCount>
    <Articles>
    <item>
    <Title><![CDATA[%s]]></Title> 
    <Description><![CDATA[%s]]></Description>
    <PicUrl><![CDATA[%s]]></PicUrl>
    <Url><![CDATA[%s]]></Url>
    </item>
    </Articles>
    </xml> 
    XML
    ,
        'newses'=> <<<XML
    <xml>
    <ToUserName><![CDATA[%s]]></ToUserName>
    <FromUserName><![CDATA[%s]]></FromUserName>
    <CreateTime>%s</CreateTime>
    <MsgType><![CDATA[news]]></MsgType>
    <ArticleCount>4</ArticleCount>
    <Articles>
    <item>
    <Title><![CDATA[%s]]></Title> 
    <Description><![CDATA[%s]]></Description>
    <PicUrl><![CDATA[%s]]></PicUrl>
    <Url><![CDATA[%s]]></Url>
    </item>
    <item>
    <Title><![CDATA[%s]]></Title> 
    <Description><![CDATA[%s]]></Description>
    <PicUrl><![CDATA[%s]]></PicUrl>
    <Url><![CDATA[%s]]></Url>
    </item>
    <item>
    <Title><![CDATA[%s]]></Title> 
    <Description><![CDATA[%s]]></Description>
    <PicUrl><![CDATA[%s]]></PicUrl>
    <Url><![CDATA[%s]]></Url>
    </item>
    <item>
    <Title><![CDATA[%s]]></Title> 
    <Description><![CDATA[%s]]></Description>
    <PicUrl><![CDATA[%s]]></PicUrl>
    <Url><![CDATA[%s]]></Url>
    </item>
    </Articles>
    </xml> 
    XML
        );

     

     

    用到的图片如下:

     

     

     

     

     

     

     

    转载于:https://www.cnblogs.com/leigood/p/5164186.html

    展开全文
  •  转载链接:http://mobile.51cto.com/web-416968.htm 图文消息的主要参数说明 ...通过微信官方的消息接口指南,可以看到对图文消息的参数介绍,如下图所示: ...1)图文消息的个数限制为10,也...2)对于多图文
    

    转载链接:http://mobile.51cto.com/web-416968.htm

    图文消息的主要参数说明

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

    http://s8.51cto.com/wyfs01/M02/32/79/wKioJlKCWbexuhBEAACsAgsm718653.jpg

    从图中可以了解到:

    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.     } 

    203.

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

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

    http://s3.51cto.com/wyfs01/M01/32/79/wKioJlKCWrvw_N4VAABoo221tXE159.jpg

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

    http://s9.51cto.com/wyfs01/M00/32/7B/wKioOVKCWt3QYxXaAABw_TiniyA217.jpg

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

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

    http://s2.51cto.com/wyfs01/M02/32/7B/wKioOVKCW4vCY5o2AABuCGt2KSY760.jpg

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

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

    http://s2.51cto.com/wyfs01/M02/32/79/wKioJlKCWvvQ_l2IAABsmYGSp9Q194.jpg

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

    http://s1.51cto.com/wyfs01/M01/32/7B/wKioOVKCWxeBEpiAAAB17HoroIU457.jpg

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

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

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

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

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

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

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

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

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

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

    展开全文
  • 图文消息也叫作新闻消息,我们从这里可以看个大概的结构,标题、图片、简介、然后你点进去是个链接 我们例行看一下官方文档,这个解释的比较清楚 xml里面是个Articles,而且是个数组,也就是说可以发个,...

    图文消息也叫作新闻消息,我们从这里可以看个大概的结构,标题、图片、简介、然后你点进去是个链接

    我们例行看一下官方文档,这个解释的比较清楚

    xml里面是个Articles,而且是个数组,也就是说可以发多个,但是有上限的

    通过前面的文章,我们应该想着怎么去建这个实体类:一个msg,属性包含数组,数组指向Article,大概就是这样,你可以试着先建一个

    这里先贴出来实体类,相关的解释注释都有

    
    import java.util.Date;
    import java.util.List;
    
    public class NewsMsg extends BaseMessage{
    	private int ArticleCount;//文章的个数
        private List<News> Articles;
    	public NewsMsg(){
    		this.setMsgType("news");
    		this.setCreateTime(new Date().getTime());
    	}
    	public int getArticleCount() {
    		return ArticleCount;
    	}
    	public void setArticleCount(int articleCount) {
    		ArticleCount = articleCount;
    	}
    	public List<News> getArticles() {
    		return Articles;
    	}
    	public void setArticles(List<News> articles) {
    		Articles = articles;
    	}
    	
    	
    
    }
    public class News {
    	private String Title;//图文消息标题
    	private String Description;//图文消息描述
    	private String PicUrl;//图片链接,支持JPG、PNG格式,较好的效果为大图360*200,小图200*200
    	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 getPicUrl() {
    		return PicUrl;
    	}
    	public void setPicUrl(String picUrl) {
    		PicUrl = picUrl;
    	}
    	public String getUrl() {
    		return Url;
    	}
    	public void setUrl(String url) {
    		Url = url;
    	}
    }

    然后调用

    if ("3".equals(content)) {
    			MsgUtil.sendNewsMsgToUser( openId,formUser,response);
    		}

    然后执行发送

    /**
    	 * 发送图文消息
    	 * @param openId
    	 * @param formUser
    	 * @param response
    	 */
    	public static void sendNewsMsgToUser(String openId, String formUser, HttpServletResponse response) {
    		NewsMsg msg = new NewsMsg();
    		List<News> articles = new ArrayList<News>();
    		News news = new News();
    		news.setTitle("猫和老鼠");
    		news.setDescription("《猫和老鼠》以闹剧为特色,描绘了一对水火不容的冤家:汤姆和杰瑞猫鼠之间的战争,片中的汤姆经常使用狡诈的诡计来对付杰瑞,而杰瑞则时常利用汤姆诡计中的漏洞逃脱他的迫害并给予报复");
    		news.setPicUrl(WeiXinUtil.NATURL+"/wx-demo/jerry.jpg");
    		news.setUrl("https://image.baidu.com/search/index?tn=baiduimage&ct=201326592&lm=-1&cl=2&ie=gb18030&word=jerry&fr=ala&ala=1&alatpl=adress&pos=0&hs=2&xthttps=111111");
    		articles.add(news);
    		msg.setArticleCount(articles.size());
    		msg.setArticles(articles );
    		msg.setFromUserName(formUser);
    		msg.setToUserName(openId);
    		String textMessageToXml = XMLUtils.newsMessageToXml(msg);
    		logger.info("发送的消息是-------"+textMessageToXml);
    		PrintWriter out=null;
    		try {
    			out = response.getWriter();
    			//写入返回的response中
    			out.println(textMessageToXml);
    		} catch (IOException e) {
    			logger.error("发送微信消息失败",e);
    			e.printStackTrace();
    		}finally{
    			//注意关流,不然会发送失败
    			out.close();
    		}
    	}

    注意这里有一个地方跟其他的不一样,就是xml转为字符串的方法,因为它是类中包含类的数组的,所以会多一个

    然后成功的样例就是上面的那个

    封装的xml数组如下:

    2018-11-20 10:34:52.718  INFO 5196 --- [nio-8080-exec-8] com.example.weixin.demo.utils.MsgUtil    : 发送的消息是-------<xml>
      <ToUserName>oHz9D0TObxbKYC720R61svLa0YDg</ToUserName>
      <FromUserName>gh_7781317207c9</FromUserName>
      <CreateTime>1542681292687</CreateTime>
      <MsgType>news</MsgType>
      <ArticleCount>1</ArticleCount>
      <Articles>
        <item>
          <Title>猫和老鼠</Title>
          <Description>《猫和老鼠》以闹剧为特色,描绘了一对水火不容的冤家:汤姆和杰瑞猫鼠之间的战争,片中的汤姆经常使用狡诈的诡计来对付杰瑞,而杰瑞则时常利用汤姆诡计中的漏洞逃脱他的迫害并给予报复</Description>
          <PicUrl>http://pnvcvv.natappfree.cc/wx-demo/jerry.jpg</PicUrl>
          <Url>https://image.baidu.com/search/index?tn=baiduimage&amp;ct=201326592&amp;lm=-1&amp;cl=2&amp;ie=gb18030&amp;word=jerry&amp;fr=ala&amp;ala=1&amp;alatpl=adress&amp;pos=0&amp;hs=2&amp;xthttps=111111</Url>
        </item>
      </Articles>
    </xml>

    被动回复消息当然还有其他的消息,语音消息、视频消息等等,有兴趣可以自己研究下

    展开全文
  • 原因:微信平台开发者文档中已表明:使用群发接口时,在上传图文消息素材之前,应将content字段中的图片上传到微信服务器中,并用返回的URL替换掉原有的外链接。 若不替换,微信平台会自动过滤掉外链接的多媒体文件...
  • 之前说了让微信发送给关注我们的粉丝...下面是发送图文消息的函数,涉及title(标题),description(摘要),picurl(图片),链接 (url)几个关键的参数: 格式如下:(此为多图文形式) 其实格式呢就和上篇http://www....
  • 导语 微信公众号关注自动回复图文或自定义链接,这个小功能曾困扰了包括我在内很公众号个体户一段时间。...想要你的公众号被关注后能自动回复图文消息或者自定义链接,你除了要成为开发者,还要会编程、会抓包、...
  • 巧用微信链接消息

    千次阅读 2014-06-30 12:29:47
    其实对于自媒体订阅号来说,它有一个重要的应用,导入群发图文消息。订阅号的主要用途是每天群发消息,以图文消息为主。尽管微信提供了历史消息,但功能相对简单,无法实现分类、检索等功能,使用数据库每天
  • 问题背景 ...很做游戏的商家,应该都知道分享裸链接的转化率很低,但是用图文链接转化率会高很. 信息流广告 信息流广告的转化基本取决于文案,但是如何吸引用户点击观看是引流的第一步,图文链接
  • 但是公众号文案的审核和筛查越来越严,有关诱导分享的、广告类的等很容易被拦截,一但链接被拦截大大影响活动、营销推广效果! ​ 下面介绍一款精仿公众号文章系统,以及该系统对接防封方案进行活动推广情况...
  • 本文涵盖了关于RabbitMQ很方面的知识点, 如: 消息发送确认机制 消费确认机制 消息的重新投递 消费幂等性, 等等 这些都是围绕上面那张整体流程图展开的, 所以有必要先贴出来, 见图知意 二、实现思路 简略...
  • 开发者小白,不清楚小程序客服消息自动回复如何开发设置的,因为之前微信公众客服系统是可以设置的,新版本后就需要自己开发设置,但这个技术一般小白不会,这里我跟大家分享一个通过独立部署系统,实现小程序...
  • 对于微信公众号粉丝对话自动回复消息的实现,第三方平台微号帮提供了在线功能粉丝对话定时推送实现,功能支持...公众号自动回复消息消息内容可以有文字、链接、h5小游戏、图文、小程序、在线课程等;可以设
  • 可运用于小程序各类型的客服消息的自动回复需求,支持小程序卡片、图片、图文、文本、链接等形式。 适合的群体:程序员、外包公司、电商公司使用。 服务器环境:linux+nginx或者linux+apahce,php7.2版本,mysql5.5+
  • 2,注意区分图片消息和图文消息,图片消息是不能带链接的 3,一定要给图文消息的Url属性赋值。(柳峰老师说如果Url为空,用户点击后将会打开一个空白页面,待验证,我以前直接不赋值图片是无法点击的) 4,只有单...
  • jquery 3d展开收缩图文列表代码,点击每个图文的任意位置,都可以展开更的说明文字内容,还有一个按钮可以链接图文消息的页面(链接可自由设置),当前激活的图文内容会有一个放大的突出显示效果。 页面的...
  • --成员ID列表(消息接收者,个接收者用‘|’分隔,最多支持1000个)。特殊情况:指定为@all,则向该企业应用的全部成员发送--> 需要特别说明的是两种图文信息 1、图文信息mpnews 支持上传一张封面图片,...
  • 2、新增炮灰域名功能,可以同时设置三个炮灰域名,并且分享时在三个炮灰域名中随机跳转,从而实现就算其中一个炮灰域名被封,但是之前分享到群或者朋友圈中的链接还有一部分可以继续打开,而且更换新的炮灰域名...
  • 为了实现的微信公众号延迟...微信公众号延迟自动回复消息功能,支持公众号对粉丝自动回复文字、链接图文、小程序、h5小游戏、文档文件、在线课程、直播、文章、图片、视频、语音、微商城、团购、美妆信息、美食信息等
  • 微信公号新手用户想通过自己的公众号来推广其他的连接地址,...2、进入素材管理页面之后,点击新建图文消息,根据自己的需要写好题目和内容之后,下拉鼠标到原文链接处,选中原文链接,同时把自己需要设置的外...
  • asp发送微信公众号客服消息源码

    千次阅读 2018-11-10 10:15:05
    asp写的,微信公众号发送客服消息源码,支持文字发送,图文发送,带链接的文字发送等,比模板消息更灵活,适合很应用场景,费话不说,上源码: &lt;% Call Wx.C_A(“wx_token”)'调用函数,如果当前的token...
  • 首页-新建“图文消息” 点击顶部工具栏的“小程序”,在搜索可输入小程序名称/id 选择“获取更页面路径”,输入你的微信号然后就可以你需要分享的小程序页面右上角复制页面路径(注意:10分钟内有效,过期...
  • 一个很重要的道理:不知道的就百度,会用百度,用好百度,可以解决很问题! 看大佬分享的博客,认真看完,看相似的博客五六篇左右...自动回复图文链接; 可以判断用户是否发送图片/文字并回复; 可以在用户进入
  • 上一讲,以图文的方式,我们以一个订单系统举例,讲了很可能或者是会遇到的问题,这讲我们主要先对MQ有个认识,通俗易懂的了解MQ的作用,为什么使用MQ,使用之后会发生什么?这里给出上一章的一个链接...
  • 我们已经做了这么了我们已经建了一个窗体还有一个在被点击时会弹出消息框的PictureBox对象。接下来,我们需要添加卡片上的其他字段,比如联系人的名字和电话。我们把那些数据存在一个数据库里。VS可以为我们直接...
  • 图文消息 音乐消息 图片消息 地理位置消息 链接消息 音频消息 事件推送 文本消息respContent = "欢迎关注 "+logo+" ! 我们会竭力为您提供更精彩的内容!" + "\n\n回复 1 , 2 , 3 ,... 查看更的内容!"; 图文...
  • (二) 基础设置:商城配置、导航管理、广告管理、广告位置、银行管理、支付管理、地区管理、友情链接、快递管理、消息模板 (三) 会员管理:会员等级、会员管理、账号管理 (四) 文章管理:文章管理、文章分类 (五) ...

空空如也

空空如也

1 2 3 4 5
收藏数 90
精华内容 36
关键字:

多图文消息链接