201.微信公众号开发【文本消息】

因为微信消息之间传递使用的是xml,对我们来说不大方便,我们需要创建一个Message工具将它转成Map形式(接受到数据转成Map,发送数据时再转成xml)

  1. 将xml 转Map(用到dom4j架包)

//xml转成Map

    public static Map<String,String> xmlToMap(HttpServletRequest request){

       Map<String, String> map = new HashMap<String, String>();

       SAXReader reader = new SAXReader();

       try {

           //获取request输入流

           InputStream is = request.getInputStream();

           //从输入流中读取到整个文档

           Document doc  = reader.read(is);

           //从文档中获取根节点

           Element  root = doc.getRootElement();

           //获取跟节点下面的所有节点

           List<Element> list  =  root.elements();

           //遍历List放入Map集合

           for(Element e:list){

              map.put(e.getName(), e.getText());

           }

           is.close();

       } catch (IOException e) {

           e.printStackTrace();

       } catch (DocumentException e) {

           e.printStackTrace();

       }

       return map;

   }

  1. 将对象转成xml文件(用到xstream架包)【特别注意:微信需求的xml区分大小写】

//将对象类型转成xml

    public static String textMessageToXml(TextMessage textMessage){

       XStream xStream = new XStream();

       xStream.alias("xml", textMessage.getClass());//作用是将xml根元素改成xml

       return xStream.toXML(textMessage);

}

 

然后根据xml内容创建一个文本对象(TextMessage) 设置好SET和GET方法

public class TextMessage {//由于xml区分大小写,所以这里创建属性的时候首字母也大写

    private String ToUserName;

    private String FromUserName;

    private Long CreateTime;

    private String MsgType;

    private String Content;

private String MsgId;

}

在开发模式下实现数据的接收和响应(在doPost中进行接收和响应)

protected void doPost(HttpServletRequest request, HttpServletResponse response)

           throws ServletException, IOException {

       request.setCharacterEncoding("UTF-8");

       response.setCharacterEncoding("UTF-8");

       PrintWriter out  = response.getWriter();//

      

       Map<String,String> map = MessageUtil.xmlToMap(request);

       String fromUserName = map.get("FromUserName");

       String toUserName = map.get("ToUserName");

       String msgType = map.get("MsgType");

       String content = map.get("Content");

      

       String message = null;

       if("text".equals(msgType)){//判断是不是文本消息

           TextMessage textMessage = new TextMessage();

           textMessage.setFromUserName(toUserName);//注意从哪里发出就要发给谁,反的

           textMessage.setToUserName(fromUserName);

           textMessage.setMsgType("text");

           textMessage.setCreateTime(new Date().getTime());

           textMessage.setContent("您发送的消息是"+content);

           message = MessageUtil.textMessageToXml(textMessage);

      System.out.println(message);

           MinaClient.sendMinaMessage(content);//发送数据

          

       }

       out.print(message);//注意要返回给微信服务器

       out.close();

}

到此基本接入已经完成。

 

可以回复的消息类型:

 

因此我们在消息工具类(MessageUtil)建立各种消息类型的常量:

// 消息类型常量

    public static final String MESSAGE_TEXT = "text";

    public static final String MESSAGE_IMAGE = "image";

    public static final String MESSAGE_VOICE = "voice";

    public static final String MESSAGE_VIDEO = "video";

    public static final String MESSAGE_LINK = "link";

    public static final String MESSAGE_LOCATION = "location";

    public static final String MESSAGE_EVENT = "event";

    public static final String MESSAGE_SUBSCRIBE = "subscribe";// 关注

    public static final String MESSAGE_UNSUBSCRIBE = "unsubscribeun";// 取消关注

    public static final String MESSAGE_CLICK = "CLICK";// 点击事件

public static final String MESSAGE_VIEW = "VIEW";

 

第九步:对每次发送的消息进行封装

// 将消息接收封装

    public static String initText(String toUserName, String fromUserName, String content) {

       TextMessage textMessage = new TextMessage();

       textMessage.setFromUserName(toUserName);// 注意从哪里发出就要发给谁,反的

       textMessage.setToUserName(fromUserName);

       textMessage.setMsgType(MessageUtil.MESSAGE_TEXT);

       textMessage.setCreateTime(new Date().getTime());

       textMessage.setContent(content);

       return textMessageToXml(textMessage);

}

下面只有有消息就封装成content作为initText的参数传给微信服务器即可。

  1. 封装关注时候的消息

    // 关注的时候触发的菜单

    public static String onSubscribeMenuText() {

       StringBuffer sb = new StringBuffer();

       sb.append("终于等到你,还好我没放弃!\n");

       sb.append("请按照菜单提示操作:\n\n");

       sb.append("1.南泰简介\n");

       sb.append("2.功能介绍\n");

       sb.append("回复?调出此菜单");

       return sb.toString();

}

  1. 封装菜单消息

    public static String njusttzIntroduceText() {// 1返回南泰介绍

       StringBuffer sb = new StringBuffer();

       sb.append("南京理工大学泰州科技学院由国家首批“211工程重点建设院校——南京理工大学与泰州市人民政府于2004年合作创办," + "是一所以工为主,工、经、管、文、艺等多学科综合配套、协调发展的全日制本科高校。学校围绕建设特色鲜明的高水平应用技术大学的奋斗目标,坚持明体达用的教育理念,秉持帮助学生发挥优势潜能的育人宗旨,培养高层次技术与管理人才。学校被教育部吸纳为全国CDIO工程教育改革试点高校,被誉为工程师的摇篮");

       return sb.toString();

    }

    public static String accountIntroduceText() {// 2返回公众号功能介绍

       StringBuffer sb = new StringBuffer();

       sb.append("具体功能正在上线的途中...");

       return sb.toString();

    }

    public static String menuReturnText() {//回复?时候返回

       StringBuffer sb = new StringBuffer();

       sb.append("请按照菜单提示操作:\n\n");

       sb.append("1.南泰简介\n");

       sb.append("2.功能介绍\n");

       sb.append("回复?调出此菜单");

return sb.toString();

}

 

  1. 修改Servlet的Post部分代码

至此,微信开发初级阶段就全部完成,如果需要公网运行,可以架设到百度BAE中。

百度BAE需要购买服务,使用SVN上传发布,切记更换了服务器后需要更换百度公众平台里的Servlet地址。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值