文档章节

微信回复图文消息

Wenchster
 Wenchster
发布于 2016/03/02 19:23
字数 1095
阅读 5
收藏 0
@RestResource(urlMapping='/WeChatRest/*')
global with sharing class WeChatRestController{
    @HttpGet
    global static void doGet(){
        String signature = RestContext.request.params.get('signature');
        String timestamp = RestContext.request.params.get('timestamp');
        String nonce = RestContext.request.params.get('nonce');
        String echostr = RestContext.request.params.get('echostr');
        System.debug('dean----->'+ echostr + ' - ' + timestamp);
        RestContext.response.addHeader('Content-Type', 'text/plain');
        RestContext.response.responseBody = Blob.valueOf(echostr);
        //此处是直接将echostr返回,使得微信端的验证通过,真正的方法参考微信文档
    }
    
    
    //返回当前时间
    @HttpPost
    global static void doPost(){
        RestRequest req = RestContext.request;
        RestResponse res = RestContext.response;
        string strMsg = req.requestBody.toString();  
        XmlStreamReader reader = new XmlStreamReader(strMsg);
        String toUserName = '';
        String fromUserName = '';
        String msgType = '';
        String picURL = '';
        String mediaID = '';
        String locationX = '';
        String locationY = '';
        String URL = '';
        String content = '';
        String msgID = '';
        String event = '';
        String eventKey = '';
        String recognition = '';
        //解析XML
        while(reader.hasNext()){
            if(reader.getLocalName() == 'ToUserName'){
                reader.next();
                if(String.isNotBlank(reader.getText())){
                    toUserName = reader.getText();
                }
            }
            else if(reader.getLocalName() == 'FromUserName'){
                reader.next();
                if(String.isNotBlank(reader.getText())){
                    fromUserName = reader.getText();
                }
            }
            else if(reader.getLocalName() == 'MsgType'){
                reader.next();
                if(String.isNotBlank(reader.getText())){
                    msgType = reader.getText();
                }
            }
            else if(reader.getLocalName() == 'PicURL'){
                reader.next();
                if(String.isNotBlank(reader.getText())){
                    picURL = reader.getText();
                }
            }
            else if(reader.getLocalName() == 'MediaId'){
                reader.next();
                if(String.isNotBlank(reader.getText())){
                    mediaID = reader.getText();
                }
            }
            else if(reader.getLocalName() == 'Location_X'){
                reader.next();
                if(String.isNotBlank(reader.getText())){
                    locationX = reader.getText();
                }
            }
            else if(reader.getLocalName() == 'Location_Y'){
                reader.next();
                if(String.isNotBlank(reader.getText())){
                    locationY = reader.getText();
                }
            }
            else if(reader.getLocalName() == 'Url'){
                reader.next();
                if(String.isNotBlank(reader.getText())){
                    URL = reader.getText();
                }
            }
            else if(reader.getLocalName() == 'MsgId'){
                reader.next();
                if(String.isNotBlank(reader.getText())){
                    msgID = reader.getText();
                }
            }
            else if(reader.getLocalName() == 'Content'){
                reader.next();
                if(String.isNotBlank(reader.getText())){
                    content = reader.getText();
                }
            }
            else if(reader.getLocalName() == 'Event'){
                reader.next();
                if(String.isNotBlank(reader.getText())){
                    event = reader.getText();
                }
            }
            else if(reader.getLocalName() == 'EventKey'){
                reader.next();
                if(String.isNotBlank(reader.getText())){
                    eventKey = reader.getText();
                }
            }
            else if(reader.getLocalName() == 'Recognition'){
                reader.next();
                if(String.isNotBlank(reader.getText())){
                    recognition = reader.getText();
                }
            }
            reader.next();
        }
        //用内部类IncomingMsg来存储
        IncomingMsg inMsg = new IncomingMsg(toUserName, fromUserName, msgType, picURL, mediaID, locationX, locationY, URL, content, event, eventKey, recognition );
        String rtnMsg = '';
        //回复消息
        
        if(msgType.equals('text')){
           rtnMsg = handleText(inMsg);
        }
        RestContext.response.addHeader('Content-Type', 'text/plain');    
        RestContext.response.responseBody = Blob.valueOf(rtnMsg);

}

        
    private static String handleText(IncomingMsg msg){
        String keyword = msg.content;
        String strReply;
        String strResult;
        if(keyword.equals('文本')){
            strReply = '这是个文本消息';
            strResult = composeTextReply(msg, strReply);
        }
        else if(keyword.equals('图文') || keyword.equals('单图文')){
            WeChatNews news = new WeChatNews('苹果WWDC2014召开在即', '2014 年似乎将成为又一个“苹果之年”,热爱和不那么热爱苹果的人都对它的一举一动保持着关注和揣测——以下是苹果 WWDC 2014 的13大看点:', 'http://a.36krcnd.com/photo/2014/4e3ae0dac4884bb91934a689b72f8f8b.png', 'http://www.36kr.com/p/212479.html');
            List<WeChatNews> newsList = new List<WeChatNews>();
            newsList.add(news);
            strResult = composeNewsReply(msg, newsList);
        }
        else if(keyword.equals('多图文')){
            WeChatNews news1 = new WeChatNews('苹果WWDC2014召开在即', '2014年似乎将成为又一个苹果之年,热爱和不那么热爱苹果的人都对它的一举一动保持着关注和揣测——以下是苹果 WWDC 2014 的13大看点:', 'http://a.36krcnd.com/photo/2014/4e3ae0dac4884bb91934a689b72f8f8b.png', 'http://www.36kr.com/p/212479.html');
            WeChatNews news2 = new WeChatNews('Facebook CEO 马克·扎克伯格再做慈善,为湾区学校捐赠 1.2 亿美元', '据 re/code消息,Facebook CEO 马克·扎克伯格与妻子Priscilla Cha (中文名陈慧娴) 计划向湾区学校捐赠 1.2 亿美元。', 'http://a.36krcnd.com/photo/2014/e64d647389bfda39131e12fa9d606bb6.jpg', 'http://www.36kr.com/p/212476.html');
            WeChatNews news3 = new WeChatNews('Nokia收购Siri的同门师弟Desti,为自家地图业务HERE融入更多人工智能', 'Nokia最近收购了一家地图公司Desti,来补强自家的地图业务HERE。', 'http://a.36krcnd.com/photo/2014/25490e2b8e63ced9586f0a432eebb972.jpg', 'http://www.36kr.com/p/212484.html');
            List<WeChatNews> newsList = new List<WeChatNews>();
            newsList.add(news1);
            newsList.add(news2);
            newsList.add(news3);
            strResult = composeNewsReply(msg, newsList);
        }
        else if(keyword.equals('音乐')){
            Map<String, String> music = new Map<String, String>();
            music.put('title', '爱你的宿命');
            music.put('description', '张信哲');
            music.put('musicUrl', 'http://zhangmenshiting.baidu.com/data2/music/119826740/1197655931401552061128.mp3?xcode=80587c819993d49621a8dce05e5bb8c9e36664380262dc7e&song_id=119765593');
            music.put('musicHQUrl', 'http://zhangmenshiting.baidu.com/data2/music/119826740/1197655931401552061128.mp3?xcode=80587c819993d49621a8dce05e5bb8c9e36664380262dc7e&song_id=119765593');
            strResult = composeMusicReply(msg, music);            
        }
        return strResult;
    }

    private static String composeTextReply(IncomingMsg msg,String rlyMSG)
    {
        String replyMSG = '<xml><ToUserName><![CDATA[{0}]]></ToUserName><FromUserName><![CDATA[{1}]]></FromUserName><CreateTime>12345678</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[{2}]]></Content></xml>';
        String[] arguments = new String[]{msg.fromUserName, msg.toUserName, rlyMSG};
        String results = String.format(replyMSG, arguments);
        return results;
    }

    private static String composeNewsReply(IncomingMsg msg, List<WeChatNews> newsList){
        String strNews = '';
        String newsTpl = '<item><Title><![CDATA[{0}]]></Title><Description><![CDATA[{1}]]></Description><PicUrl><![CDATA[{2}]]></PicUrl><Url><![CDATA[{3}]]></Url></item>';
        for(WeChatNews news : newsList){
            String[] arguments = new String[]{news.title, news.description, news.picUrl, news.url};
            strNews += String.format(newsTpl, arguments);
        }
        String strTmp = '<xml><ToUserName><![CDATA[{0}]]></ToUserName><FromUserName><![CDATA[{1}]]></FromUserName><CreateTime>1234567890</CreateTime><MsgType><![CDATA[news]]></MsgType><ArticleCount><![CDATA[{2}]]></ArticleCount><Articles>' + strNews + '</Articles></xml>';
        String[] arguments = new String[]{msg.fromUserName, msg.toUserName, String.valueOf(newsList.size())};
        String results = String.format(strTmp, arguments);
        return results;
    }

    private static String composeMusicReply(IncomingMsg msg, Map<String, String> music){
        String strTitle = music.get('title');
        String strDesc = music.get('description');
        String strURL = music.get('musicUrl');
        String strHQURL = music.get('musicHQUrl');
        String musicTpl = '<xml><ToUserName><![CDATA[{0}]]></ToUserName><FromUserName><![CDATA[{1}]]></FromUserName><CreateTime>12345678</CreateTime><MsgType><![CDATA[music]]></MsgType><Music><Title><![CDATA[{2}]]></Title><Description><![CDATA[{3}]]></Description><MusicUrl><![CDATA[{4}]]></MusicUrl><HQMusicUrl><![CDATA[{5}]]></HQMusicUrl></Music></xml>';
        String[] arguments = new String[]{msg.fromUserName, msg.toUserName, strTitle, strDesc, strURL, strHQURL};
        String results = String.format(musicTpl, arguments);
        return results;
    }

        /*****内部类****/
        public class IncomingMsg{
        public String toUserName;
        public String fromUserName;
        public String msgType;
        public String picURL;
        public String mediaID;
        public String locationX;
        public String locationY;
        public String URL;
        public String content;
        public String event;
        public String eventKey;
        public String recognition;
    
        public IncomingMsg(){}
        
        public IncomingMsg(String tUN, String fUN, String mT, String pU, String mI, String lX, String lY, String u, String c, String e, String eK, String r){
            this.toUserName = tUN;
            this.fromUserName = fUN;
            this.msgType = mT;
            this.picURL = pU;
            this.mediaID = mI;
            this.locationX = lX;
            this.locationY = lY;
            this.URL = u;
            this.content = c;
            this.event = e;
            this.eventKey = eK;
            this.recognition = r;
        }
        }

        public class WeChatNews{
        public String title;
        public String description;
        public String picUrl;
        public String url;
        
        public WeChatNews(){}
        
        public WeChatNews(String t, String d, String p, String u){
            this.title = t;
            this.description = d;
            this.picUrl = p;
            this.url = u;
        }
        }
        /**************/
    
}


本文转载自:http://www.cnblogs.com/johnsonwong/p/3827180.html

共有 人打赏支持
Wenchster
粉丝 0
博文 1
码字总数 0
作品 0
泉州
私信 提问
微信公众平台自助引擎 - 微擎

微信公众平台自助引擎,简称微擎,微擎是一款免费开源的微信公众平台管理系统。 注:使用微擎必须要有自己的服务器、虚拟空间或者自己的BAE,且必须要支持PHP+MYSQL,上传微擎程序后按系统指...

匿名
2013/09/13
42.5K
4
微信公众平台表结构的设计,求指点

最近准备搞微信公众平台,开发语言是PHP,数据库是MySql。 第一步当然是数据库的设计,下面是初步的建模,自己觉得不太满意,求指点 说明: 1、wxdata是数据主表,所有收到的及发出的数据都存...

go_array
2014/03/12
7.6K
5
微信公众平台素材编辑与自动回复图文教程

一、素材编辑 点 击进入素材管理,我们可以看到界面的左边是素材分类包括图文消息、图片、语音、视频,右边是内容编辑框,由于图片、语音、视频都是很简单的上传文件管理, 所以我们重点讲解...

fjabing
2014/06/22
0
0
silenceper/wechat

WeChat SDK for Go ![GoDoc] (http://godoc.org/github.com/silenceper/wechat?status.svg) 使用Golang开发的微信SDK,简单、易用。 快速开始 以下是一个处理消息接收以及回复的例子: //配置...

silenceper
2016/10/24
0
0
[037] 微信公众帐号开发教程第13篇-图文消息全攻略

引言及内容概要 已经有几位读者抱怨“柳峰仅仅用到文本消息作为演示例子,从来不提图文消息,都不知道图文消息该怎样使用”,好吧,我错了,原本以为把基础API封装完、框架搭建好,再给出一个...

云栖希望。
2017/12/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

中高级面试知识点:缓存

前言 几乎所有的项目都做了缓存,但是缓存做的怎么样,其实只有我们自己知道。缓存做的好,没有网络也能流畅的使用;再多的数据请求都不会出现卡顿延迟等待很久的情况。 程序中除了图片缓存(...

Mr_zebra
10分钟前
1
0
Poco官方PPT_190-Applications双语对照翻译

因工作需要用到这一块的功能,所以直接翻译了一下 此PPT来源于官方文件,地址https://pocoproject.org/documentation.html

CHONGCHEN
13分钟前
1
1
使用idea开发servlet,引用maven后触发的class not found的问题的解决方案

需要将maven下载的依赖加入到lib目录,具体操作方法如下:打开Projrct Settings->Artifacts->右边的Output Layout,双击maven的依赖,就可以加载上去...

shatian
15分钟前
1
0
SpringMVC 拦截器

拦截器 是指通过统一拦截从浏览器发往服务器的请求来完成功能的增强 SpringMVC拦截器实现过程 1.编写拦截器,实现 org.springframework.web.servlet.HandlerInterceptor 接口 2.将拦截器注册...

晨猫
18分钟前
1
0
RabbitMQ+PHP演示实例

新建rabbit_consumer.php作为消费者 <?php //配置信息 $conn_args = array( 'host' => '127.0.0.1', 'port' => '5672', 'login' => 'admin', 'password' => ......

hansonwong
19分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部