第五章 微信公众号开发之关注事件

当我们利用服务器和代码成为高级开发之后,微信公众平台编辑好的当用户关注时发送给用户的语句就会失效,此时应该怎么办,接下来,用代码来来教你实现。首先先看一下官方的开发文档:

关注/取消关注事件

用户在关注与取消关注公众号时,微信会把这个事件推送到开发者填写的URL。方便开发者给用户下发欢迎消息或者做帐号的解绑。为保护用户数据隐私,开发者收到用户取消关注事件时需要删除该用户的所有信息。

微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。

关于重试的消息排重,推荐使用FromUserName + CreateTime 排重。

假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。

推送XML数据包示例:

<xml><ToUserName>< ![CDATA[toUser] ]></ToUserName><FromUserName>< ![CDATA[FromUser] ]></FromUserName><CreateTime>123456789</CreateTime><MsgType>< ![CDATA[event] ]></MsgType><Event>< ![CDATA[subscribe] ]></Event></xml>

参数说明:

参数 描述
ToUserName 开发者微信号
FromUserName 发送方帐号(一个OpenID)
CreateTime 消息创建时间 (整型)
MsgType 消息类型,event
Event 事件类型,subscribe(订阅)、unsubscribe(取消订阅)

根据开发文档书写代码如何:

1.先创建实体类:

public class TextMessage {


    private  String ToUserName;

    private  String FromUserName;

    private  Long CreateTime;

    private  String MsgType;

    private  String Content;

    public String getContent() {
        return Content;
    }

    public void setContent(String content) {
        Content = content;
    }

    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 Long getCreateTime() {
        return CreateTime;
    }

    public void setCreateTime(Long createTime) {
        CreateTime = createTime;
    }

    public String getMsgType() {
        return MsgType;
    }

    public void setMsgType(String msgType) {
        MsgType = msgType;
    }
}

2.检验类型:

public class MessageImpl {


    public String messgage(Map<String,String> requestMap){

        String textMsgXml = "";

         if (requestMap.size()>0) {

            String fromUserName = requestMap.get("FromUserName");
            // 公众帐号
            String toUserName = requestMap.get("ToUserName");
            // 消息类型
            String msgType = requestMap.get("MsgType");

            String eventKey = requestMap.get("EventKey");

            String event = requestMap.get("Event");
               3 if (event.equals("subscribe")) {
                 TextMessage textMessage = new TextMessage();
                textMessage.setToUserName(fromUserName);
                textMessage.setFromUserName(toUserName);
                textMessage.setCreateTime(new Date().getTime());
                textMessage.setMsgType("text");
                textMessage.setContent("你好");
                XStream xStream = new XStream();
                xStream.alias("xml", textMessage.getClass());
                textMsgXml = xStream.toXML(textMessage);
             }
         }
        return textMsgXml;
    }
}

3.获取微信服务器发来的信息:

@RequestMapping(value = "/signature")
@ResponseBody
public  String xmlToMap(HttpServletRequest request,@RequestParam String signature, @RequestParam String timestamp,
                        @RequestParam String nonce) {
    Map<String, String> map = new HashMap<String, String>();
    try {
        SAXReader reader = new SAXReader();
        InputStream ins = null;
        try {
            ins = request.getInputStream();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        Document doc = null;
        try {
            doc = reader.read(ins);
        } catch (DocumentException e1) {
            e1.printStackTrace();
        }
        Element root = doc.getRootElement();
        @SuppressWarnings("unchecked")
        List<Element> list = root.elements();
        for (Element e : list) {
            map.put(e.getName(), e.getText());
        }
        try {
            ins.close();
        } catch (IOException e1) {
            e1.printStackTrace();
        }
    }catch (Exception e){

        PlatformLogger.error("错误信息",e);
    }

    return messageImpl.messgage(map);

}

这样有人关注的时候你可以自定义发送的语句了

猜你喜欢

转载自blog.csdn.net/godhexin/article/details/81084812