WeChat 개발에 대한 이전 블로그 게시물(01) 개발자가 되는 방법에서는 WeChat 개발자 모드를 활성화했습니다. 이번 블로그 게시물에서는 WeChat 팔로워들이 공식 계정으로 보낸 메시지를 간단히 처리합니다.
WeChat 개발자 모드를 켤 때 URL 주소를 구성했습니다. WeChat 개발자 모드를 켜기 위해 제출하면 Tencent의 WeChat 서버가 URL 주소로 가져오기 요청을 보내고 몇 가지 매개변수를 전달합니다. . 요청을 받을 때 게시물 요청에 대해 이야기해야 합니다. 공식 계정을 팔로우하는 WeChat 팬이 보낸 메시지에 대해 Tencent의 WeChat 서버는 URL 주소로 게시물 요청을 보내며 요청 내용은 다음과 같습니다. 양식의 xml 문서입니다.
따라서 이 URL 주소의 가져오기 요청 처리 방법은 WeChat 개발자 모드를 활성화하는 데 특별히 사용되는 반면 게시물 요청은 WeChat 팬이 우리에게 보낸 메시지 또는 트리거된 이벤트를 처리하는 데 사용됩니다. 그래서 나중에 우리가 할 일은 WeChat 개발 작업의 출발점은 URL 주소의 후처리 방법입니다.
아래에서 가장 간단한 예를 살펴보겠습니다. 팬들이 우리에게 문자 메시지를 보내면 우리는 "안녕하세요, + 그의 WeChat openId"라는 메시지로 답장합니다.
코드 바로 아래에 게시하세요.
URL 해당 처리 서블릿:
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(); // 请求校验,若校验成功则原样返回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 signature = request.getParameter("signature"); String timestamp = request.getParameter("timestamp"); String nonce = request.getParameter("nonce"); PrintWriter out = response.getWriter(); // 请求校验 if (SignUtil.checkSignature(signature, timestamp, nonce)) { Message msgObj = XMLUtil.getMessageObject(request); // 读取微信客户端发来的消息(xml字符串),并将其转换为消息对象 if(msgObj != null){ String xml = "<xml>" + "<ToUserName><![CDATA[" + msgObj.getFromUserName() + "]]></ToUserName>" + // 接收方帐号(收到的OpenID) "<FromUserName><![CDATA[" + msgObj.getToUserName() + "]]></FromUserName>" + // 开发者微信号 "<CreateTime>12345678</CreateTime>" + "<MsgType><![CDATA[text]]></MsgType>" + "<Content><![CDATA[你好,"+ msgObj.getFromUserName() +"]]></Content>" + "</xml>"; out.write(xml); // 回复微信客户端的消息(xml字符串) out.close(); return; } } out.write(""); out.close(); } }
xml 메시지를 메시지 객체로 변환하는 xml 문자열 처리 도구 클래스:
public class XMLUtil { /** * 从request中读取用户发给公众号的消息内容 * @param request * @return 用户发给公众号的消息内容 * @throws IOException */ public static String readRequestContent(HttpServletRequest request) throws IOException { // 从输入流读取返回内容 InputStream inputStream = request.getInputStream(); InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); BufferedReader bufferedReader = new BufferedReader(inputStreamReader); String str = null; StringBuilder buffer = new StringBuilder(); while ((str = bufferedReader.readLine()) != null) { buffer.append(str); } // 释放资源 bufferedReader.close(); inputStreamReader.close(); inputStream.close(); return buffer.toString(); } /** * 将xml文档的内容转换成map * @param xmlDoc * @return map */ public static Map<String, String> xmlToMap(String xmlDoc) { //创建一个新的字符串 StringReader read = new StringReader(xmlDoc); //创建新的输入源SAX 解析器将使用 InputSource 对象来确定如何读取 XML 输入 InputSource source = new InputSource(read); //创建一个新的SAXBuilder SAXBuilder sb = new SAXBuilder(); Map<String, String> xmlMap = new HashMap<String, String>(); try { Document doc = sb.build(source); //通过输入源构造一个Document Element root = doc.getRootElement(); //取的根元素 List<Element> cNodes = root.getChildren(); //得到根元素所有子元素的集合(根元素的子节点,不包括孙子节点) Element et = null; for(int i=0;i<cNodes.size();i++){ et = (Element) cNodes.get(i); //循环依次得到子元素 xmlMap.put(et.getName(), et.getText()); } } catch (JDOMException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return xmlMap; } /** * 将保存xml内容的map转换成对象 * @param map * @return */ public static Message getMessageObject(Map<String, String> map) { if(map != null){ String MsgType = map.get("MsgType"); // 消息类型(文本消息:text, 图片消息:image, 语音消息:voice, 视频消息:video, // 地理位置消息:location, 链接消息:link) if("text".equals(MsgType)){ TextMessage msg = new TextMessage(); XMLUtil.initCommonMsg(msg, map); msg.setContent(map.get("Content")); return msg; } if("ImageMessage".equals(MsgType)){ ImageMessage msg = new ImageMessage(); XMLUtil.initCommonMsg(msg, map); msg.setPicUrl(map.get("PicUrl")); msg.setMediaId(map.get("MediaId")); return msg; } if("video".equals(MsgType)){ VideoMessage msg = new VideoMessage(); XMLUtil.initCommonMsg(msg, map); msg.setMediaId(map.get("MediaId")); msg.setThumbMediaId(map.get("ThumbMediaId")); return msg; } if("voice".equals(MsgType)){ VoiceMessage msg = new VoiceMessage(); XMLUtil.initCommonMsg(msg, map); msg.setMediaId(map.get("MediaId")); msg.setFormat(map.get("Format")); return msg; } if("location".equals(MsgType)){ LocationMessage msg = new LocationMessage(); msg.setLocation_X(map.get("Location_X")); msg.setLocation_Y(map.get("Location_Y")); msg.setScale(map.get("Scale")); msg.setLabel(map.get("Label")); return msg; } if("link".equals(MsgType)){ LinkMessage msg = new LinkMessage(); XMLUtil.initCommonMsg(msg, map); msg.setTitle(map.get("Title")); msg.setDescription(map.get("Description")); msg.setUrl(map.get("Url")); return msg; } } return null; } /** * 将保存xml内容的map转换成对象 * @param map * @return * @throws IOException */ public static Message getMessageObject(HttpServletRequest request) throws IOException { String xmlDoc = XMLUtil.readRequestContent(request); // 读取微信客户端发了的消息(xml) Map<String, String> map = XMLUtil.xmlToMap(xmlDoc); // 将客户端发来的xml转换成Map if(map != null){ String MsgType = map.get("MsgType"); // 消息类型(文本消息:text, 图片消息:image, 语音消息:voice, 视频消息:video, // 地理位置消息:location, 链接消息:link) if("text".equals(MsgType)){ TextMessage msg = new TextMessage(); XMLUtil.initCommonMsg(msg, map); msg.setContent(map.get("Content")); return msg; } /*if("ImageMessage".equals(MsgType)){ ImageMessage msg = new ImageMessage(); XMLUtil.initCommonMsg(msg, map); msg.setPicUrl(map.get("PicUrl")); msg.setMediaId(map.get("MediaId")); return msg; } if("video".equals(MsgType)){ VideoMessage msg = new VideoMessage(); XMLUtil.initCommonMsg(msg, map); msg.setMediaId(map.get("MediaId")); msg.setThumbMediaId(map.get("ThumbMediaId")); return msg; } if("voice".equals(MsgType)){ VoiceMessage msg = new VoiceMessage(); XMLUtil.initCommonMsg(msg, map); msg.setMediaId(map.get("MediaId")); msg.setFormat(map.get("Format")); return msg; } if("location".equals(MsgType)){ LocationMessage msg = new LocationMessage(); msg.setLocation_X(map.get("Location_X")); msg.setLocation_Y(map.get("Location_Y")); msg.setScale(map.get("Scale")); msg.setLabel(map.get("Label")); return msg; } if("link".equals(MsgType)){ LinkMessage msg = new LinkMessage(); XMLUtil.initCommonMsg(msg, map); msg.setTitle(map.get("Title")); msg.setDescription(map.get("Description")); msg.setUrl(map.get("Url")); return msg; }*/ } return null; } public static void initCommonMsg(Message msg, Map<String, String> map) { msg.setMsgId(map.get("MsgId")); msg.setMsgType(map.get("MsgType")); msg.setToUserName(map.get("ToUserName")); msg.setFromUserName(map.get("FromUserName")); msg.setCreateTime(map.get("CreateTime")); } }
팬이 보내는 메시지는 6가지 유형(문자 메시지, 사진 메시지, 음성 메시지, 영상 메시지, 지리적 위치 메시지, 링크 메시지)으로 분류됩니다.
/** * 微信消息基类 * @author yuanfang * @date 2015-03-23 */ public class Message { private String MsgId; // 消息id,64位整型 private String MsgType; // 消息类型(文本消息:text, 图片消息:image, 语音消息:voice, 视频消息:video, 地理位置消息:location, 链接消息:link) private String ToUserName; //开发者微信号 private String FromUserName; // 发送方帐号(一个OpenID) private String CreateTime; // 消息创建时间 (整型) 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 String getCreateTime() { return CreateTime; } public void setCreateTime(String createTime) { CreateTime = createTime; } public String getMsgType() { return MsgType; } public void setMsgType(String msgType) { MsgType = msgType; } public String getMsgId() { return MsgId; } public void setMsgId(String msgId) { MsgId = msgId; } }
문자 메시지 유형:
package com.sinaapp.wx.msg; public class TextMessage extends Message { private String Content; // 文本消息内容 public String getContent() { return Content; } public void setContent(String content) { Content = content; } }
좋아요, 팬을 위해 공개적으로 보냅니다. 가장 간단한 처리 계정의 문자 메시지가 완료되면 다음과 같이 답장을 보냅니다. 그런 다음 Hello, 또는Jydljfkg3-r0_dj3rkdfvjl
와 유사한 WeChat openId를 추가합니다. WeChat 개발 더보기 WeChat에서 보낸 메시지 처리와 관련된 기사 고객 여러분, PHP 중국어 웹사이트를 주목해 주세요!