苹果机壳打印机回复公众号文本链接失效

> 微信消息里面怎么加超链接和锚文本方法
  【学堂推荐】现在很多人都在操作微信公众号,很多时候大家还是很想把微信公众号的流量吸引到网站上的,但是微信公众号官方的方法只能是把自己的链接加入到“阅读原文”,真正去阅读原文的人少之又少啊。如果能够在文章中加入超链接的话,想必转化量会很高吧。  今天给大家分享一个微信公众号留超链接的方法。  前面也有讲过怎么通过回复留连接的   &  首先,看一下,操作的案例。  群发里面这样设置。    设置好之后,我们看看他发出来的效果是什么样子的。      发出来用户看到是这种效果,用户直接就可以点击阅读原文了,而且可以在一篇文章里面加入多个链接,这样导向网站的效果更好。  其实,实现这种效果的方法很简单,就是用的这段代码  &a href=&链接&&文本内容&/a&  就是我们做网站时常用到的超链接代码。  结束语:  不要小看这一个代码,这一个代码可能为你的网站带来翻倍的流量。
【上一篇】
【下一篇】
  【seo教程推荐】对于做优化一段时间过后,很多都有…
  【seo学堂推荐】网站刚收入,如何把排名做上去?要怎么样才能排到第一页去呢,大概时间会需要多久?  首先,网页已经收录说明网站…
SEO学堂()是一个有态度的、个性化资讯与交流平台,全方位的解读当下社会热点、历史、互联网等事件,致力于独立、前瞻、深入的分析评论。微信公众平台开发(十) 消息回复总结
微信公众平台提供了三种消息回复的格式,即文本回复、音乐回复和图文回复,在这一篇文章中,我们将对这三种消息回复的格式做一下简单讲解,然后封装成函数,以供读者使用。
二、思路分析
对于每一个POST请求,开发者在响应包中返回特定xml结构,对该消息进行响应(现支持回复文本、图文、语音、视频、音乐)。
三、文本回复
3.1 文本回复xml 结构
&ToUserName&&![CDATA[toUser]]&&/ToUserName&
&FromUserName&&![CDATA[fromUser]]&&/FromUserName&
&CreateTime&&/CreateTime&
&MsgType&&![CDATA[text]]&&/MsgType&
&Content&&![CDATA[content]]&&/Content&
3.2 结构说明
3.3 具体实施
针对上面给出的xml 结构,我们只需要在对应的位置填上内容,然后格式化输出就可以了。
ToUserName 位置上填写的是$fromUsername = $postObj-&FromUserName,就是把消息返回给发送信息过来的用户,即接收方账号。
FromUserName 位置上填写的是$toUsername = $postObj-&ToUserName,既是开发者微信号。
这是官方的文本回复,只需实例化它的responseMsg() 方法就可以回复 &Welcome to wechat world!& 消息了。
这里我们稍做修改,返回fromUsername 和toUsername 消息,便于读者理解以上的说明。
3.4 测试结果
3.5 封装成可调用的函数
我们可以将上面的内容封装成函数,在需要回复文本的地方直接调用,方便简洁,responseText.func.inc.php&代码如下。
function _response_text($object,$content){
$textTpl = &&xml&
&ToUserName&&![CDATA[%s]]&&/ToUserName&
&FromUserName&&![CDATA[%s]]&&/FromUserName&
&CreateTime&%s&/CreateTime&
&MsgType&&![CDATA[text]]&&/MsgType&
&Content&&![CDATA[%s]]&&/Content&
&FuncFlag&%d&/FuncFlag&
$resultStr = sprintf($textTpl, $object-&FromUserName, $object-&ToUserName, time(), $content, $flag);
return $resultS
这样,只要传入$object 和$content,然后在需要回复文本的文件中引入该文件,然后调用 _response_text() 方法,就可以直接回复文本了。&
3.6 测试代码
3.6.1 在主文件中引入回复文本的函数文件
require_once 'responseText.func.inc.php';
3.6.2 普通消息回复
public function handleText($postObj)
$keyword = trim($postObj-&Content);
if(!empty( $keyword ))
$contentStr = &微信公众平台-文本回复功能源代码&;
//$resultStr = sprintf($textTpl, $fromUsername, $toUsername, $time, $msgType, $contentStr);
$resultStr = _response_text($postObj,$contentStr);
echo $resultS
echo &Input something...&;
3.6.3 关注时回复
public function handleEvent($object)
$contentStr = &&;
switch ($object-&Event)
case &subscribe&:
$contentStr = &感谢您关注【卓锦苏州】&.&\n&.&微信号:zhuojinsz&;
$contentStr = &Unknow Event: &.$object-&E
$resultStr = _response_text($object, $contentStr);
return $resultS
3.7 测试结果
回复文本成功。
四、图文回复
4.1 图文回复xml 结构
&ToUserName&&![CDATA[toUser]]&&/ToUserName&
&FromUserName&&![CDATA[fromUser]]&&/FromUserName&
&CreateTime&&/CreateTime&
&MsgType&&![CDATA[news]]&&/MsgType&
&ArticleCount&2&/ArticleCount&
&Articles&
&Title&&![CDATA[title1]]&&/Title&
&Description&&![CDATA[description1]]&&/Description&
&PicUrl&&![CDATA[picurl]]&&/PicUrl&
&Url&&![CDATA[url]]&&/Url&
&Title&&![CDATA[title]]&&/Title&
&Description&&![CDATA[description]]&&/Description&
&PicUrl&&![CDATA[picurl]]&&/PicUrl&
&Url&&![CDATA[url]]&&/Url&
&/Articles&
4.2 结构说明
类似文本回复的格式,只需要在相应的位置填上对应的内容就可以回复图文信息了。
4.3 具体实施
图文回复可以是单图文,也可以是多图文,这里我们先以单图文的案例来引导读者,然后再引出多图文。
我们将回复图文的xml 结构分解成为以下三个结构,图文头,图文体,图文尾,图文体就是图文回复时看到的标题,描述,图片URL和原文URL。
$newsTplHead = &&xml&
&ToUserName&&![CDATA[%s]]&&/ToUserName&
&FromUserName&&![CDATA[%s]]&&/FromUserName&
&CreateTime&%s&/CreateTime&
&MsgType&&![CDATA[news]]&&/MsgType&
&ArticleCount&1&/ArticleCount&
&Articles&&;
$newsTplBody = &&item&
&Title&&![CDATA[%s]]&&/Title&
&Description&&![CDATA[%s]]&&/Description&
&PicUrl&&![CDATA[%s]]&&/PicUrl&
&Url&&![CDATA[%s]]&&/Url&
$newsTplFoot = &&/Articles&
&FuncFlag&0&/FuncFlag&
接下来,我们对三段结构分别插入对应内容:
A. $newsTplHead
$header = sprintf($newsTplHead, $object-&FromUserName, $object-&ToUserName, time());
B. $newsTplBody
$title = $newsContent['title'];
$desc = $newsContent['description'];
$picUrl = $newsContent['picUrl'];
$url = $newsContent['url'];
$body = sprintf($newsTplBody, $title, $desc, $picUrl, $url);
说明:$newsContent 是从主文件传入函数的图文数组。
C. $newsTplFoot
$FuncFlag = 0;
$footer = sprintf($newsTplFoot, $FuncFlag);
然后将三段进行拼接返回就可以回复单条图文了。
return $header.$body.$
将以上内容写到一个函数里,命名为&_response_news() 函数,以供下面调用测试。
4.4 测试代码
4.4.1 在主文件中引入回复图文的函数文件
require_once 'responseNews.func.inc.php';
4.4.2 创建数组并传入
在主文件中,只需要向 _response_news() 函数中传入一个数组和$postObj 即可。
$record=array(
'title' =&'山塘街',
'description' =&'山塘街东起阊门渡僧桥,西至苏州名胜虎丘山的望山桥,长约七里,所以苏州俗语说&七里山塘到虎丘&...',
'picUrl' =& '/images/suzhou.jpg',
'url' =&'http://mp./mp/appmsg/show?__biz=MjM5NDM0NTEyMg==&appmsgid=&itemidx=1&sign=9ed483df33ee449b378d#wechat_redirect'
$resultStr = _response_news($postObj,$record);
echo $resultS
4.5 测试结果
点击进入查看
单图文回复测试成功。
4.6 多图文回复
有了上面的引导,读者应该能够想到回复多图文的思路了,就是将多维数组中的值循环放到相应的位置,然后拼接起来就可以了,下面进行讲解。&
4.6.1 获取图文条数
$bodyCount = count($newsContent);
4.6.2 判断图文条数
因为微信限制了回复的图文消息数为10条以内,所以需要判断图文条数,如果小于10条,则图文数等于原来的图文数,如果大于等于10条,则强制限制为10条。
$bodyCount = $bodyCount & 10 ? $bodyCount : 10;
4.6.3 组织图文体
图文头和图文尾和上面单图文一样,不再赘述,主要是图文体的组织。
用foreach 循环出数组的内容并赋予图文体,并进行拼接:
foreach($newsContent as $key =& $value){
$body .= sprintf($newsTplBody, $value['title'], $value['description'], $value['picUrl'], $value['url']);
说明:$newsContent 是从主文件传入函数的图文数组。
4.6.4&拼接并返回
return $header.$body.$footer;
将以上内容写到一个函数里,命名为 _response_multiNews() 函数,以供下面调用测试。
4.7 测试多图文
4.7.1 在主文件中引入回复多图文的函数文件
require_once 'responseMultiNews.func.inc.php';
4.7.2&创建多维数组并传入
$record[0]=array(
'title' =&'观前街',
'description' =&'观前街位于江苏苏州市区,是成街于清朝时期的百年商业老街,街上老店名店云集,名声远播海内外...',
'picUrl' =& '/images/suzhou.jpg',
'url' =&'http://mp./mp/appmsg/show?__biz=MjM5NDM0NTEyMg==&appmsgid=&itemidx=1&sign=e85dd1fde7f77c04e44d5#wechat_redirect'
$record[11]=array(
'title' =&'平江路',
'description' =&'平江路位于苏州古城东北,是一条傍河的小路,北接拙政园,南眺双塔,全长1606米,是苏州一条历史攸久的经典水巷。宋元时候苏州又名平江,以此名路...',
'picUrl' =& '/images/suzhouScenic/pingjianglu.jpg',
'url' =&'http://mp./mp/appmsg/show?__biz=MjM5NDM0NTEyMg==&appmsgid=&itemidx=1&sign=ef18a26ce78c247fd97a#wechat_redirect'
$resultStr = _response_multiNews($postObj,$record);
echo $resultS
4.8 测试多图文结果
点击进入查看
测试多图文成功。
五、音乐回复
微信还提供了一种消息回复的格式,即音乐回复,下面我们编写程序测试一下。
注意:由于音乐版权的问题,现在很少有回复音乐的API,开放的API 查询出来的音乐信息也有很多是不正确的。所以在这里,我们上传几首音乐到自己的服务器空间测试。
本地文件:
测试是否能够正常播放:
5.1 音乐回复xml 结构
&ToUserName&&![CDATA[toUser]]&&/ToUserName&
&FromUserName&&![CDATA[fromUser]]&&/FromUserName&
&CreateTime&&/CreateTime&
&MsgType&&![CDATA[music]]&&/MsgType&
&Title&&![CDATA[TITLE]]&&/Title&
&Description&&![CDATA[DESCRIPTION]]&&/Description&
&MusicUrl&&![CDATA[MUSIC_Url]]&&/MusicUrl&
&HQMusicUrl&&![CDATA[HQ_MUSIC_Url]]&&/HQMusicUrl&
5.2 结构说明
5.3 具体实施
我们先做一个固定的歌曲回复来引导读者,然后再引出更高级别的歌曲查询回复。
5.3.1 在xml 结构的相应位置插入相应数据
&Title&&![CDATA[Far Away From Home]]&&/Title&
&Description&&![CDATA[Groove Coverage]]&&/Description&
&MusicUrl&&![CDATA[/music/10001.mp3]]&&/MusicUrl&
&HQMusicUrl&&![CDATA[/music/10001.mp3]]&&/HQMusicUrl&
5.3.2 测试代码
$resultStr = _response_music($postObj,$keyword);
echo $resultS
5.3.3 测试结果
5.4 模拟点歌
有了上面的简单案例引导,读者应该可以想到模拟点歌的具体实现了吧,下面就来简单介绍一下。
思路:将歌曲代码和对应的歌曲名存入,用户输入歌曲名,在数据库中找到歌曲名对应的歌曲编号,然后就可以生成MusicUrl 回复用户了。
5.4.1 创建数据库
建表语句及数据文件:
CREATE TABLE IF NOT EXISTS `tbl_music` (
`music_id` int(11) NOT NULL,
`music_name` varchar(40) NOT NULL,
`music_singer` varchar(40) NOT NULL,
`music_lrc` text NOT NULL,
PRIMARY KEY (`music_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `tbl_music` (`music_id`, `music_name`, `music_singer`, `music_lrc`) VALUES
(10001, 'Far Away From Home', 'Groove Coverage', 'far away from home'),
(10002, 'The Dawn', 'Dreamtale', 'the dawn'),
(20002, '董小姐', '宋冬野', '董小姐'),
(20001, '左边', '杨丞琳', '左边');
5.4.2 _response_music() 函数编写
A. 引入数据库操作文件
require_once('_bae.func.php');
B. 数据库操作及数据处理
$query = &SELECT * FROM tbl_music WHERE music_name LIKE '%$musicKeyword%'&;
$result = _select_data($query);
$rows = mysql_fetch_array($result, MYSQL_ASSOC);
$music_id = $rows[music_id];
注: $musicKeyword 为从主文件传入的歌曲名关键字,这里使用模糊查询,只取第一条数据。
C. 判断是否查询到
if($music_id && '')
$music_name = $rows[music_name];
$music_singer = $rows[music_singer];
$musicUrl = &/music/&.$music_id.&.mp3&;
$HQmusicUrl = &/music/&.$music_id.&.mp3&;
$resultStr = sprintf($musicTpl, $object-&FromUserName, $object-&ToUserName, time(), $music_name, $music_singer, $musicUrl, $HQmusicUrl);
return $resultS
return &&;
说明:如果查询到歌曲信息,按照xml 结构返回数据;如果未查询到,则返回空,用于主文件判断。
将以上代码封装成&_response_music() 函数并保存为responseMusic.func.inc.php 文件供主文件调用。
5.4.3 测试代码
A. 引入回复音乐和回复文本的函数文件
//引入回复音乐的函数文件
require_once 'responseMusic.func.inc.php';
//引入回复文本的函数文件
require_once 'responseText.func.inc.php';
if(!empty( $keyword ))
$resultStr = _response_music($postObj,$keyword);
if($resultStr && '')
echo $resultS
echo _response_text($postObj,&未查询到【&.$keyword.&】的歌曲信息!&);
说明:如果查询到歌曲信息,则返回所得信息,如果未查询到,则调用 _response_text() 函数返回文本信息。
5.5 模拟点歌测试
回复音乐测试成功。&怎么回复带链接的文本消息 - 微信公众平台开发者问答系统
怎么回复带链接的文本消息
(140 积分)
如下图,实现在文本消息中嵌入一下链接消息,应该怎么实现呢?
不能回答已答过的问题、已关闭的问题和你自己的提问2个回答
这个是在开发模式中实现的,你可以咨询在线客服
这个是自动回复的两个功能,被动回复按照关键词回复微信公众号自动回复怎么加链接
(6,720 积分)微信公众平台如何做回复超链接_百度知道
微信公众平台如何做回复超链接
提问者采纳
直接回复文本,把链接放到文本内即可。但是如果想在图文里加链接,需要是服务号。&a&href=&这里是链接地址&&&链接文本&/a&
其他类似问题
为您推荐:
其他1条回答
把链接放入阅读原文里
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁8431人阅读
最近公司在开发微信项目,所以自己也试着申请了个人的订阅服务号,实现了通过微信接收信息转发至java后台解析并回复的消息的简单功能,在还没忘记的时候记录一下,以便日后查阅,并且贡献出代码希望能给大家一个参考。
好首先你要看下面的示例,要事先申请微信公众平台的订阅服务号(个人只能申请这个),地址https://mp. ,申请的范例我这里就不讲了,一般根据提示可以自行完成,如果这都完成不了,那只能去度娘翻翻了。
要想让用户发送给公众帐号的消息转发给java后台服务器,首先要&在开发者中心 进行&服务器配置
下图为认证启动后小效果:
你要先进入到 修改配置里面,如下图:
你要填写这几个文本框内的内容,
1.URL 不用解释了,就是微信将用户发来的消息转发到你服务器的请求的地址,我让微信把请求发送到本地服务这样方便调试。
推荐一款反向代理的工具&pagekite.net ,感兴趣的朋友可以去搜索一下。使用相当方便,就是需要python2.7.x环境支持,然后运行下载的一个脚本,输入你的邮箱,然后在输入你要设置的域名前缀,就搞定,下次运行就不用在输入,它影射的是本地80端口,所以你启动服务的时候记得改成80端口就对了,还有这个貌似对于一个邮箱只有31天和5个连接的限制,PS:邮箱这东西都是免费的,你懂的。
2.Token:这个长度符合就行 自己随意
3.EncodingAESKey:点击随机生成 就OK
下面介绍我的代码:
我的开发环境是eclipse+springMvc
&/chat& 是我最终项目的请求Controller&URL路径
下面是homecontroller
@Controller
@RequestMapping(&/*&)
public class HomeController {
private String Token = &abcdef&;
@RequestMapping(value = &chat&, method = { RequestMethod.GET, RequestMethod.POST })
@ResponseBody
public void liaotian(Model model, HttpServletRequest request, HttpServletResponse response) {
System.out.println(&进入chat&);
boolean isGet = request.getMethod().toLowerCase().equals(&get&);
if (isGet) {
String signature = request.getParameter(&signature&);
String timestamp = request.getParameter(&timestamp&);
String nonce = request.getParameter(&nonce&);
String echostr = request.getParameter(&echostr&);
System.out.println(signature);
System.out.println(timestamp);
System.out.println(nonce);
System.out.println(echostr);
access(request, response);
// 进入POST聊天处理
System.out.println(&enter post&);
// 接收消息并返回消息
acceptMessage(request, response);
} catch (IOException e) {
e.printStackTrace();
* 验证URL真实性
* @author morning
* @date 日 上午10:53:07
* @param request
* @param response
* @return String
private String access(HttpServletRequest request, HttpServletResponse response) {
// 验证URL真实性
System.out.println(&进入验证access&);
String signature = request.getParameter(&signature&);// 微信加密签名
String timestamp = request.getParameter(&timestamp&);// 时间戳
String nonce = request.getParameter(&nonce&);// 随机数
String echostr = request.getParameter(&echostr&);// 随机字符串
List&String& params = new ArrayList&String&();
params.add(Token);
params.add(timestamp);
params.add(nonce);
// 1. 将token、timestamp、nonce三个参数进行字典序排序
Collections.sort(params, new Comparator&String&() {
public int compare(String o1, String o2) {
pareTo(o2);
// 2. 将三个参数字符串拼接成一个字符串进行sha1加密
String temp = SHA1.encode(params.get(0) + params.get(1) + params.get(2));
if (temp.equals(signature)) {
response.getWriter().write(echostr);
System.out.println(&成功返回 echostr:& + echostr);
} catch (IOException e) {
e.printStackTrace();
System.out.println(&失败 认证&);
private void acceptMessage(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 处理接收消息
ServletInputStream in = request.getInputStream();
// 将POST流转换为XStream对象
XStream xs = SerializeXmlUtil.createXstream();
xs.processAnnotations(InputMessage.class);
xs.processAnnotations(OutputMessage.class);
// 将指定节点下的xml节点数据映射为对象
xs.alias(&xml&, InputMessage.class);
// 将流转换为字符串
StringBuilder xmlMsg = new StringBuilder();
byte[] b = new byte[4096];
for ( (n = in.read(b)) != -1;) {
xmlMsg.append(new String(b, 0, n, &UTF-8&));
// 将xml内容转换为InputMessage对象
InputMessage inputMsg = (InputMessage) xs.fromXML(xmlMsg.toString());
String servername = inputMsg.getToUserName();// 服务端
String custermname = inputMsg.getFromUserName();// 客户端
long createTime = inputMsg.getCreateTime();// 接收时间
Long returnTime = Calendar.getInstance().getTimeInMillis() / 1000;// 返回时间
// 取得消息类型
String msgType = inputMsg.getMsgType();
// 根据消息类型获取对应的消息内容
if (msgType.equals(MsgType.Text.toString())) {
// 文本消息
System.out.println(&开发者微信号:& + inputMsg.getToUserName());
System.out.println(&发送方帐号:& + inputMsg.getFromUserName());
System.out.println(&消息创建时间:& + inputMsg.getCreateTime() + new Date(createTime * 1000l));
System.out.println(&消息内容:& + inputMsg.getContent());
System.out.println(&消息Id:& + inputMsg.getMsgId());
StringBuffer str = new StringBuffer();
str.append(&&xml&&);
str.append(&&ToUserName&&![CDATA[& + custermname + &]]&&/ToUserName&&);
str.append(&&FromUserName&&![CDATA[& + servername + &]]&&/FromUserName&&);
str.append(&&CreateTime&& + returnTime + &&/CreateTime&&);
str.append(&&MsgType&&![CDATA[& + msgType + &]]&&/MsgType&&);
str.append(&&Content&&![CDATA[你说的是:& + inputMsg.getContent() + &,吗?]]&&/Content&&);
str.append(&&/xml&&);
System.out.println(str.toString());
response.getWriter().write(str.toString());
// 获取并返回多图片消息
if (msgType.equals(MsgType.Image.toString())) {
System.out.println(&获取多媒体信息&);
System.out.println(&多媒体文件id:& + inputMsg.getMediaId());
System.out.println(&图片链接:& + inputMsg.getPicUrl());
System.out.println(&消息id,64位整型:& + inputMsg.getMsgId());
OutputMessage outputMsg = new OutputMessage();
outputMsg.setFromUserName(servername);
outputMsg.setToUserName(custermname);
outputMsg.setCreateTime(returnTime);
outputMsg.setMsgType(msgType);
ImageMessage images = new ImageMessage();
images.setMediaId(inputMsg.getMediaId());
outputMsg.setImage(images);
System.out.println(&xml转换:/n& + xs.toXML(outputMsg));
response.getWriter().write(xs.toXML(outputMsg));
加密SHA1,此代码是来自网上
* 微信公众平台(JAVA) SDK
* Copyright (c) 2014, Ansitech Network Technology Co.,Ltd All rights reserved.
* /weixin/sdk/
* Licensed under the Apache License, Version 2.0 (the &License&);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an &AS IS& BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
package com.mor.
import java.security.MessageD
* Title: SHA1算法
public final class SHA1 {
private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
* Takes the raw bytes from the digest and formats them correct.
* @param bytes
the raw bytes from the digest.
* @return the formatted bytes.
private static String getFormattedText(byte[] bytes) {
int len = bytes.
StringBuilder buf = new StringBuilder(len * 2);
// 把密文转换成十六进制的字符串形式
for (int j = 0; j & j++) {
buf.append(HEX_DIGITS[(bytes[j] && 4) & 0x0f]);
buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
return buf.toString();
public static String encode(String str) {
if (str == null) {
MessageDigest messageDigest = MessageDigest.getInstance(&SHA1&);
messageDigest.update(str.getBytes());
return getFormattedText(messageDigest.digest());
} catch (Exception e) {
throw new RuntimeException(e);
输入信息实体类&InputMessage&
&pre name=&code& class=&java&&/*
* 微信公众平台(JAVA) SDK
* Copyright (c) 2014, Ansitech Network Technology Co.,Ltd All rights reserved.
* /weixin/sdk/
* Licensed under the Apache License, Version 2.0 (the &License&);
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an &AS IS& BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
package com.mor.maven.demo.mavenweb.
import java.io.S
import com.thoughtworks.xstream.annotations.XStreamA
* POST的XML数据包转换为消息接受对象
* 由于POST的是XML数据包,所以不确定为哪种接受消息,&br/&
* 所以直接将所有字段都进行转换,最后根据&tt&MsgType&/tt&字段来判断取何种数据
@XStreamAlias(&xml&)
public class InputMessage implements Serializable {
private static final long serialVersionUID = 1L;
@XStreamAlias(&ToUserName&)
private String ToUserN
@XStreamAlias(&FromUserName&)
private String FromUserN
@XStreamAlias(&CreateTime&)
private Long CreateT
@XStreamAlias(&MsgType&)
private String MsgType = &text&;
@XStreamAlias(&MsgId&)
private Long MsgId;
// 文本消息
@XStreamAlias(&Content&)
private String C
// 图片消息
@XStreamAlias(&PicUrl&)
private String PicU
// 位置消息
@XStreamAlias(&LocationX&)
private String LocationX;
@XStreamAlias(&LocationY&)
private String LocationY;
@XStreamAlias(&Scale&)
private Long S
@XStreamAlias(&Label&)
private String L
// 链接消息
@XStreamAlias(&Title&)
private String T
@XStreamAlias(&Description&)
private String D
@XStreamAlias(&Url&)
private String URL;
// 语音信息
@XStreamAlias(&MediaId&)
private String MediaId;
@XStreamAlias(&Format&)
private String F
@XStreamAlias(&Recognition&)
private String R
@XStreamAlias(&Event&)
private String E
@XStreamAlias(&EventKey&)
private String EventK
@XStreamAlias(&Ticket&)
private String T
public String getToUserName() {
return ToUserN
public void setToUserName(String toUserName) {
ToUserName = toUserN
public String getFromUserName() {
return FromUserN
public void setFromUserName(String fromUserName) {
FromUserName = fromUserN
public Long getCreateTime() {
return CreateT
public void setCreateTime(Long createTime) {
CreateTime = createT
public String getMsgType() {
return MsgT
public void setMsgType(String msgType) {
MsgType = msgT
public Long getMsgId() {
return MsgId;
public void setMsgId(Long msgId) {
MsgId = msgId;
public String getContent() {
public void setContent(String content) {
public String getPicUrl() {
return PicU
public void setPicUrl(String picUrl) {
PicUrl = picU
public String getLocationX() {
return LocationX;
public void setLocationX(String locationX) {
LocationX = locationX;
public String getLocationY() {
return LocationY;
public void setLocationY(String locationY) {
LocationY = locationY;
public Long getScale() {
public void setScale(Long scale) {
public String getLabel() {
public void setLabel(String label) {
public String getTitle() {
public void setTitle(String title) {
public String getDescription() {
public void setDescription(String description) {
Description =
public String getURL() {
return URL;
public void setURL(String uRL) {
URL = uRL;
public String getEvent() {
public void setEvent(String event) {
public String getEventKey() {
return EventK
public void setEventKey(String eventKey) {
EventKey = eventK
public String getMediaId() {
return MediaId;
public void setMediaId(String mediaId) {
MediaId = mediaId;
public String getFormat() {
public void setFormat(String format) {
public String getRecognition() {
public void setRecognition(String recognition) {
Recognition =
public String getTicket() {
public void setTicket(String ticket) {
为了加入 CDATA 验证创建的@interface类
package com.mor.maven.demo.mavenweb.
import java.lang.annotation.ElementT
import java.lang.annotation.R
import java.lang.annotation.RetentionP
import java.lang.annotation.T
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.FIELD })
public @interface XStreamCDATA {
改写的XStream工具类
package com.mor.
import java.io.W
import java.lang.reflect.F
import com.mor.maven.demo.mavenweb.model.XStreamCDATA;
import com.thoughtworks.xstream.XS
import com.thoughtworks.xstream.annotations.XStreamA
import com.thoughtworks.xstream.core.util.QuickW
import com.thoughtworks.xstream.io.HierarchicalStreamW
import com.thoughtworks.xstream.io.xml.PrettyPrintW
import com.thoughtworks.xstream.io.xml.XppD
* xml 转换工具类
* @author morning
* @date 日 下午2:42:50
public class SerializeXmlUtil {
public static XStream createXstream() {
return new XStream(new XppDriver() {
public HierarchicalStreamWriter createWriter(Writer out) {
return new PrettyPrintWriter(out) {
boolean cdata =
Class&?& targetClass =
public void startNode(String name, @SuppressWarnings(&rawtypes&) Class clazz) {
super.startNode(name, clazz);
// 业务处理,对于用XStreamCDATA标记的Field,需要加上CDATA标签
if (!name.equals(&xml&)) {
cdata = needCDATA(targetClass, name);
targetClass =
protected void writeText(QuickWriter writer, String text) {
if (cdata) {
writer.write(&&![CDATA[&);
writer.write(text);
writer.write(&]]&&);
writer.write(text);
private static boolean needCDATA(Class&?& targetClass, String fieldAlias) {
boolean cdata =
// first, scan self
cdata = existsCDATA(targetClass, fieldAlias);
if (cdata)
// if cdata is false, scan supperClass until java.lang.Object
Class&?& superClass = targetClass.getSuperclass();
while (!superClass.equals(Object.class)) {
cdata = existsCDATA(superClass, fieldAlias);
if (cdata)
superClass = superClass.getClass().getSuperclass();
private static boolean existsCDATA(Class&?& clazz, String fieldAlias) {
if (&MediaId&.equals(fieldAlias)) {
// 特例添加 morning99
// scan fields
Field[] fields = clazz.getDeclaredFields();
for (Field field : fields) {
// 1. exists XStreamCDATA
if (field.getAnnotation(XStreamCDATA.class) != null) {
XStreamAlias xStreamAlias = field.getAnnotation(XStreamAlias.class);
// 2. exists XStreamAlias
if (null != xStreamAlias) {
if (fieldAlias.equals(xStreamAlias.value()))// matched
} else {// not exists XStreamAlias
if (fieldAlias.equals(field.getName()))
输出实体类&OutputMessage&
package com.mor.maven.demo.mavenweb.
import com.thoughtworks.xstream.annotations.XStreamA
* @author morning
* @date 日 下午2:29:32
@XStreamAlias(&xml&)
public class OutputMessage {
@XStreamAlias(&ToUserName&)
@XStreamCDATA
private String ToUserN
@XStreamAlias(&FromUserName&)
@XStreamCDATA
private String FromUserN
@XStreamAlias(&CreateTime&)
private Long CreateT
@XStreamAlias(&MsgType&)
@XStreamCDATA
private String MsgType = &text&;
private ImageMessage I
public String getToUserName() {
return ToUserN
public void setToUserName(String toUserName) {
ToUserName = toUserN
public String getFromUserName() {
return FromUserN
public void setFromUserName(String fromUserName) {
FromUserName = fromUserN
public Long getCreateTime() {
return CreateT
public void setCreateTime(Long createTime) {
CreateTime = createT
public String getMsgType() {
return MsgT
public void setMsgType(String msgType) {
MsgType = msgT
public ImageMessage getImage() {
public void setImage(ImageMessage image) {
图片信息实体类
package com.mor.maven.demo.mavenweb.
import com.thoughtworks.xstream.annotations.XStreamA
@XStreamAlias(&Image&)
public class ImageMessage extends MediaIdMessage {
多媒体id 实体类
package com.mor.maven.demo.mavenweb.
import com.thoughtworks.xstream.annotations.XStreamA
public class MediaIdMessage {
@XStreamAlias(&MediaId&)
@XStreamCDATA
private String MediaId;
public String getMediaId() {
return MediaId;
public void setMediaId(String mediaId) {
MediaId = mediaId;
基本就这些类,也不知道拷贝全没有。
不过在输出xml的时候由于要添加CDATA标签所以没有实现完美,目前自己在SerializeXmlUtil 内添加了一下判断
如果是子标签下的值目前只能用这种方法加CDATA,不知道各位同学有没有好的方法。
目前只是实现了服务器认证,接收文本信息并回复原文本信息加上些附加信息,接收图片信息并返回原图片信息。
后期会有扩展,先记录到此。
版权声明:本文为博主原创文章,未经博主允许不得转载。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:78179次
积分:1118
积分:1118
排名:千里之外
原创:29篇
转载:28篇
评论:21条
(1)(2)(2)(1)(1)(3)(1)(4)(1)(2)(1)(1)(1)(3)(3)(5)(9)(1)(6)(9)

我要回帖

更多关于 苹果机器人 的文章

 

随机推荐