• 数据流向 ———–> ———–> 用户 微信端 后台服务器 <———– <———– 成功接入微信端后 接受用户发送的xml消息,解析为实体对象,处理后再转成xml格式的数据发送给微信
    数据流向
    		
    用户微信端	后台服务器
    
    成功接入微信端后
    接受微信端发送的xml消息,解析为实体对象,处理后再转成xml格式的数据发送给微信端
    
    servlet代码
    ```
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		// /** 请求获取token*/
    		// String token = new WechatUtil().getToken();
    		// logger.error("----->获取token------->"+token);
    		// 设置utf-8编码防止中文乱码
    		request.setCharacterEncoding("UTF-8");
    		response.setCharacterEncoding("UTF-8");
    		PrintWriter out = null;
    
    		// 发送给微信端的的xml数据
    		String respXmlMsg = null;
    		// 返回xml数据对象
    		ResponseXml responseXml = new ResponseXml();
    		// xml请求解析
    		Map requestMap;
    		try {
    			requestMap = MessageUtil.parseXml(request);// 解析xml对象
    			String fromUserName = requestMap.get("FromUserName");// 发送方帐号(open_id)
    			String toUserName = requestMap.get("ToUserName");// 公众帐号
    			String creatTime = requestMap.get("CreateTime");
    			String msgType = requestMap.get("MsgType");// 消息类型
    			String content = requestMap.get("Content");// text内容
    			String event = requestMap.get("Event");// event内容
    			String eventKey = requestMap.get("EventKey");
    			logger.error("!-!-!-!-!:" + eventKey);
    			// 输出log日志
    			logger.error("----->req  msgType:" + msgType);
    			logger.error("----->req  event:" + event);
    			logger.error("----->req  content:" + content);
    
    			String sql = "insert into receivetextMsg values('" + toUserName + "','" + fromUserName + "'," + creatTime + ",'" + msgType + "','" + content + "')";
    			new DBUtil(sql);// 存储到数据库中
    			// 根据用户输入回复不同内容
    			if (msgType.equals("text")) {
    				if (content.equals("1")) {
    					respXmlMsg = responseXml.respTextXml(fromUserName, toUserName, "1是极好");
    				} else if (content.equals("2")) {
    					respXmlMsg = responseXml.respTextXml(fromUserName, toUserName, "2nice");
    				} else {
    					respXmlMsg = responseXml.respTextXml(fromUserName, toUserName, "既不是1也不是2/::D");
    				}
    
    			} else if (msgType.equals("image")) {
    				respXmlMsg = responseXml.respNewsXml(fromUserName, toUserName);
    			}
    			if (msgType.equals("event")) {
    				if (event.equals("subscribe")) {
    					// 订阅时 返回消息
    					respXmlMsg = responseXml.respTextXml(fromUserName, toUserName, "输入1、2、3...试试看/::D\n或者发个图片/::D");
    				} else if (event.equals("CLICK")) {
    					if (eventKey.equals("V1001_GOOD")) {
    						logger.error("!-!-!-!-!-!-->click事件");
    						respXmlMsg = responseXml.respTextXml(fromUserName, toUserName, "谢谢支持/:rose");
    					}
    				}
    
    			}
    			// 输出日志
    			logger.error("logpost----respXmlMsg----->:" + respXmlMsg);
    			out = response.getWriter();
    			out.print(respXmlMsg);
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			out.close();
    			out = null;
    		}
    	}
    
    ```
    解析xml 及string转xml方法
    需导包 dom4j.jar xstream.jar(依赖xmlpull.jar)
    ```
    /**
     * 解析微信发来的请求(XML)
     * 返回string转成的xml
     * @author admin
     *
     */
    public class MessageUtil {
    	/**
    	 * 解析微信发来的请求(XML)
    	 * @param request
    	 * @return
    	 */
    	public static Map parseXml(HttpServletRequest request)
    			throws Exception {
    		// 将解析结果存储在HashMap中
    		Map map = new HashMap();
    
    		// 从request中取得输入流
    		InputStream inputStream = request.getInputStream();
    		// 读取输入流
    		SAXReader reader = new SAXReader();
    		Document document = reader.read(inputStream);
    		// 得到xml根元素
    		Element root = document.getRootElement();
    		// 得到根元素的所有子节点
    		@SuppressWarnings("unchecked")
    		List elementList = root.elements();
    
    		// 遍历所有子节点
    		for (Element e : elementList)
    			map.put(e.getName(), e.getText());
    
    		// 释放资源
    		inputStream.close();
    		inputStream = null;
    
    		return map;
    	}
    
    	/**
    	 * 文本消息对象转换成xml
    	 * @param textMessage 文本消息对象
    	 * @return xml
    	 */
    	public static String textMessageToXml(TextMessage textMessage) {
    		xstream.alias("xml", textMessage.getClass());
    		return xstream.toXML(textMessage);
    	}
    	
    	 /** 
         * 音乐消息对象转换成xml 
         *  
         * @param musicMessage 音乐消息对象 
         * @return xml 
         */  
        public static String musicMessageToXml(MusicMessage musicMessage) {  
            xstream.alias("xml", musicMessage.getClass());  
            return xstream.toXML(musicMessage);  
        }  
      
        /** 
         * 图文消息对象转换成xml 
         *  
         * @param newsMessage 图文消息对象 
         * @return xml 
         */  
        public static String newsMessageToXml(NewsMessage newsMessage) {  
            xstream.alias("xml", newsMessage.getClass());  
            xstream.alias("item", new Article().getClass());  
            return xstream.toXML(newsMessage);  
        }  
    	/** 
         * 扩展xstream,使其支持CDATA块 
         * xstream 还依赖xmlpull_1_0_5.jar许引入
         */  
        private static XStream xstream = new XStream(new XppDriver() {  
            public HierarchicalStreamWriter createWriter(Writer out) {  
                return new PrettyPrintWriter(out) {  
                    // 对所有xml节点的转换都增加CDATA标记  
                    boolean cdata = true;  
                    protected void writeText(QuickWriter writer, String text) {  
                    	if (cdata) {  
                            writer.write("");  
                        } else {  
                            writer.write(text);  
                        }  
                    }  
                };  
            }  
        });  
    }
    
    ```
    
    响应的实体对象类
    
    ```
    public class BaseMessage {
    	/**
    	 * 接收方帐号(收到的OpenID)
    	 */
    	private String ToUserName;
    	/**
    	 * 开发者微信号
    	 */
    	private String FromUserName;
    	/**
    	 * 消息创建时间 (整型)
    	 */
    	private long CreateTime;
    
    	/**
    	 * 消息类型
    	 */
    	private String MsgType;
    
    	/**
    	 * 位0x0001被标志时,星标刚收到的消息
    	 */
    	private int FuncFlag;
    
    	public String getToUserName() {
    		return ToUserName;
    	}
    
    	public void setToUserName(String toUserName) {
    		ToUserName = toUserName;
    	}
    
    	public String getFromUserName() {
    		return FromUserName;
    	}
    
    	public void setFromUserName(String fromUserName) {
    		FromUserName = fromUserName;
    	}
    
    	public long getCreateTime() {
    		return CreateTime;
    	}
    
    	public void setCreateTime(long createTime) {
    		CreateTime = createTime;
    	}
    
    	public String getMsgType() {
    		return MsgType;
    	}
    
    	public void setMsgType(String msgType) {
    		MsgType = msgType;
    	}
    
    	public int getFuncFlag() {
    		return FuncFlag;
    	}
    
    	public void setFuncFlag(int funcFlag) {
    		FuncFlag = funcFlag;
    	}
    
    	@Override
    	public String toString() {
    		return "BaseMessage [ToUserName=" + ToUserName + ", FromUserName="
    				+ FromUserName + ", CreateTime=" + CreateTime + ", MsgType="
    				+ MsgType + ", FuncFlag=" + FuncFlag + "]";
    	}
    }
    
    ```
    
    ```
    public class TextMessage extends BaseMessage {
    	/**
    	 * 回复的消息内容
    	 */
    	private String Content;
    
    	public String getContent() {
    		return Content;
    	}
    
    	public void setContent(String content) {
    		Content = content;
    	}
    	@Override
    	public String toString() {
    		// TODO Auto-generated method stub
    		return super.toString()+"[Content:"+this.Content+"]";
    	}
    }
    ```
    
    ```
    public class NewsMessage extends BaseMessage {
    	// 图文消息个数,限制为10条以内
    	private int ArticleCount;
    	// 多条图文消息信息,默认第一个item为大图
    	private List Articles;
    
    	public int getArticleCount() {
    		return ArticleCount;
    	}
    
    	public void setArticleCount(int articleCount) {
    		ArticleCount = articleCount;
    	}
    
    	public List getArticles() {
    		return Articles;
    	}
    
    	public void setArticles(List articles) {
    		Articles = articles;
    	}
    
    	@Override
    	public String toString() {
    		return "NewsMessage [ArticleCount=" + ArticleCount + ", Articles="
    				+ Articles + "]";
    	}
    
    }
    ```
    展开全文
  • 该篇为原创,若转载请麻烦注明CSDN的wjbianjason,
  • 企业微信开发者回调模式 2017-01-23 16:09:39
    企业微信为企业提供了开发自定义应用的能力,为了能够让自定义的应用和企业微信的后台进行双向通信,企业可以在应用的管理...如果你希望像微信公众平台那样需要根据文字、图片或者语音等做出响应,则需要开启回调模式
  • F 修复 标题栏文字过长覆盖胶囊按钮的问题 F 修复 文件系统读取代码包内文件规则与真机不一致的问题 F 修复 关闭多帐号调试窗口 tabbar 内的 icon 无法加载的问题 反馈详情 F 修复 预览上传错误提示无效的 json ...
  • 微信小程序开发者工具0.10.101100版本为当前最新版,包含windows64、windows64、mac三个版本。 更新日志(0.10.101100) 基础功能 A 增加 Android 添加了默认的控件 A 增加 模块化中可使用 exports ...
  • 本次的教程主要是对微信公众平台开发者模式的讲解,网络上很多类似文章,但很多都让初学微信开发的人一头雾水,所以总结自己的微信开发经验,将微信开发的整个过程系统的列出,并对主要代码进行讲解分析,让初学者...
  • 微信公众号的管理有开发模式和编辑模式两种,两者是互斥的。 腾讯是这么讲的: 编辑模式:编辑模式指所有的公众号运营者都可以通过简单的编辑,设置“按关键字回复”等功能。您可以设定常用的文字/语言/图片/...
  • java微信公众号自动回复文字加图片开发流程详细流程,附上代码:第一步服务器(url)接口配置服务器(url)接口配置,此步骤就是微信授权接口的过程,如果域名都不改变,微信只会校验一次。此请求微信文档中说明了是...
  • 本文是 微信公众号开发者模式介绍及接入 的后续,如没看过前文的话,可能看本文会有些懵逼。本文主要介绍微信公众平台的素材、消息管理接口的开发。由于个人的订阅号是没有大多数接口的权限的,所以我们需要使用微信...
  • 微信暗黑模式终于来啦 2019-12-19 00:49:58
    曾经让我们“早点睡”的微信,还是推出了暗黑模式。 早前苹果就告知应用开发者们,督促他们尽快适配,并且给出了期限。 从 2020 年 4 月开始,苹果要求所有新应用和应用更新都需要使用 iOS 13 SDK 构建,并支持 ...
  • 上一篇主要陈述了开发者模式启用以及校验流程,这一篇主要是消息的交互流程。 消息的交互流程 场景:用户给公众号发送消息,用户接收到公众号回复的消息 接收消息:用户给公众号发送消息微信服务器将POST消息的...
  • 1.进入官网注册appId并且下载微信开发者工具 2.进入开发者工具后点击app.json文件,在pages字段下新建页面(此处新建页面会自动生成所需的四种文件,比较方便) 3.在Wechat Development Code目录下新建一个...
  • 通过了上一篇文章之后的微信开发者验证之后,我们就可以做微信公众号的代码开发了。 当我们点击关注某个公众号的时候,有时候会发现他会自动给我们回复一条消息,比如欢迎关注XXX公众号。这个功能其实是在点击关注...
  • 微信小程序开发者工具发布最新版本0.10.101100,增加了video控件,模块化中可使用 exports 对外暴露接口,模块化中 require 可不写 .js 后缀等。 更新日志 基础功能 A 增加 <video/> Android 添加了默认的...
  • 当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐)。...
  • 1.首先的微信公众平台-客服消息-开启消息推送-配置接收消息的接口地址和格式(xml/json) 2.若接收消息地址为:xxx.com/api/kefu 首先需要验证接口地址 //验证服务器地址有效性,验证通过后把代码注销 接着就开始写接口...
  • 1.基础知识在上一篇有讲解和图片,内容大致包括微信开发者模式后台配置、微信公众开发者文档代码详解。2.本篇将粘贴出包括所有类型在内的消息处理办法,在开发者模式下用代码完成所有编辑模式的基础内容。3.本篇代码...
  • 一、微信开发模式 二、自己的服务器和域名 1.可以购买阿里云的服务器和域名。 2.使用内网渗透软件NATAPP把自己的计算机打造成自定义服务器,会自动拥有一个域名。 缺点就是关掉后域名会变化,因为是免费的,...
  • 企业微信开发基本步骤 2019-07-23 22:40:16
    通过config接口注入权限验证配置。查看 2.通过agentConfig注入应用的权限。查看 3.调用审批流程引擎JS-API。查看 步骤一:引入JS文件 在需要调用JS接口的页面引入如下JS文件,(支持https...所有需要使用J...
  • 发送图文的话,要开启客服功能,坑的话就是在通过ticket 上传图片的时候回比较慢  加上划红线的这段代码就行了, 其他没什么了,比较繁琐吧,没有报错,要往文本里写才可以看到报错...
1 2 3 4 5 ... 20
收藏数 3,828
精华内容 1,531