官方指南
https://mp.weixin.qq.com/wiki/1/5dc395cdeb98e9d23a8541cf0bab38ad.html
下载示例代码
https://mp.weixin.qq.com/wiki/static/assets/a5a22f38cb60228cb32ab61d9e4c414b.zip
需要里面的文件
开始之前是建立在服务器接入成功的情况下
微信会把公众号上的信息用post方式提交到设置的url
所以我在servlet里doPost处理请求
doPost方法
protectedvoid doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setCharacterEncoding("UTF-8");//设置编码 try { //签名串 String msgSignature = request.getParameter("msg_signature"); // 时间戳 String timestamp = request.getParameter("timestamp"); // 随机数 String nonce = request.getParameter("nonce");
//接收密文并解密 WXBizMsgCrypt pc = new WXBizMsgCrypt(token, encodingAesKey, appId); String msgData = getMsgData(request); //流数据转成string String resultXml = pc.decryptMsg(msgSignature, timestamp, nonce, msgData); //解密 //dom4j将xml数据转成map SAXReader saxreader = new SAXReader(); Document doc = saxreader.read(new ByteArrayInputStream(resultXml.getBytes("UTF-8"))); Map<String, String> map = new HashMap<String, String>(); Element root = doc.getRootElement(); @SuppressWarnings("unchecked") List<Element> list = root.elements(); for (Element e : list) { map.put(e.getName(), e.getText()); } //加密并发送 // 对消息进行处理 String content = map.get("Content"); // 发送方帐号(一个OpenID) String fromUserName = map.get("FromUserName"); // 开发者微信号 String toUserName = map.get("ToUserName"); // 消息类型 String msgType = map.get("MsgType"); // 默认回复一个"success" String responseMessage = "success"; if ("text".equals(msgType)){//判断文本消息 TextMessage textMessage = new TextMessage();//实体类 textMessage.setMsgType("text"); textMessage.setToUserName(fromUserName); textMessage.setFromUserName(toUserName); textMessage.setCreateTime(System.currentTimeMillis()); textMessage.setContent("你才"+content); responseMessage = WechatMessageUtil.textMessageToXml(textMessage);//将实体转成xml格式 } //加密 String mingwen = pc.encryptMsg(responseMessage, timestamp, nonce); System.out.println("加密后: " + mingwen); //返回信息 PrintWriter out = response.getWriter(); out.print(mingwen); out.flush(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } |
getMsgData()方法获取数据流转成string
//获取xmlStr private String getMsgData(HttpServletRequest reqest) throws Exception { ServletInputStream is = reqest.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); StringBuffer sb = new StringBuffer(); String aa; while ((aa = br.readLine()) != null) { sb.append(aa); } is.close(); br.close(); returnsb.toString(); } |
TextMessage实体
publicclass TextMessage { /** * 开发者微信号 */ private String ToUserName; /** * 发送方帐号(一个OpenID) */ private String FromUserName; /** * 消息创建时间(整型) */ privatelongCreateTime; /** * 消息类型 */ private String MsgType; /** * 消息id,64位整型 */ private String MsgId; /** * 文本消息内容 */ private String Content;
public String getContent() { returnContent; }
publicvoid setContent(String content) { Content = content; } public String getToUserName() { returnToUserName; } publicvoid setToUserName(String toUserName) { ToUserName = toUserName; } public String getFromUserName() { returnFromUserName; } publicvoid setFromUserName(String fromUserName) { FromUserName = fromUserName; } publiclong getCreateTime() { returnCreateTime; } publicvoid setCreateTime(longcreateTime) { CreateTime = createTime; } public String getMsgType() { returnMsgType; } publicvoid setMsgType(String msgType) { MsgType = msgType; } public String getMsgId() { returnMsgId; } publicvoid setMsgId(String msgId) { MsgId = msgId; } } |
WechatMessageUtil工具类
publicclass WechatMessageUtil { /** * 文本消息转化为xml * * @param textMessage * @return */ publicstatic String textMessageToXml(TextMessage textMessage) { XStream xstream = new XStream(); xstream.alias("xml", textMessage.getClass()); returnxstream.toXML(textMessage); } } |