JAVA微信公众号输入选择回复文本或者图文,列输入1回复一图文或者文本

先写一个servlet接口,传入选择1,2.... 

package com.wx.service;

import java.io.IOException;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import com.bochiot.amain.HttpGyRentUserService;
import com.bochiot.amain.StringConst;
import com.bochiot.znys.config.ENUM_BOZHI_RESULT;
import com.project.util.L;
import com.wx.message.resp.Article;
import com.wx.util.MessageUtil;
import com.wx.util.WeixinMessageUtil;

import net.sf.json.JSONObject;

/**
 * 处理微信的操作
 * 
 * 
 * @author Administrator
 *
 */
public class WeixinService {
	
	public static String TAG = "WeixinService";
	
	
	/**
	 * 处理微信发来的请求
	 * 
	 * @param request
	 * @return
	 * @throws Exception
	 */
	public static String processRequest(HttpServletRequest request) throws Exception {
		L.i(TAG, "processRequest ");  // 默认返回的文本消息内容	

		// xml请求解析
		Map<String, String> requestMap = MessageUtil.parseXml(request);
			
		// 发送方帐号(open_id)
		String fromUserName = requestMap.get("FromUserName");
		// 公众帐号
		String toUserName = requestMap.get("ToUserName");
		// 消息类型
		String msgType = requestMap.get("MsgType");
		
	
		try {
			L.i(TAG, "FromUserName: " + fromUserName + "   toUserName: " + toUserName + "    msgType: " + msgType);
			
			// 文本消息
			if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {
				String content = requestMap.get("Content").trim();
				if(Integer.valueOf(content)==1) {
//				return doTextMessage(fromUserName, toUserName, content);
				return WeixinMessageUtil.createTextMessage(fromUserName, toUserName,
						StringConst.WEIXIN_TEXT_BLACKLIST_DEFALUT);				
				}else if(Integer.valueOf(content)==2) {
					return WeixinMessageUtil.createTextMessage(fromUserName, toUserName,
							StringConst.WEIXIN_NEWS_QUERY_ORDER_TITLE);		
				}else if(Integer.valueOf(content)==3) {
					Article article=WeixinMessageUtil.createArticle("铂智科技有限公司","铂智宣传视频","http://nhbtek.com/bzser/assets/images/logo.png","http://nhbtek.com/bzser/assets/images/videobochiot.mp4");
					List<Article> list=WeixinMessageUtil.createArticleList(article);
					return WeixinMessageUtil.createNewsMessage(fromUserName, toUserName, list);
				}
			}
			// 图片消息
			else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) {
				return WeixinMessageUtil.createTextMessage(fromUserName, toUserName,
						StringConst.WEIXIN_TEXT_IMAGE_DEFALUT);
			}
			// 地理位置消息
			else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LOCATION)) {
				return WeixinMessageUtil.createTextMessage(fromUserName, toUserName,
						StringConst.WEIXIN_TEXT_LOCATION_DEFALUT);
			}
			// 链接消息
			else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_LINK)) {
				return WeixinMessageUtil.createTextMessage(fromUserName, toUserName,
						StringConst.WEIXIN_TEXT_LINK_DEFALUT);
			}
			// 音频消息
			else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_VOICE)) {
				return WeixinMessageUtil.createTextMessage(fromUserName, toUserName,
						StringConst.WEIXIN_TEXT_VOICE_DEFALUT);
			}
			
			// 事件推送
			else if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_EVENT)) {					
				
				// 事件类型
				String eventType = requestMap.get("Event");
				System.out.println(" eventType = "+ eventType);
				for(String s:requestMap.keySet()){
					System.out.println( s + ":" + requestMap.get(s));
				}
								
				System.out.println(" KeyStandard = "+ requestMap.get("KeyStandard"));
				System.out.println(" KeyStr = "+ requestMap.get("KeyStr"));
				System.out.println(" ExtInfo = "+ requestMap.get("ExtInfo"));
				System.out.println(" EventKey = "+ requestMap.get("EventKey"));
								
				
				// 订阅  关注 
				if (eventType.equals(MessageUtil.EVENT_TYPE_SUBSCRIBE)) {
					//添加 微信信息 									
					return WeixinMessageUtil.createTextMessage(fromUserName, toUserName,
							StringConst.WEIXIN_TEXT_EVENT_SUBSCRIBE);										
				}
				
				// 取消订阅
				else if (eventType.equals(MessageUtil.EVENT_TYPE_UNSUBSCRIBE)) {
					// TODO 取消订阅后用户再收不到公众号发送的消息,因此不需要回复消息					
				}
								
				// 扫描   事件 我们的前台业务申请和微信开门都是通过SCAN事件完成的
				else if (eventType.equals(MessageUtil.EVENT_TYPE_SCAN2)) { 
					String eventKey = requestMap.get("EventKey");
					System.out.println("扫描 EventKey"+ eventKey);
					if(eventKey==null){
//						eventKey = "123456790";  //测试 1001						
					}else{
						return doScan(fromUserName, toUserName, eventKey);
					}			

				} else if (eventType.equals(MessageUtil.EVENT_TYPE_Shake)) {
					// 摇一摇

				}
				// 自定义菜单点击事件
				else if (eventType.equalsIgnoreCase(MessageUtil.EVENT_TYPE_CLICK)) {
					String eventKey = requestMap.get("EventKey");
					
					return doClick(fromUserName, toUserName, eventKey);

				}
			}

		} catch (Exception e) {
			return WeixinMessageUtil.createTextMessage(fromUserName, toUserName, StringConst.WEIXIN_TEXT_ERR_DEFALUT);
		}
		// 回复文本
		return WeixinMessageUtil.createTextMessage(fromUserName, toUserName, StringConst.WEIXIN_TEXT_DEFAULT);
	}//..
	
	

	//扫描事件  
	public static String doScan(String fromUserName, String toUserName, String eventKey) throws IOException {
	     L.i(TAG, "zc scan eventKey="+ eventKey);	     
	     //123456790	     
	     Integer iEventKey = 0;	    	
	     try {
	    	 iEventKey = Integer.valueOf(eventKey);
		} catch (Exception e) {
			iEventKey = 10;
		}	
		String response = "";
				
		
		long startTime = System.currentTimeMillis();
		//扫一扫开门
		JSONObject jsonObject = HttpGyRentUserService.sendCmd_OPEN_SCAN( eventKey, fromUserName);
		ENUM_BOZHI_RESULT respCode = ENUM_BOZHI_RESULT.getCODE(jsonObject.getInt("code"));		
				
		if (respCode == ENUM_BOZHI_RESULT.MSG_SUCCESS) {		
			
			JSONObject data = jsonObject.getJSONObject("data");
			int room_number = 0;
			try {
				room_number = data.getInt("room_number");
			} catch (Exception e) {
				e.printStackTrace();
			}			
			response = String.format(StringConst.WEIXIN_TEXT_OPENDOOR_SCAN_SUCCESSED, room_number);			
		} else {
			response = String.format(StringConst.WEIXIN_TEXT_OPENDOOR_SCAN_FAILED, eventKey,
					jsonObject.get("message")   );
		}
		L.i(TAG, "saomiao opendoor use time : " + (System.currentTimeMillis() - startTime) + "  ms");
							
		
		/*	
		// 微信开门业务申请的scene_id是由32位的int组成,高16位是房间号,低16位是手机的CRC16值,由临时二维码生成的。
		
		if (iEventKey > 100000) {
			int iRoomNumber = 0;
			iRoomNumber = iEventKey / 65536;

			ENUM_BOZHI_RESULT respCode = bindRoom(iEventKey, fromUserName);
			if (respCode == ENUM_BOZHI_RESULT.MSG_SUCCESS) {
				response = String.format(StringConst.WEIXIN_TEXT_BINDROOM_SCAN_SUCCESSED, iRoomNumber);
			} else {
				response = String.format(StringConst.WEIXIN_TEXT_BINDROOM_SCAN_FAIL, iRoomNumber,
						ENUM_BOZHI_RESULT.getStatusString(respCode, "", ""));
			}
		}//..
		
		
		// 微信开门动作的scene_id是四位长度的数字,格式如下:XXXX,是永久二维码生成的。
		else if (iEventKey <= 100000) {

			if (iEventKey == 3) {
				// 关注
				response = "欢迎回来~";
			} else if (iEventKey == 1) {
				// 餐券管理员登记
				MainConst.couponManagerOpenID = fromUserName;
				MainConst.couponManager_KFSendMSG_Num = 0;
				response = StringConst.WEIXIN_TEXT_COUPON_MANAGER_SUCCESSED;
			} else if (iEventKey == 2) {// 餐券扫一扫
				response = useCoupon(fromUserName);				
				
		    //开门 
			} else {
				long startTime = System.currentTimeMillis();

//				JSONObject jsonObject = HttpBC_ZNYS_Service.sendCmd_OPEN_SCAN( iEventKey, fromUserName);
				JSONObject jsonObject = HttpBC_ZNYS_Service.sendCmd_OPEN_SCAN( eventKey, fromUserName);
				
				int room_number = 0;
				try {
					room_number = jsonObject.getInt("room_number");
				} catch (Exception e) {
					// TODO: handle exception
				}

				ENUM_BOZHI_RESULT respCode = ENUM_BOZHI_RESULT.getCODE(jsonObject.getInt("code"));
				;

				if (respCode == ENUM_BOZHI_RESULT.MSG_SUCCESS
						|| respCode == ENUM_BOZHI_RESULT.MSG_ERR_NETWORK_TIMEOUT) {
					response = String.format(StringConst.WEIXIN_TEXT_OPENDOOR_SCAN_SUCCESSED, room_number);
				} else {
					response = String.format(StringConst.WEIXIN_TEXT_OPENDOOR_SCAN_FAILED, room_number,
							ENUM_BOZHI_RESULT.getStatusString(respCode, "", ""));

				}
				L.i(TAG, "saomiao opendoor use time : " + (System.currentTimeMillis() - startTime) + "  ms");
			}
			
			
			
			

		} else {
			response = StringConst.WEIXIN_TEXT_EVENT_SCAN_DEFALUT;
		}
		
		*/		
		
		return WeixinMessageUtil.createTextMessage(fromUserName, toUserName, response);
	}
	

	public static String doClick(String fromUserName, String toUserName, String eventKey) throws IOException {
		 L.i(TAG, "doClick "+ eventKey);	  
		 
		// 处理用户菜单开门命令
		String response = "";
		
		if (eventKey.equals("35")) {   //一键开门 			
			System.out.println("点击了  一键开门  fromUserName=" + fromUserName);
			
//			JSONObject jsonObject = HttpGyRentUserService.sendCmd_OPEN_ONE(  fromUserName);			
//			ENUM_BOZHI_RESULT respCode = ENUM_BOZHI_RESULT.getCODE(jsonObject.getInt("code"));
//
//			if (respCode == ENUM_BOZHI_RESULT.MSG_SUCCESS ) {
//				int roomNo = jsonObject.getInt("data");		
//				System.out.println("一键开门成功  roomNo" + roomNo);
//				response = String.format(StringConst.WEIXIN_TEXT_OPENDOOR_TEXT_SUCCESSED, roomNo) ;
//				
//			} else {
//				String errorMsg = jsonObject.getString("message");
//				response = String.format(StringConst.WEIXIN_TEXT_OPENDOOR_MENU_FAILED, errorMsg);
//			}			
		
		} else if (eventKey.equals("22")) {
			 response = "谢谢你的支持,这是测试菜单";		
			 return response;			
							
		} else {
			response = StringConst.WEIXIN_TEXT_EVENT_CLICK_DEFALUT;

		}
		return WeixinMessageUtil.createTextMessage(fromUserName, toUserName, response);

	}

	

	


}//end 

1.重点代码,传入文本,我这边用枚举的文本,和图文自己定义 

 

// 文本消息
			if (msgType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) {
				String content = requestMap.get("Content").trim();
				if(Integer.valueOf(content)==1) {
//				return doTextMessage(fromUserName, toUserName, content);
				return WeixinMessageUtil.createTextMessage(fromUserName, toUserName,
						StringConst.WEIXIN_TEXT_BLACKLIST_DEFALUT);				
				}else if(Integer.valueOf(content)==2) {
					return WeixinMessageUtil.createTextMessage(fromUserName, toUserName,
							StringConst.WEIXIN_NEWS_QUERY_ORDER_TITLE);		
				}else if(Integer.valueOf(content)==3) {
					Article article=WeixinMessageUtil.createArticle("铂智科技有限公司","铂智宣传视频","http://nhbtek.com/bzser/assets/images/logo.png","http://nhbtek.com/bzser/assets/images/videobochiot.mp4");
					List<Article> list=WeixinMessageUtil.createArticleList(article);
					return WeixinMessageUtil.createNewsMessage(fromUserName, toUserName, list);

 

调用的创建文本或者图文的

package com.wx.util;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import com.wx.message.resp.Article;
import com.wx.message.resp.NewsMessage;
import com.wx.message.resp.TextMessage;





public class WeixinMessageUtil {

	public static String createNewsMessage(String fromUserName, String toUserName, List<Article> articles) {
		NewsMessage newsMessage = new NewsMessage();
		newsMessage.setToUserName(fromUserName);
		newsMessage.setFromUserName(toUserName);
		newsMessage.setCreateTime(new Date().getTime());
		newsMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_NEWS );

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

		return MessageUtil.newsMessageToXml(newsMessage);
	}

	public static List<Article> createArticleList(Article... articles) {
		List<Article> articleList = new ArrayList<Article>();

		for (Article article : articles) {
			articleList.add(article);
		}
		return articleList;

	}

	public static Article createArticle(String title, String des, String picUrl, String url) {
		Article article = new Article();
		article.setTitle(title);
		article.setDescription(des);

		article.setPicUrl(picUrl);
		article.setUrl(url);

		return article;
	}
	
	public static Article createArticle1(String title, String des,String picUrl) {
		Article article = new Article();
		article.setTitle(title);
		article.setDescription(des);
		article.setPicUrl(picUrl);

		return article;
	}

	
	public static String createTextMessage(String fromUserName,String toUserName,String respContent){
		 TextMessage textMessage = new TextMessage();  
         textMessage.setToUserName(fromUserName);  
         textMessage.setFromUserName(toUserName);  
         textMessage.setCreateTime(new Date().getTime());  
         textMessage.setMsgType(MessageUtil.RESP_MESSAGE_TYPE_TEXT);  
         textMessage.setContent(respContent);  
         return MessageUtil.textMessageToXml(textMessage);  
	}
	
	
	
	
}

 实体类

package com.wx.message.resp;
import java.util.List; 

/** 
 * 文本消息 
 *  
 * @author liufeng 
 * @date 2013-05-19 
 */  
public class NewsMessage extends BaseMessage {  
    // 图文消息个数,限制为10条以内  
    private int ArticleCount;  
    // 多条图文消息信息,默认第一个item为大图  
    private List<Article> Articles;  

  
    public int getArticleCount() {  
        return ArticleCount;  
    }  
  
    public void setArticleCount(int articleCount) {  
        ArticleCount = articleCount;  
    }  
  
    public List<Article> getArticles() {  
        return Articles;  
    }  
  
    public void setArticles(List<Article> articles) {  
        Articles = articles;  
    }  
}  
public class Article {  
	
    // 图文消息名称  
    private String Title;  
    // 图文消息描述  
    private String Description;  
    // 图片链接,支持JPG、PNG格式,较好的效果为大图640*320,小图80*80,限制图片链接的域名需要与开发者填写的基本资料中的Url一致  
    private String PicUrl;  
    // 点击图文消息跳转链接  
    private String Url;  
  
    public String getTitle() {  
        return Title;  
    }  
  
    public void setTitle(String title) {  
        Title = title;  
    }  
  
    public String getDescription() {  
        return null == Description ? "" : Description;  
    }  
  
    public void setDescription(String description) {  
        Description = description;  
    }  
  
    public String getPicUrl() {  
        return null == PicUrl ? "" : PicUrl;  
    }  
  
    public void setPicUrl(String picUrl) {  
        PicUrl = picUrl;  
    }  
  
    public String getUrl() {  
        return null == Url ? "" : Url;  
    }  
  
    public void setUrl(String url) {  
        Url = url;  
    }  
  
}  

 转成xml

public class MessageUtil {  
  
    /** 
     * 返回消息类型:文本 
     */  
    public static final String RESP_MESSAGE_TYPE_TEXT = "text";  
  
    /** 
     * 返回消息类型:音乐 
     */  
    public static final String RESP_MESSAGE_TYPE_MUSIC = "music";  
  
    /** 
     * 返回消息类型:图文 
     */  
    public static final String RESP_MESSAGE_TYPE_NEWS = "news";  
  
    /** 
     * 请求消息类型:文本 
     */  
    public static final String REQ_MESSAGE_TYPE_TEXT = "text";  
  
    /** 
     * 请求消息类型:图片 
     */  
    public static final String REQ_MESSAGE_TYPE_IMAGE = "image";  
  
    /** 
     * 请求消息类型:链接 
     */  
    public static final String REQ_MESSAGE_TYPE_LINK = "link";  
  
    /** 
     * 请求消息类型:地理位置 
     */  
    public static final String REQ_MESSAGE_TYPE_LOCATION = "location";  
  
    /** 
     * 请求消息类型:音频 
     */  
    public static final String REQ_MESSAGE_TYPE_VOICE = "voice";  
  
    /** 
     * 请求消息类型:推送 
     */  
    public static final String REQ_MESSAGE_TYPE_EVENT = "event";  
  
    /** 
     * 事件类型:subscribe(订阅) 
     */  
    public static final String EVENT_TYPE_SUBSCRIBE = "subscribe";  
  
    /** 
     * 事件类型:unsubscribe(取消订阅) 
     */  
    public static final String EVENT_TYPE_UNSUBSCRIBE = "unsubscribe";  
  
    /** 
     * 事件类型:CLICK(自定义菜单点击事件) 
     */  
    public static final String EVENT_TYPE_CLICK = "CLICK";  
    
    /** 
     * 事件类型:SCAN(扫一扫事件) 
     */  
    public static final String EVENT_TYPE_SCAN = "SCAN"; 
    public static final String EVENT_TYPE_SCAN2 = "scancode_push"; 
    
    
    /** 
     * 事件类型:Shake(摇一摇事件) 
     */  
    public static final String EVENT_TYPE_Shake = "ShakearoundUserShake";  
  
  
    /** 
     * 解析微信发来的请求(XML) 
     *  
     * @param request 
     * @return 
     * @throws Exception 
     */  
    @SuppressWarnings("unchecked")  
    public static Map<String, String> parseXml(HttpServletRequest request) throws Exception {  
        // 将解析结果存储在HashMap中  
        Map<String, String> map = new HashMap<String, String>();  
  
        // 从request中取得输入流  
        InputStream inputStream = request.getInputStream();  
        // 读取输入流  
        SAXReader reader = new SAXReader();  
        Document document = reader.read(inputStream);  
        // 得到xml根元素  
        Element root = document.getRootElement();  
        // 得到根元素的所有子节点  
        List<Element> 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块 
     *  
     * @date 2013-05-19 
     */  
    private static XStream xstream = new XStream(new XppDriver() {  
        public HierarchicalStreamWriter createWriter(Writer out) {  
            return new PrettyPrintWriter(out) {  
                // 对所有xml节点的转换都增加CDATA标记  
                boolean cdata = true;  
  
                @SuppressWarnings("unchecked")  
                public void startNode(String name, Class clazz) {  
                    super.startNode(name, clazz);  
                }  
  
                protected void writeText(QuickWriter writer, String text) {  
                    if (cdata) {  
                        writer.write("<![CDATA[");  
                        writer.write(text);  
                        writer.write("]]>");  
                    } else {  
                        writer.write(text);  
                    }  
                }  
            };  
        }  
    });  
}  

 

这样就ok了

 

posted @   码海兴辰  阅读(169)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
点击右上角即可分享
微信分享提示