JAVA微信公眾號輸入選擇回覆文字或者圖文,列輸入1回覆一圖文或者文字

李日興發表於2019-03-07

先寫一個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了

 

相關文章