`
zhangdaiscott
  • 浏览: 454542 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
8fb25857-16b4-3681-ab5e-e319f45c42a8
Jeecg快速开发平台
浏览量:0
文章分类
社区版块
存档分类

微信开发源码讲解

 
阅读更多

微信开发请求Servlet

package com.weixin.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.jeecg.util.SignUtil;

import com.weixin.service.CoreService;

/**
 * 核心请求处理类
 * 
 * @author liufeng
 * @date 2013-05-18
 */
public class CoreServlet extends HttpServlet {
	private static final long serialVersionUID = 4440739483644821986L;

	/**
	 * 确认请求来自微信服务器
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 微信加密签名
		String signature = request.getParameter("signature");
		// 时间戳
		String timestamp = request.getParameter("timestamp");
		// 随机数
		String nonce = request.getParameter("nonce");
		// 随机字符串
		String echostr = request.getParameter("echostr");

		PrintWriter out = response.getWriter();
		// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
		if (SignUtil.checkSignature(signature, timestamp, nonce)) {
			out.print(echostr);
		}
		out.close();
		out = null;
	}

	/**
	 * 处理微信服务器发来的消息
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// 将请求、响应的编码均设置为UTF-8(防止中文乱码)
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");

		// 调用核心业务类接收消息、处理消息
		//String respMessage = MingXingService.processRequest(request);
		String respMessage =CoreService.processRequest(request);
		// 响应消息
		PrintWriter out = response.getWriter();
		out.print(respMessage);
		out.close();
	}

}

针对用户事件具体逻辑处理代码:

package com.weixin.service;


import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;


import javax.servlet.http.HttpServletRequest;


import org.apache.log4j.Logger;
import org.jeecg.message.resp.Article;
import org.jeecg.message.resp.NewsMessage;
import org.jeecg.message.resp.TextMessage;
import org.jeecg.util.FreemarkerHelper;
import org.jeecg.util.MessageUtil;
import org.jeecg.util.weather.Weather;




/**
* 核心服务类
*
* @author liufeng
* @date 2013-05-20
*/
public class CoreService {
private static Logger log = Logger.getLogger(CoreService.class);


/**
* 处理微信发来的请求
*
* @param request
* @return
*/
public static String processRequest(HttpServletRequest request) {
String respMessage = null;
try {
// 默认返回的文本消息内容
String respContent = "请求处理异常,请稍候尝试!";
// xml请求解析
Map<String, String> requestMap = MessageUtil.parseXml(request);
// Map<String, String> requestMap = new HashMap<String, String>();
// // 发送方帐号(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(getMainMenu());
// 将文本消息对象转换成xml字符串
respMessage = MessageUtil.textMessageToXml(textMessage);
// 文本消息
if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {
String content = requestMap.get("Content");
if ("?".equals(content)) {
respContent = getMainMenu();
textMessage.setContent(respContent);
respMessage = MessageUtil.textMessageToXml(textMessage);
} else if ("1".equals(content)) {
respContent = "作者:张代浩 (scott) \n邮箱:scott@jeecg.org \n :129190229";
textMessage.setContent(respContent);
respMessage = MessageUtil.textMessageToXml(textMessage);
} else if ("2".equals(content)) {
respContent = "<a href=\"www.jeecg.org\">www.jeecg.org</a>";
textMessage.setContent(respContent);
respMessage = MessageUtil.textMessageToXml(textMessage);
} else if ("3".equals(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>();
Article article1 = new Article();
article1.setTitle("JEECG专题介绍");
article1.setDescription("JEECG 微云快速开发平台");
article1.setPicUrl("http://avatar.csdn.net/3/D/E/1_zhangdaiscott.jpg");
article1.setUrl("http://zhangdaiscott.github.io/jeecg/");


Article article4 = new Article();
article4.setTitle("第2篇\n MiniDao专题介绍");
article4.setDescription("");
article4.setPicUrl("http://www.jeecg.org/data/attachment/forum/201308/18/224051ey14ehqe000iegja.jpg");
article4.setUrl("http://zhangdaiscott.github.io/MiniDao/");


Article article2 = new Article();
article2.setTitle("第3篇\n JEECG CSDN专家访谈");
article2.setDescription("");
article2.setPicUrl("http://img.my.csdn.net/uploads/201301/23/1358930662_6750.jpg");
article2.setUrl("http://blog.csdn.net/blogdevteam/article/details/8534797");


Article article3 = new Article();
article3.setTitle("第4篇\n 参与开源");
article3.setDescription("");
article3.setPicUrl("http://avatar.csdn.net/3/D/E/1_zhangdaiscott.jpg");
article3.setUrl("http://blog.csdn.net/zhangdaiscott/article/details/14160383");




articleList.add(article1);
articleList.add(article4);
articleList.add(article2);
articleList.add(article3);
newsMessage.setArticleCount(articleList.size());
newsMessage.setArticles(articleList);
respMessage = MessageUtil.newsMessageToXml(newsMessage);
}else if ("4".equals(content)) {
respContent = "<a href=\"http://jeecgdemo.duapp.com/html5Servlet\">微应用演示 -- 用力点我</a>";
textMessage.setContent(respContent);
respMessage = MessageUtil.textMessageToXml(textMessage);
}else if ("5".equals(content)||"翻译".equals(content)) {
respContent = getTranslateUsage();
textMessage.setContent(respContent);
respMessage = MessageUtil.textMessageToXml(textMessage);
}else if ("6".equals(content)||"大转盘".equals(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);

Article article3 = new Article();
List<Article> articleList = new ArrayList<Article>();
article3.setTitle("大转盘");
article3.setDescription("");
article3.setPicUrl("http://www.jeecg.org/data/attachment/forum/201312/17/165432nuqktzqq305hkr06.jpg");
article3.setUrl("http://jeecgdemo.duapp.com/zhuanpan.htm");
articleList.add(article3);
newsMessage.setArticleCount(articleList.size());
newsMessage.setArticles(articleList);
respMessage = MessageUtil.newsMessageToXml(newsMessage);
}else if (content.startsWith("翻译")) {
String keyWord = content.replaceAll("^翻译", "").trim();
if ("".equals(keyWord)) {
textMessage.setContent(getTranslateUsage());
} else {
textMessage.setContent(BaiduTranslateService.translate(keyWord));
}
respMessage = MessageUtil.textMessageToXml(textMessage);
}else if (content.startsWith("天气")||content.startsWith("7")) {
String keyWord = content.replaceAll("天气", "").trim();
if ("".equals(keyWord)||"7".equals(keyWord)) {
StringBuffer buffer = new StringBuffer();
// 接收用户发送的文本消息内容
buffer.append("发送天气+城市,例如'天气广州'").append("\n");
textMessage.setContent(buffer.toString());
respMessage = MessageUtil.textMessageToXml(textMessage);
} else {
Map<String, Object> map = new HashMap<String, Object>();
Map<String, Object> map2 = new HashMap<String, Object>();
try{
String filepach = request.getRealPath("/");
Weather util = new Weather();
map = util.report(keyWord,filepach);
map2 = util.report2(keyWord,filepach);
}catch (Exception e) {
e.printStackTrace();
StringBuffer buffer = new StringBuffer();
// 接收用户发送的文本消息内容
buffer.append("发送天气+城市,例如'天气广州'").append("\n");
textMessage.setContent(buffer.toString());
respMessage = MessageUtil.textMessageToXml(textMessage);
return respMessage;
}

List<Article> articleList = new ArrayList<Article>();
// 创建图文消息
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);

// Properties prop = new Properties();
// InputStream inStream = CoreService.class
// .getResourceAsStream("/messages.properties");
// try {
// prop.load(inStream);
// inStream.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
// String picurl = prop.getProperty("picurl");

Article article1 = new Article();
article1.setTitle("【"+content.substring(2)+"】天气实况 气温:"+map2.get("temp")+"度 风速:"+map2.get("WD")+" "+map2.get("WS")+" 湿度:"+map2.get("SD") );
article1.setDescription("");
// article1.setPicUrl(picurl+"/image/khdxz2.jpg");
article1.setPicUrl("");
article1.setUrl("");


Article article2 = new Article();
article2.setTitle("建议:"+map.get("index_d"));
article2.setDescription("");
article2.setPicUrl("");
article2.setUrl("");

Article article3 = new Article();
article3.setTitle(map.get("mydate1")+" "+map.get("myweek1")+" "+map.get("temp1")+" "+map.get("weather1")+" "+map.get("wind1")+" "+map.get("fl1"));
article3.setDescription("");
article3.setPicUrl("http://m.weather.com.cn/img/b"+map.get("img1")+".gif");
article3.setUrl("");


Article article4 = new Article();
article4.setTitle(map.get("mydate2")+" "+map.get("myweek2")+" "+map.get("temp2")+" "+map.get("weather2")+" "+map.get("wind2")+" "+map.get("fl2"));
article4.setDescription("");
article4.setPicUrl("http://m.weather.com.cn/img/b"+map.get("img2")+".gif");
article4.setUrl("");

Article article5 = new Article();
article5.setTitle(map.get("mydate3")+" "+map.get("myweek3")+" "+map.get("temp3")+" "+map.get("weather3")+" "+map.get("wind3")+" "+map.get("fl3"));
article5.setDescription("");
article5.setPicUrl("http://m.weather.com.cn/img/b"+map.get("img3")+".gif");
article5.setUrl("");


articleList.add(article1);
articleList.add(article2);
articleList.add(article3);
articleList.add(article4);
articleList.add(article5);
newsMessage.setArticleCount(articleList.size());
newsMessage.setArticles(articleList);
respMessage = MessageUtil.newsMessageToXml(newsMessage);
}

}
}
// 图片消息
else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) {
respContent = "您发送的是图片消息!";
}
// 地理位置消息
else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) {
respContent = "您发送的是地理位置消息!";
}
// 链接消息
else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) {
respContent = "您发送的是链接消息!";
}
// 音频消息
else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) {
respContent = "您发送的是音频消息!";
}
// 事件推送
else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {
// 事件类型
String eventType = requestMap.get("Event");
// 订阅
if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
respContent = "谢谢您的关注!回复\"?\"进入主菜单。";
textMessage.setContent(respContent);
respMessage = MessageUtil.textMessageToXml(textMessage);
}
// 取消订阅
else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {
// TODO 取消订阅后用户再收不到公众号发送的消息,因此不需要回复消息
}
// 自定义菜单点击事件
else if (eventType.equals(MessageUtil.EVENT_TYPE_CLICK)) {
// TODO 自定义菜单权没有开放,暂不处理该类消息
String EventKey = requestMap.get("EventKey");
if("jeecg.name".equals(EventKey)){
respContent = "作者:张代浩 (scott)\n 邮箱:scott@jeecg.org \n :129190229";
textMessage.setContent(respContent);
respMessage = MessageUtil.textMessageToXml(textMessage);
}
if("翻译".equals(EventKey)){
respContent = getTranslateUsage();
textMessage.setContent(respContent);
respMessage = MessageUtil.textMessageToXml(textMessage);
}

}
}


} catch (Exception e) {
e.printStackTrace();
}


return respMessage;
}


/**
* 欢迎语
* @return
*/
public static String getMainMenu() {

// 复杂字符串文本读取,采用文件方式存储
String html = new FreemarkerHelper().parseTemplate("/text/welcome.ftl", null);
return html;
}



/**
* Q译通使用指南
*
* @return
*/
public static String getTranslateUsage() {
StringBuffer buffer = new StringBuffer();
buffer.append("微译使用指南").append("\n\n");
buffer.append("微译为用户提供专业的多语言翻译服务,目前支持以下翻译方向:").append("\n");
buffer.append(" 中 -> 英").append("\n");
buffer.append(" 英 -> 中").append("\n");
buffer.append(" 日 -> 中").append("\n\n");
buffer.append("使用示例:").append("\n");
buffer.append(" 翻译我是中国人").append("\n");
buffer.append(" 翻译dream").append("\n");
buffer.append(" 翻译さようなら").append("\n\n");
buffer.append("回复“?”显示主菜单");
return buffer.toString();
}

}

去123123

分享到:
评论

相关推荐

    微信公众号项目开发模板源码.zip_微信小程序源码免费

    微信公众号、小程序项目开发模板源码...微信公众号/小程序开发项目源码(支持多公众号) 微信应用开发一步到位,结合测试公众号完成开发Demo演示,项目源码运行 图文步骤逐一讲解。

    微信开发学习总结(二)——微信开发环境准备(2)项目源码

    为微信开发学习总结(二)——微信开发环境准备(2)博客讲解中附带源码。 参考博客: 微信开发学习总结(二)——微信开发环境准备(2) https://blog.csdn.net/qq_29914837/article/details/82896861

    仿微信界面源码

    【仿微信界面源码】是一个专门用于开发类似微信应用界面的源代码库,它提供了实现微信界面风格的各种组件和布局,使得开发者能够快速构建出与微信界面类似的移动应用。这个源码项目通常会涵盖登录注册、聊天界面、...

    Net微信系统源码(商城与管理微信)

    【标题】"Net微信系统源码(商城与管理微信)"所涵盖的知识点主要集中在.NET...这个项目适合对.NET技术有一定基础,想学习微信开发或者电商系统构建的开发者。通过研究这个源码,可以提升在实际项目中的开发和调试能力。

    微信趣味小程序源码 恋爱配对微信小程序源码 星座男女配对微信小程序源码.zip

    本文将详细讲解“微信趣味小程序源码 - 恋爱配对微信小程序源码 - 星座男女配对微信小程序源码”的相关知识点,主要涉及微信小程序开发、软件设计、星座学以及用户交互设计。 首先,我们要理解的是微信小程序。微信...

    微信公众平台最佳实践-源代码-方倍工作室

    自从方倍工作室在博客园推出微信公众平台开发系列教程后,受到广大微信开发人员及爱好者的热情关注,相头文章的日访问量高达上万人次,而《微信公众平台开发入门教程》一门阅读量早已超出20万,很多博文被很多有影响...

    原生微信小程序源码 - -麻将骰子:附详细教程

    微信小程序是一种轻量级的应用开发平台,由腾讯公司推出,主要应用于移动端,为用户提供便捷的服务和丰富的交互体验。本教程将深入探讨如何使用原生微信小程序开发一款麻将骰子应用,帮助开发者掌握小程序的基本概念...

    高仿微信系列源码(2)

    这个系列博客的源码是学习移动应用开发,尤其是Android或iOS平台上微信克隆开发的宝贵资源。 【描述】中提到的链接,http://blog.csdn.net/dawanganban/article/details/20007513,指向了详细的教程文章,该文章...

    129个微信小程序源码

    微信小程序是一种轻量级的应用开发平台,主要用于在微信内创建和运行无需下载安装的应用程序,为用户提供便捷的服务体验。这个压缩包包含129个不同的微信小程序源码,覆盖了多个功能领域,如智能机器人、自定义...

    支付宝微信支付源码demo.rar

    本文将详细讲解如何在ASP.NET环境下实现支付宝与微信支付功能,并提供关键步骤和技术要点,以帮助开发者更好地理解和应用这两种常见的在线支付方式。 首先,我们关注的是"支付宝微信支付源码demo.rar"这个压缩包...

    微信小程序户外旅游小程序(旅游类)小程序源码(源码+源码导入视频教程+源码导入文档教程)小程序精选源码亲测可用

    总之,这款“户外旅游小程序”源码提供了从开发到上线的全套资源,对于想学习微信小程序开发或者想进入旅游行业的开发者来说,是一个宝贵的实践机会。通过深入研究源码和教程,不仅可以了解旅游类小程序的设计理念,...

    用C# winform 版微信源代码

    本文将详细讲解如何使用C#开发Windows Forms(WinForm)应用程序来实现微信的桌面客户端功能。这个项目基于wanlong360599336的开源代码进行修改,修复了登录、好友列表获取、头像获取的问题,并实现了收发信息等核心...

    微信小程序-旅游(完整带后台)小程序源码

    综上所述,"微信小程序-旅游(完整带后台)小程序源码"是一个涵盖了前后端开发的综合性项目,涉及到的技术栈广泛,包括前端的WXML、WXSS、JavaScript,以及后端的Web开发框架和数据库操作。对于想要学习微信小程序...

    高仿微信系列源码(3)

    这个"高仿微信系列源码(3)"很可能详细讲解了上述某个或多个环节的实现过程,通过阅读博客文章和分析源码,开发者可以学习到如何将这些功能落地到实际项目中。对于想要提升移动应用开发技能,尤其是对即时通讯有...

    易语言Pc微信Hook+微信2.6.8.51.zip

    6. 课程专用Hook.ec:这可能是一个针对教学或学习目的的特殊Hook模块,可能包含了讲解如何在易语言中实现Hook技术,以捕获和分析微信的网络通信数据。 7. 扫一扫.jpg:这可能是一个微信扫描二维码的图像,用于教学...

    微信小程序1800套源码+视频教程

    这1800套源码模板和视频教程是一个全面的学习资源,无论是初学者还是有经验的开发者,都能从中受益匪浅,快速提升微信小程序的开发技能。通过实践这些模板,可以加深对小程序开发的理解,激发创新思维,为自己的项目...

    微信小程序点餐系统微信小程序开发实战

    微信小程序点餐系统是当前移动...通过以上讲解,我们可以了解到微信小程序点餐系统的开发涉及到的技术点和流程,结合提供的"点餐demo",开发者可以逐步实践并完善自己的点餐小程序,为用户提供更优质的在线点餐服务。

    订单管理--微信小程序源码

    订单管理微信小程序源码是开发一个能够处理订单流程的小程序应用的代码集合,通常包括用户下单、支付、查看订单状态、取消订单等核心功能。在微信小程序中,开发者需要掌握微信开发者工具的使用,以及小程序的开发...

    微信小程序开发项目源码+笔记.7z

    本项目提供了微信小程序的开发源码和相关笔记,是学习和实践微信小程序开发的宝贵资源。 一、微信小程序开发基础 微信小程序开发主要基于JavaScript、WXML(WeChat Markup Language)和WXSS(WeChat Style Sheets)...

    蓝色版微信去水印小程序源码带流量主+前端+后端 +接口

    本文将详细讲解“蓝色版微信去水印小程序源码带流量主+前端+后端 +接口”的相关知识点,包括微信小程序的基本概念、去水印技术、前端开发、后端服务以及流量主接口。 1. 微信小程序: 微信小程序是腾讯公司推出的一...

Global site tag (gtag.js) - Google Analytics