前言:
由於在上篇文章中Servelt的Post方法中處理太多的邏輯,會讓代碼很難看,所以我們在這里進行補充,修改Servlet中的Post方法。
/** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding("UTF-8"); String xmlString=WeixinService.doService(request); PrintWriter out=response.getWriter(); out.print(xmlString); out.close(); }
創建WeixinService.java 代碼如下:
package com.weixin.Service; import java.io.IOException; import java.io.PrintWriter; import java.util.Date; import java.util.Map; import javax.servlet.http.HttpServletRequest; import com.weixin.message.TextMessage; import com.weixin.util.MessageUtil; /** * 消息處理類 * * @author Code猿猿 * */ public class WeixinService { public static String doService(HttpServletRequest request) { Map<String, String> message = MessageUtil.parseXml(request); String messageType = message.get("MsgType"); // 要返回的xml信息 String xml = ""; //文本消息 if (messageType.equals(MessageUtil.REQ_MESSAGE_TYPE_TEXT)) { // 接收的是文本消息 // 打印接收所有參數 System.out.println("ToUserName:" + message.get("ToUserName")); System.out.println("FromUserName:" + message.get("FromUserName")); System.out.println("CreateTime:" + message.get("CreateTime")); System.out.println("MsgType:" + message.get("MsgType")); System.out.println("Content:" + message.get("Content")); System.out.println("MsgId:" + message.get("MsgId")); String req_content = message.get("Content"); String res_content = ""; // 組裝回復消息 // 我們做個小實驗 // 接收內容:你好 回復:你好 // 接收內容:大家好 回復:大家好 // 接收內容:同志們好 回復:為人民服務 if ("你好".equals(req_content)) { res_content = "你好"; } else if ("大家好".equals(req_content)) { res_content = "大家好"; } else if ("同志們好".equals(req_content)) { res_content = "為人民服務"; } else { // 否則原樣輸出輸入內容 res_content = req_content; } TextMessage textMessage = new TextMessage(); textMessage.setToUserName(message.get("FromUserName")); textMessage.setFromUserName(message.get("ToUserName")); textMessage.setCreateTime(new Date().getTime()); textMessage.setContent(res_content); textMessage.setMsgType(messageType); xml = MessageUtil.textMessageToXml(textMessage); } return xml; } }
一、消息格式
<xml> <ToUserName><![CDATA[toUser]]></ToUserName> <FromUserName><![CDATA[fromUser]]></FromUserName> <CreateTime>1348831860</CreateTime> <MsgType><![CDATA[image]]></MsgType> <PicUrl><![CDATA[this is a url]]></PicUrl> <MediaId><![CDATA[media_id]]></MediaId> <MsgId>1234567890123456</MsgId> </xml>
參數 | 描述 |
---|---|
ToUserName | 開發者微信號 |
FromUserName | 發送方帳號(一個OpenID) |
CreateTime | 消息創建時間 (整型) |
MsgType | image |
PicUrl | 圖片鏈接(由系統生成) |
MediaId | 圖片消息媒體id,可以調用多媒體文件下載接口拉取數據。 |
MsgId | 消息id,64位整型 |
二、添加圖片消息的實體類 PicMessage.java 代碼如下:
package com.weixin.message; public class PicMessage extends BaseMessage { public String PicUrl ; public long MediaId ; public long MsgId; public String getPicUrl() { return PicUrl; } public void setPicUrl(String picUrl) { PicUrl = picUrl; } public long getMediaId() { return MediaId; } public void setMediaId(long mediaId) { MediaId = mediaId; } public long getMsgId() { return MsgId; } public void setMsgId(long msgId) { MsgId = msgId; } }
三、接收圖片消息,返回"圖片消息" 在WeixinService.java中添加 image消息的判斷 ,代碼如下:
//圖片消息 if (messageType.equals(MessageUtil.REQ_MESSAGE_TYPE_IMAGE)) { // 打印接收所有參數 System.out.println("ToUserName:" + message.get("ToUserName")); System.out.println("FromUserName:" + message.get("FromUserName")); System.out.println("CreateTime:" + message.get("CreateTime")); System.out.println("MsgType:" + message.get("MsgType")); System.out.println("PicUrl:" + message.get("PicUrl")); System.out.println("MediaId:" + message.get("MediaId")); System.out.println("MsgId:" + message.get("MsgId")); TextMessage textMessage = new TextMessage(); textMessage.setToUserName(message.get("FromUserName")); textMessage.setFromUserName(message.get("ToUserName")); textMessage.setCreateTime(new Date().getTime()); textMessage.setContent("這是圖片消息"); textMessage.setMsgType("text"); //文本消息 xml = MessageUtil.textMessageToXml(textMessage); System.out.println("xml:"+xml); }
公眾號接收到的參數和提交的xml如下:
ToUserName:gh_525b860fccf8 FromUserName:oXWYmsyz4fv17mCihzDFzk_ecLFU CreateTime:1462702256 MsgType:image PicUrl:http://mmbiz.qpic.cn/mmbiz/ShBfPMFvXqibLR34lgoWRojdyTtzMR5LbdL8FuntiaEiawZFSdjJHuibm5RlLpS3nBOq9IblZr8ia19h2UgnlIrn1SQ/0 MediaId:tgC85iSOqZN8kG7hxnHzxRPvWlkIHk8fTTfge-CqrwtuyNKEBJ_uKWaE4f4IrqRo MsgId:6282258353751424316 回復xml信息: <xml> <ToUserName><![CDATA[oXWYmsyz4fv17mCihzDFzk_ecLFU]]></ToUserName> <FromUserName><![CDATA[gh_525b860fccf8]]></FromUserName> <CreateTime>1462702260068</CreateTime> <MsgType><![CDATA[text]]></MsgType> <Content><![CDATA[這是圖片消息]]></Content> <MsgId>0</MsgId> </xml>
測試結果如下圖: