微信公众号开发学习(二)接收用户消息与回复用户消息

1. 接收用户消息

经过(一)之后,我们完成了微信公众号的接入校验(get方式)。

我们在 WeChatService 这个类下创建parseRequest方法,用于读取用户发送的消息(用户发送的消息,发送到了微信服务器,微信服务器转换为xml格式发送到我们自己的服务器)。

    //读取微信服务器转发的xml消息
    public static Map<String, String> parseRequest(InputStream is){
        Map<String, String> map = new HashMap<>();
        SAXReader reader = new SAXReader();
        try{
            //读取输入流,获取文档对象
            Document document = reader.read(is);
            //根据文档对象获取根节点
            Element root = document.getRootElement();
            //获取根节点的所有子节点
            List<Element> elements = root.elements();
            for(Element e:elements){
                map.put(e.getName(),e.getStringValue());
            }
        }catch (DocumentException e){
            e.printStackTrace();
        }
        return map;
    }

经由该方法,我们将xml String 数据转换为Map格式的数据。

2.回复用户消息

我们创建msg对象。

BaseMessage(各个实现类message的父类):

@XStreamAlias("xml")
public class BaseMessage {

    @XStreamAlias("ToUserName")
    private String toUserName;
    @XStreamAlias("FromUserName")
    private String fromUserName;
    @XStreamAlias("CreateTime")
    private String createTime;
    @XStreamAlias("MsgType")
    private String msgType;

    public BaseMessage(Map<String,String> requestMap){
        this.toUserName = requestMap.get("FromUserName");
        this.fromUserName = requestMap.get("ToUserName");
        this.createTime = System.currentTimeMillis()/1000 + " ";
    }


    public String getToUserName() {
        return toUserName;
    }

    public void setToUserName(String toUserName) {
        this.toUserName = toUserName;
    }

    public String getFromUserName() {
        return fromUserName;
    }

    public void setFromUserName(String fromUserName) {
        this.fromUserName = fromUserName;
    }

    public String getCreateTime() {
        return createTime;
    }

    public void setCreateTime(String createTime) {
        this.createTime = createTime;
    }

    public String getMsgType() {
        return msgType;
    }

    public void setMsgType(String msgType) {
        this.msgType = msgType;
    }

    @Override
    public String toString() {
        return "BaseMessage{" +
                "toUserName='" + toUserName + '\'' +
                ", fromUserName='" + fromUserName + '\'' +
                ", createTime='" + createTime + '\'' +
                ", msgType='" + msgType + '\'' +
                '}';
    }
}

TextMessage

@XStreamAlias("xml")
public class TextMessage extends BaseMessage{

    @XStreamAlias("Content")
    private String content;

    public TextMessage(Map<String,String> requestMap,String content){
        super(requestMap);//toUserName fromUserName createTime
        this.setMsgType("text");// MsgType
        this.content = content;// content
    }


    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    @Override
    public String toString() {
        return "TextMessage{" +
                "content='" + content + '\'' +
                "} " + super.toString();
    }
}

其余的 ImageMessage、VideoMessage等实现类类似于TextMessage,这里就不写了。

我们需要编写一个能够处理解析经由parseRequest方法得到的Map数据的方法如下:

    public static String getResponse(Map<String,String> requestMap){
        BaseMessage msg = null;
        String msgType = requestMap.get("MsgType");

        switch(msgType){
            case "text"://用户发送到公众号的消息类型若为text,执行该case
                msg = dealTextMessage(requestMap);
                break;
            case "image":
                msg = dealImageMessage(requestMap);
                break;
            case "voice":

                break;
            case "video":

                break;
            case "shortvideo":

                break;
            case "location":

                break;
        }

        System.out.println("公众号要发送的原始数据:");
        System.out.println(msg);

        if(msg != null){
            return ObjToXml.change(msg);
        }else{
            return null;
        }
    }





    private static BaseMessage dealImageMessage(Map<String, String> requestMap) {
//        ImageMessage imageMessage = new ImageMessage(requestMap, "")
        return  null;
    }

    private static BaseMessage dealTextMessage(Map<String, String> requestMap) {
        TextMessage textMessage = new TextMessage(requestMap,"真帅!");
        return  textMessage;
    }

这里只写了text 消息 的回复处理。
上述代码中 ObjToXml.change方法是用于将 对象 类型的数据转换为 xml格式。
xml格式用于发送给微信服务器。

public class ObjToXml {

    public static String change(BaseMessage msg){
        XStream xStream = new XStream();
        String xml = null;

        xStream.processAnnotations(TextMessage.class);
        xStream.processAnnotations(ImageMessage.class);
        xStream.processAnnotations(VideoMessage.class);
        xStream.processAnnotations(VoiceMessage.class);

        xml = xStream.toXML(msg);

        return xml;
    }
}

控制回复的Controller如下:

    //消息的处理 post
    @RequestMapping(value="/test1",method= RequestMethod.POST)
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //处理消息和事件推送
        response.setCharacterEncoding("UTF-8");
        Map<String,String> requestMap = WeChatService.parseRequest(request.getInputStream());
        System.out.println("POST");
        System.out.println("公众号接收的:");
        System.out.println(requestMap);

        //准备回复的数据包
        String responseXml = WeChatService.getResponse(requestMap);
        System.out.println("公众号转换后发送的:");
        System.out.println(responseXml);
        PrintWriter out = response.getWriter();
        out.print(responseXml);
        out.flush();
        out.close();
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值