微信公众平台开发(3)-回复消息

一、回复文本消息
二、回复链接消息
三、回复音乐消息
四、回复图文消息
五、事件-订阅
六、事件-取消订阅
PS:当然还包括表情。参考:http://www.360doc.com/content/13/0803/13/13350344_304465190.shtml
完整代码:
微信接口配置的回调地址对应的Controller

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;  

import com.company.project.service.WeixinService;
import com.company.project.util.Util;  

import javacommon.base.BaseRestSpringController;  

@Controller
@RequestMapping("/wxapi")
public class WeixinApiController extends BaseRestSpringController<Object, java.lang.Long>{
public static final Logger log = Logger.getLogger(WeixinApiController.class);
public static final String WX_TOKEN = "weixin";
@Autowired
private WeixinService wxService;
/**
* 微信回调地址
*
* @author qincd
* @throws IOException
* @date Nov 3, 2014 4:01:42 PM
*/
@RequestMapping(method=RequestMethod.GET)
public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException {
// 微信会在配置的回调地址上加上signature,nonce,timestamp,echostr4个参数
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");  

log.info("微信传递的参数:");
log.info("signature:"+signature);
log.info("timestamp:"+timestamp);
log.info("nonce:"+nonce);
log.info("echostr:"+echostr);  

if (StringUtils.isEmpty(signature)) {
return;
}
// 1).排序
String sortString = sort(WX_TOKEN, timestamp, nonce);
// 2).加密
String mytoken = Util.sha1(sortString);
// 3).校验签名
if (StringUtils.isNotEmpty(mytoken) && mytoken.equals(signature)) {
log.info("签名校验通过。");
response.getWriter().println(echostr);
}
else {
log.warn("签名校验失败。");
}
}  

@RequestMapping(method=RequestMethod.POST)
public void doPost(HttpServletRequest request,HttpServletResponse response) throws IOException {
// 处理请求、响应
request.setCharacterEncoding("utf-8");
response.setCharacterEncoding("utf-8");
String message = wxService.processRequest(request);
response.getWriter().println(message);
}  

/**
* 将token,timestamp,nonce按字典序排序,并返回拼接的字符串
*
* @author qincd
* @date Nov 3, 2014 4:09:43 PM
*/
public static String sort(String token,String timestamp,String nonce) {
String[] strArray = {token,timestamp,nonce};
Arrays.sort(strArray);  

StringBuilder sbuilder = new StringBuilder();
for (String str : strArray) {
sbuilder.append(str);
}  

return sbuilder.toString();
}  

}  

import java.util.ArrayList;
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.company.project.model.resp.Articles;
import com.company.project.model.resp.Music;
import com.company.project.model.resp.MusicMessage;
import com.company.project.model.resp.NewsMessage;
import com.company.project.model.resp.TextMessage;
import com.company.project.util.MessageUtil;  

@Service
public class WeixinService {
public static Logger log = Logger.getLogger(WeixinService.class);  

public String processRequest(HttpServletRequest req) {
// 解析微信传递的参数
String str = null;
try {
Map<String,String> xmlMap = MessageUtil.parseXml(req);
str = "请求处理异常,请稍后再试!";  

String ToUserName = xmlMap.get("ToUserName");
String FromUserName = xmlMap.get("FromUserName");
String MsgType = xmlMap.get("MsgType");  

if (MsgType.equals(MessageUtil.MESSAGG_TYPE_TEXT)) {
// 用户发送的文本消息
String content = xmlMap.get("Content");
log.info("用户:[" + FromUserName + "]发送的文本消息:" + content);  

// 链接
if (content.contains("csdn")) {
TextMessage tm = new TextMessage();
tm.setToUserName(FromUserName);
tm.setFromUserName(ToUserName);
tm.setMsgType(MessageUtil.MESSAGG_TYPE_TEXT);
tm.setCreateTime(System.currentTimeMillis());
tm.setContent("我的CSDN博客:<a href=\"http://my.csdn.net/qincidong\">我的CSDN博客</a>\n");
return MessageUtil.textMessageToXml(tm);
}  

if (content.contains("图文")) {
NewsMessage nm = new NewsMessage();
nm.setFromUserName(ToUserName);
nm.setToUserName(FromUserName);
nm.setCreateTime(System.currentTimeMillis());
nm.setMsgType(MessageUtil.MESSAGG_TYPE_NEWS);
List<Articles> articles = new ArrayList<Articles>();
Articles e1 = new Articles();
e1.setTitle("马云接受外媒专访:中国的五大银行想杀了“我”");
e1.setDescription("阿里巴巴集团上市大获成功,《华尔街日报》日前就阿里巴巴集团、支付宝等话题采访了马云,马云也谈到了与苹果Apple Pay建立电子支付联盟的可能性。本文摘编自《华尔街日报》,原文标题:马云谈阿里巴巴将如何帮助美国出口商,虎嗅略有删节。");
e1.setPicUrl("http://img1.gtimg.com/finance/pics/hv1/29/53/1739/113092019.jpg");
e1.setUrl("http://finance.qq.com/a/20141105/010616.htm?pgv_ref=aio2012&ptlang=2052");  

Articles e2 = new Articles();
e2.setTitle("史上最牛登机牌:姓名竟是微博名 涉事航空公司公开致歉");
e2.setDescription("世上最遥远的距离是飞机在等你登机,你却过不了安检。");
e2.setPicUrl("http://p9.qhimg.com/dmfd/328_164_100/t011946ff676981792d.png");
e2.setUrl("http://www.techweb.com.cn/column/2014-11-05/2093128.shtml");
articles.add(e1);
articles.add(e2);  

nm.setArticles(articles);
nm.setArticleCount(articles.size());  

String newsXml = MessageUtil.NewsMessageToXml(nm);
log.info("\n"+newsXml);
return newsXml;
}
if (content.contains("音乐")) {
MusicMessage mm =  new MusicMessage();
mm.setFromUserName(ToUserName);
mm.setToUserName(FromUserName);
mm.setMsgType(MessageUtil.MESSAGG_TYPE_MUSIC);
mm.setCreateTime(System.currentTimeMillis());
Music music = new Music();
music.setTitle("Maid with the Flaxen Hair");
music.setDescription("测试音乐");
music.setMusicUrl("http://yinyueshiting.baidu.com/data2/music/123297915/1201250291415073661128.mp3?xcode=e2edf18bbe9e452655284217cdb920a7a6a03c85c06f4409");
music.setHQMusicUrl("http://yinyueshiting.baidu.com/data2/music/123297915/1201250291415073661128.mp3?xcode=e2edf18bbe9e452655284217cdb920a7a6a03c85c06f4409");
mm.setMusic(music);  

String musicXml = MessageUtil.MusicMessageToXml(mm);
log.info("musicXml:\n" + musicXml);
return musicXml;
}  

// 响应
TextMessage tm = new TextMessage();
tm.setToUserName(FromUserName);
tm.setFromUserName(ToUserName);
tm.setMsgType(MessageUtil.MESSAGG_TYPE_TEXT);
tm.setCreateTime(System.currentTimeMillis());
tm.setContent("你好,你发送的内容是:\n" + content);  

String xml = MessageUtil.textMessageToXml(tm);
log.info("xml:" + xml);
return xml;
}
else if (MsgType.equals(MessageUtil.MESSAGG_TYPE_EVENT)) {
String event = xmlMap.get("Event");
if (event.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
// 订阅
TextMessage tm = new TextMessage();
tm.setToUserName(FromUserName);
tm.setFromUserName(ToUserName);
tm.setMsgType(MessageUtil.MESSAGG_TYPE_TEXT);
tm.setCreateTime(System.currentTimeMillis());
tm.setContent("你好,欢迎关注[程序员的生活]公众号![愉快]/呲牙/玫瑰\n目前可以回复文本消息");
return MessageUtil.textMessageToXml(tm);
}
else if (event.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {
// 取消订阅
log.info("用户【" + FromUserName + "]取消关注了。");
}
}
} catch (Exception e) {
e.printStackTrace();
log.error("处理微信请求时发生异常:");
}  

return str;
}
}
时间: 2024-10-07 03:45:23

微信公众平台开发(3)-回复消息的相关文章

Java微信公众平台开发(四)--回复消息的分类及实体的创建

转自:http://www.cuiyongzhi.com/post/42.html 前面有说道对接收到微信服务器消息后对消息的分类,当时主要分为普通消息和事件消息,这里我们要讲述的是我们在给用户回复的消息类型,在这里也可以大致分为两类:一种为不需要上传资源到微信服务器的这里成为[普通消息回复]:还有一种需要上传资源到微信服务器的这里称为[多媒体消息回复]! 普通消息回复:回复文本消息/回复图文消息 多媒体消息回复:回复图片消息/回复语音消息/回复视频消息/回复音乐消息 (一)回复消息基类的实现

微信公众平台开发(97) 图文消息

关键字:微信公众平台 开发模式 图文消息作者:方倍工作室原文:http://www.cnblogs.com/txw1958/p/weixin-97-news.html 在这篇微信公众平台开发教程中,我们将介绍如何灵活的使用图文消息功能.我们将只介绍被动回复消息中的图文消息,发送客服消息及高级群发消息接口的发送的图文消息与本文介绍的图文消息的各情况基本一致. 本文分为以下四个部分: 图文消息的定义 图文消息的实现 图文消息的类型 图文消息的回复 一.图文消息的定义 在微信公众平台消息中,发送被动响

微信公众平台开发(102) 模版消息

关键字:微信公众平台 模版消息作者:方倍工作室原文:http://www.cnblogs.com/txw1958/p/wechat-template-message.html 在这篇微信公众平台开发教程中,我们将介绍如何开发模版消息,即如何用程序发送模版消息功能.本文分为以下三个部分: 申请模版消息权限 开发模版消息SDK 构造模版消息体并发送 一.申请模版消息权限 模版消息的申请需账号已经开通微信支付权限. 在微信公众平台的后台,依次进入“功能->添加功能插件->模版消息”,即可申请模版消息

微信公众平台开发,模板消息,网页授权,微信JS-SDK,二维码生成(4)

微信公众平台开发,模板消息,什么是模板消息,模板消息接口指的是向用户发送重要的服务通知,只能用于符合场景的要求中去,如信用卡刷卡通知,购物成功通知等等.不支持广告营销,打扰用户的消息,模板消息类有固定的模板,每个账号可以使用25个模板,模板消息上线每日10万次,粉丝数上涨到10w/100w/1000w/模板消息的上线次数会自动上调.模板接口调用主要注意事项:模板ID和模板赋值这两点.模板参数内容必须以.DATA结尾,模板保留符号"{{}}".使用步骤如下: 1.设置所属行业,这个可以在

微信公众平台开发(102) 模板消息

在这篇微信公众平台开发教程中,我们将介绍如何开发模板消息,即如何用程序发送模板消息功能.本文分为以下三个部分: 申请模板消息权限 开发模板消息SDK 构造模板消息体并发送 一.申请模板消息权限 模板消息的申请需账号已经开通微信支付权限. 在微信公众平台的后台,依次进入"功能->添加功能插件->模板消息",即可申请模板消息. 点击申请 申请时,选择2个和自己相关的行业即可. 提交并且申请通过后,可以在模板库中看到模板消息列表 进入想要使用的模板,点击添加 添加后就存放到&qu

微信公众平台开发(102) 模版消息(转)

关键字:微信公众平台 模版消息作者:方倍工作室原文:http://www.cnblogs.com/txw1958/p/wechat-template-message.html 在这篇微信公众平台开发教程中,我们将介绍如何开发模版消息,即如何用程序发送模版消息功能.本文分为以下三个部分: 申请模版消息权限 开发模版消息SDK 构造模版消息体并发送 一.申请模版消息权限 模版消息的申请需账号已经开通微信支付权限. 在微信公众平台的后台,依次进入“功能->添加功能插件->模版消息”,即可申请模版消息

微信公众平台开发【接收消息】接收普通消息

当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上.服务器在解析此数据包,获取相关参数的值从而做出回复.接收普通消息主要包括:文本消息.图片消息.语音消息.视频消息.小视频消息.地理位置消息.链接消息.XML数据包结构和相关参数如下: 1.文本消息 <xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fr

Java微信公众平台开发(三)--接收消息的分类及实体的创建

转自:http://www.cuiyongzhi.com/post/41.html 前面一篇有说道应用服务器和腾讯服务器是通过消息进行通讯的,并简单介绍了微信端post的消息类型,这里我们将建立消息实体以方便我们后面的使用! (一)消息实体基础类 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45

C# 微信公众平台开发(4)-- 模版消息

微信公众平台开发 --发送模版消息 发送模版消息是微信服务号给某个用户发送模版消息,类似于APP的推送通知: 1.添加模版消息 在页面的左上 有一个添加功能插件的 按钮,如题 添加完成后,我们就可以在左边的菜单栏看到 相应的信息了: 2.添加模版消息    详情里面有关模版的介绍,和发送短信需要传送的数据: 3.发送模版消息 接口调用请求说明http请求方式: POST https://api.weixin.qq.com/cgi-bin/message/template/send?access_

微信公众平台开发问答 【转发】

微信公众平台开发问答 微信公众平台开发问答是一个微信知识问答区,专注于提供微信应用及开发技术知识的整理.归类和检索. 主题:新手常见问题 问:我是新手,没有开发基础,应该如何学习微信公众平台的开发?答:先学习PHP和Mysql,可以在网上找相应的教程,也可参考书籍<PHP和MySQL Web开发(原书第4版)>:再学习微信公众平台开发入门教程,了解微信收发消息原理及回复:然后根据微信开发文档,熟悉接口,并在此基础上实现一些基本的小功能,并扩展到更复杂的功能上. 问:URL和Token是什么意思